zg手册 之 scrapy 开发(7)-- 爬虫调试

与世无争的帅哥 提交于 2019-11-29 03:22:39

scrapy 提供的调试方法

  1. scrapy shell 调试选择器

  2. 命令行调试 spider

  3. web 控制台(运行时)

  4. 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 的状态信息。

  1. 控制爬虫进程:http://localhost:6080/crawler

  2. 查看爬虫的状态:http://localhost:6080/stats

  3. 还可以自定义查看引擎状态等接口

具体看 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的状态信息,对于调试还是比较有帮助的。


zg手册 之 scrapy 开发(7)-- 爬虫调试

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!