返回介绍

12.13 强化爬虫

发布于 2024-01-26 22:39:51 字数 4926 浏览 0 评论 0 收藏 0

本节讲解一下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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文