完成网页刮擦后,Scrapy蜘蛛无法终止

时间:2017-08-24 15:39:16

标签: python web-scraping scrapy scrapy-spider

我正在使用Scrapy运行蜘蛛,但在完成爬行后它似乎无法终止。日志统计信息只是递归地报告它正在以0页/分钟的速度进行抓取。当我尝试使用Ctrl-C退出时,它无法正常关闭,我必须再次使用Ctrl-C强行退出。有什么线索发生了什么?

完成刮擦之后,我得到这样的输出:

  

2017-08-24 11:13:45 [scrapy.extensions.logstats]信息:抓取60页(每分钟0页),刮下54项(0件/分)

     

2017-08-24 11:14:45 [scrapy.extensions.logstats]信息:抓取60页(每分钟0页),刮下54项(0件/分)

     

2017-08-24 11:15:45 [scrapy.extensions.logstats]信息:抓取60页(每分钟0页),刮掉54项(0件/分)

     

2017-08-24 11:16:45 [scrapy.extensions.logstats]信息:抓取60页(0页/分),刮掉54项(0件/分)

     

2017-08-24 11:17:45 [scrapy.extensions.logstats]信息:抓取60页(每分钟0页),刮下54项(0件/分)

     

2017-08-24 11:18:45 [scrapy.extensions.logstats]信息:抓取60页(每页0页),刮下54项(0件/分)

     

2017-08-24 11:19:45 [scrapy.extensions.logstats]信息:抓取60页(每分钟0页),刮掉54项(0件/分)

     

2017-08-24 11:20:45 [scrapy.extensions.logstats]信息:抓取60页(每分钟0页),刮掉54项(0件/分)

     

2017-08-24 11:21:45 [scrapy.extensions.logstats]信息:抓取60页(每分钟0页),刮掉54项(0件/分)

无限期地继续。

我的蜘蛛进入一个页面,其中包含多个页面上的链接列表。它访问第一页,提取链接(使用请求元技巧在链接后传递一些信息),然后转到下一页链接。

第二个解析器从各个页面中提取信息。

我没有看到任何错误消息,并且作业成功执行;它只是没有结束。这是一个问题,因为我想使用一个脚本来调用作业在不同的页面上运行多次(相同的结构,不同的信息),但是从第一个作业永远不会完成,我无法进入下一个一组页面刮。

parse(self, response)方法产生两种类型的信息。

  1. 对于页面上的每个链接,请访问该页面以提取更多信息。

    request = scrapy.Request(item['url'], callback=self.parse_transcript)
    request.meta['item'] = item
    yield request
    
  2. 如果有另一页链接,请使用正则表达式获取链接并将页码增加1。

    while data['count'] > 0:
        next_page = re.sub('(?<=page=)(\d+)', lambda x: str(int(x.group(0)) + 1), response.url) 
        yield Request(next_page)
    
  3. 编辑1: 感谢您的建议,我使用telnet扩展程序检查了引擎状态。我不知道如何解释这些信息。

    >>> est()
    Execution engine status
    
    time()-engine.start_time                        : 10746.1215799
    engine.has_capacity()                           : False
    len(engine.downloader.active)                   : 0
    engine.scraper.is_idle()                        : False
    engine.spider.name                              : transcripts
    engine.spider_is_idle(engine.spider)            : False
    engine.slot.closing                             : <Deferred at 0x10d8fda28>
    len(engine.slot.inprogress)                     : 4
    len(engine.slot.scheduler.dqs or [])            : 0
    len(engine.slot.scheduler.mqs)                  : 0
    len(engine.scraper.slot.queue)                  : 0
    len(engine.scraper.slot.active)                 : 4
    engine.scraper.slot.active_size                 : 31569
    engine.scraper.slot.itemproc_size               : 0
    engine.scraper.slot.needs_backout()             : False
    

    编辑2: 我尝试在链接到达链接末尾之后提出异常来关闭蜘蛛,但这过早地阻止了蜘蛛能够访问所有被废弃的链接。此外,在关闭蜘蛛后,发动机似乎仍然悬挂。

    while data['count'] > 0:
        next_page = re.sub('(?<=page=)(\d+)', lambda x: str(int(x.group(0)) + 1), response.url)
        yield Request(next_page)
    else:
        raise CloseSpider('End of transcript history has been reached.')
    

    编辑3: 我也尝试使用CLOSESPIDER_TIMEOUT扩展,但无济于事。蜘蛛似乎正常关闭,但发动机无限期地保持空转。

      

    2017-08-30 11:20:44 [scrapy.extensions.logstats]信息:抓取48页(每页9页),刮下42件(每件9件/分)

         

    2017-08-30 11:23:44 [scrapy.extensions.logstats]信息:抓取48页(每页0页),刮下42项(0件/分)

         

    2017-08-30 11:24:44 [scrapy.extensions.logstats]信息:抓取48页(每页0页),刮下42项(0件/分)

         

    2017-08-30 11:25:44 [scrapy.core.engine]信息:关闭蜘蛛(closespider_timeout)

         

    2017-08-30 11:25:44 [scrapy.extensions.logstats]信息:抓取48页(每页0页),刮下42项(0件/分)

         

    2017-08-30 11:28:44 [scrapy.extensions.logstats]信息:抓取48页(每页0页),刮下42项(0件/分)

         

    2017-08-30 11:29:44 [scrapy.extensions.logstats]信息:抓取48页(每分钟0页),刮下42项(0件/分)

         

    2017-08-30 11:32:44 [scrapy.extensions.logstats]信息:抓取48页(每页0页),刮下42项(0件/分)

         

    ^ C2017-08-30 11:33:31 [scrapy.crawler]信息:收到SIGINT,优雅地关闭。再次发送强制

         

    2017-08-30 11:41:44 [scrapy.extensions.logstats]信息:抓取48页(每分钟0页),刮下42项(0件/分)

         

    ^ C2017-08-30 11:45:52 [scrapy.crawler]信息:两次收到SIGINT,迫使不洁关机

0 个答案:

没有答案