scrapy 提供的调试方法
scrapy shell 调试选择器
命令行调试 spider
web 控制台(运行时)
telnet 控制台(运行时查看scrapy对象,检测检测内存泄漏问题)
scrapy shell 调试选择器
可以在命令行直接启动 scrapy shell,在shell中导入scrapy内置的方法,可以对抓取的内容进行查看。
# 启动 shell,抓取豆瓣本周音乐人最热单曲榜
scrapy shell
# 使用scrapy内置的选择器,通过 xpath 获取榜单的音乐名称
In [1]: musicNames=sel.xpath('//div[@class="article"]//div[@class="intro"]//a/text()').extract()
# 打印歌曲名称
In [16]: for i in musicNames: print i
# 以下内容为上面选择器命令的输出
Hello,I Love You 2014
欢迎你来大工厂demo
合欢
才华有限公司
另一个自己
Dear Mama Remix
西兰花
Now it's a brave time_New versions Mini Maton
四月挽歌
《快了个播》词:HK&拖鞋
去远方(demo)想当年(正式版)
爱情
请你嫁给我
星河小夜曲
Pi的奇幻之旅 demo
杂念 - Sleepy Cat(beat by Mr.积).
走在通往明天的路上
(路)
命令行调试 spider
写一个抓取豆瓣音乐排行榜的 spider。
from scrapy.spider import Spider
from scrapy.selector import Selector
from douban.items import DoubanItem
class MySpider(Spider):
name = 'myspider'
allowed_domains = ["douban.com"]
start_urls = (
'http://music.douban.com/chart',
)
def parse(self, response):
sel = Selector(response)
musicNames = sel.xpath('//div[@class="article"]//div[@class="intro"]//a/text()').extract()
for musicName in musicNames:
item = DoubanItem()
item['musicName'] = musicName
yield item
# 命令行指定蜘蛛抓取起始的 url,输出抓取的解析信息
scrapy parse --spider=MySpider -d 3 http://music.douban.com/chart
# 输出的内容(中文名称是unicode编码)
>>> STATUS DEPTH LEVEL 1 <<<
# Scraped Items -------------------------------------------------
[{'musicName': u'Hello,I Love You 2014'},
{'musicName': u'\u6b22\u8fce\u4f60\u6765\u5927\u5de5\u5382demo'},
{'musicName': u'\u5408\u6b22'},
{'musicName': u'\u624d\u534e\u6709\u9650\u516c\u53f8'},
{'musicName': u'\u53e6\u4e00\u4e2a\u81ea\u5df1'},
{'musicName': u'Dear Mama Remix'},
{'musicName': u'\u897f\u5170\u82b1'},
{'musicName': u"Now it's a brave time_New versions Mini Maton"},
{'musicName': u'\u56db\u6708\u633d\u6b4c'},
{'musicName': u'\u300a\u5feb\u4e86\u4e2a\u64ad\u300b\u8bcd\uff1aHK&\u62d6\u978b'},
{'musicName': u'\u53bb\u8fdc\u65b9(demo)'},
{'musicName': u'\u60f3\u5f53\u5e74\uff08\u6b63\u5f0f\u7248\uff09'},
{'musicName': u'\u7231\u60c5'},
{'musicName': u'\u8bf7\u4f60\u5ac1\u7ed9\u6211'},
{'musicName': u'\u661f\u6cb3\u5c0f\u591c\u66f2'},
{'musicName': u'Pi\u7684\u5947\u5e7b\u4e4b\u65c5 demo'},
{'musicName': u' '},
{'musicName': u'\u6742\u5ff5 - Sleepy Cat(beat by Mr.\u79ef).'},
{'musicName': u'\u8d70\u5728\u901a\u5f80\u660e\u5929\u7684\u8def\u4e0a'},
{'musicName': u'\uff08\u8def\uff09'}]
# Requests -----------------------------------------------------
[]
web service 控制接口接单介绍
所有 web 接口使用 JSON-RPC 2.0 协议,可以在监控系统中通过 API 集成 scrapy 的状态信息。
控制爬虫进程:http://localhost:6080/crawler
查看爬虫的状态:http://localhost:6080/stats
还可以自定义查看引擎状态等接口
具体看 scrapy文档
telnet 控制台(运行时查看scrapy对象,检测内存泄漏问题)
这个最好选用 Scrapy 0.22.2 之后的版本
scrapy默认打开6023端口,telnet 连接这个端口,可以查看scrapy运行状态
telnet localhost 6023# 查看对象引用情况
>>> prefs()Live References
ExampleSpider 1 oldest: 15s ago
HtmlResponse 10 oldest: 600s ago
Selector 2 oldest: 0s ago
FormRequest 878 oldest: 7s ago
# 上面HtmlResponse已经存在10分钟,比较可疑,查看最长时间的HtmlResponse对象
>>> from scrapy.utils.trackref import get_oldest
>>> r = get_oldest('HtmlResponse')
>>> r.url
'
# 后面就是看代码,解决为什么上面的url对应的对象没有销毁
我在项目中使用过这个技巧,查看过下载器的队列内容,engine的状态信息,对于调试还是比较有帮助的。
来源:oschina
链接:https://my.oschina.net/u/1579041/blog/268623