12.13 强化爬虫
本节讲解一下Scrapy中的调试方法、异常和控制运行状态等内容,可以帮助我们更好地使用Scrapy编写爬虫。
12.13.1 调试方法
Scrapy中共有三种比较常用的调试技术:Parse命令、Scrapy shell和logging。下面以cnblogs爬虫为例讲解以上三种技术。
1.Parse命令
检查spider输出的最基本方法是使用Parse命令。这能让你在函数层上检查spider各个部分的效果,其十分灵活并且易用,不过不能在代码中调试。
查看特定url爬取到的item,命令格式为scrapy parse--spider=<spidename>-c<parse_item>-d 2<item_url>。在命令行中切换到项目目录下,输入scrapy parse--spider=cnblogs-c parse-d 2“http://www.cnblogs.com/qiyeboy/default.html?page=1 ”,效果如图12-13所示。
图12-13 parse命令
配合使用--verbose或-v选项,可以查看各个层次的详细状态。
2.Scrapy shell
尽管Parse命令对检查spider的效果十分有用,但除了显示收到的response及输出外,其对检查回调函数内部的过程并没有提供什么便利。这个时候可以通过scrapy.shell.inspect_response方法来查看spider的某个位置中被处理的response,以确认期望的response是否到达特定位置。在CnblogsSpider类中parse方法里添加两句代码:
def parse(self, response): # 实现网页的解析 # 首先抽取所有的文章 papers = response.xpath(".// *[@class='day']") # 从每篇文章中抽取数据 from scrapy.shell import inspect_response inspect_response(response, self) for paper in papers: url = paper.xpath(".// *[@class='postTitle']/a/@href").extract()[0] title = paper.xpath(".// *[@class='postTitle']/a/text()").extract()[0] time = paper.xpath(".// *[@class='dayTitle']/a/text()").extract()[0] content = paper.xpath(".// *[@class='postTitle']/a/text()").extract()[0] item = CnblogspiderItem(url=url,title=title,time=time,content=content) request = scrapy.Request(url=url,callback=self.parse_body) request.meta['item'] = item yield request next_page = Selector(response).re(u'<a href="(\S*)">下一页</a>') if next_page: yield scrapy.Request(url=next_page[0],callback=self.parse)
我们使用命令行执行程序时,当程序运行到inspect_response方法时会暂停,并切换进shell中,可以方便我们对当前的response进行调试,效果如图12-14所示。
图12-14 inspect_response方法使用
这时可以在shell中调试Xpath,或者查看当前响应内容。
如果调试完了,可以点击Ctrl-D来退出终端,恢复爬取,当程序再次运行到inspect_response方法时再次暂停,这样可以帮助我们了解每一个响应的细节。
3.logging
记录(logging)是另一个获取spider运行信息的方法。虽然不是那么方便,但好处是日志的内容在以后的运行中也可以看到。
以上就是Scrapy调试的三种方式,其实还有一种我比较喜欢的调试方式。首先将爬虫改写成API启动的方式,然后使用Pycharm打开整个爬虫项目,设置断点进行Debug调试,效果如图12-15所示。
图12-15 Debug调试
12.13.2 异常
下面是Scrapy提供的异常及其用法,如表12-1所示。
表12-1 Scrapy提供的异常及其用法
12.13.3 控制运行状态
Scrapy提供了内置的telnet终端,以供检查、控制Scrapy运行的进程。telnet终端是一个自带的Scrapy扩展。该扩展默认为启用,不过也可以关闭。
1.访问telnet终端
telnet终端监听设置中定义的TELNETCONSOLE_PORT默认为6023。Windows及大多数Linux发行版都自带了所需的telnet程序,所以访问本地Scrapy直接在命令行中输入:
telnet localhost 6023
2.telnet终端中可用的变量
为了方便,Scrapy telnet提供了一些默认定义的变量,如表12-2所示。
表12-2 telnet变量
3.使用示例
在终端中可以使用Scrapy引擎的est()方法来快速查看状态,示例如下:
>>> est() Execution engine status time()-engine.start_time : 424.530999899 engine.has_capacity() : False len(engine.downloader.active) : 16 engine.scraper.is_idle() : False engine.spider.name : jiandan engine.spider_is_idle(engine.spider) : False engine.slot.closing : False len(engine.slot.inprogress) : 18 len(engine.slot.scheduler.dqs or []) : 0 len(engine.slot.scheduler.mqs) : 1 len(engine.scraper.slot.queue) : 0 len(engine.scraper.slot.active) : 2 engine.scraper.slot.active_size : 160265 engine.scraper.slot.itemproc_size : 2 engine.scraper.slot.needs_backout() : False
暂停、恢复和停止Scrapy引擎:
·暂停:
>>> engine.pause() >>>
·恢复:
>>> engine.unpause() >>>
·停止:
>>> engine.stop() Connection closed by foreign host.
4.配置telnet
在Settings.py中配置IP和端口:
·TELNETCONSOLE_PORT:默认为[6023,6073],telnet终端使用的端口范围。如果设为None或0,则动态分配端口。
·TELNETCONSOLE_HOST:默认为’127.0.0.1‘,telnet终端监听的接口。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论