我正在使用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)
方法产生两种类型的信息。
对于页面上的每个链接,请访问该页面以提取更多信息。
request = scrapy.Request(item['url'], callback=self.parse_transcript)
request.meta['item'] = item
yield request
如果有另一页链接,请使用正则表达式获取链接并将页码增加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)
编辑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,迫使不洁关机