在脚本中运行scrapy X小时?

时间:2016-11-25 15:41:30

标签: scrapy scrapy-spider

有没有办法将scrapy作为bash脚本的一部分运行,并且只运行一段时间? 也许在X小时后模拟Ctrl-C + Ctrl-C?

2 个答案:

答案 0 :(得分:0)

您可以使用GNU timeout命令执行此操作。

例如,要在1小时后停止抓取:

timeout 3600 scrapy crawl spider_name

答案 1 :(得分:0)

Scrapy提供CLOSESPIDER_TIMEOUT选项,可在指定时间段后停止抓取。

虽然这不是硬限制--Scrapy仍会处理它已经下载的所有请求,但它不会从调度程序获取新请求;换句话说,CLOSESPIDER_TIMEOUT模拟Ctrl-C,而不是Ctrl-C + Ctrl-C,并尝试优先停止蜘蛛。这通常不是一个坏主意,因为杀死蜘蛛可能例如保留导出的数据文件。

蜘蛛活着多少额外时间取决于网站和重试&并发设置。默认DOWNLOAD_TIMEOUT是180s;请求可以重试最多2次,这意味着每个请求可能需要约10分钟才能完成最坏的情况。 CONCURRENT_REQUESTS默认为16,因此下载程序中最多有16个请求,但可以根据您的抓取内容并行下载这些请求。 Autothrottle或CONCURRENT_REQUESTS_PER_DOMAIN选项可能会限制单个域并行执行的请求数。

因此,在绝对最糟糕的情况下(顺序下载,所有请求都没有响应并重试2次)蜘蛛可以使用默认设置挂起~3小时。但通常在实践中这段时间要短得多,几分钟。因此,您可以将CLOSESPIDER_TIMEOUT设置为一个值,例如比X小时少20分钟,然后使用额外的主管(如@lufte建议的GNU超时)实现硬超时,如果关机时间超长则杀死蜘蛛。