【发布时间】:2019-01-20 08:29:53
【问题描述】:
我目前有一个运行一次的 Scrapy 爬虫。我一直在寻找一种解决方案,让它不断重复它的爬行周期,直到它停止。
换句话说,一旦爬网的第一次迭代完成,在不停止整个爬虫的情况下自动开始第二次迭代,然后是第三次迭代,依此类推。此外,可能会在 x 秒后再次运行,尽管我不确定在先前的爬取过程未完成同时还尝试启动另一个迭代的情况下系统将如何反应。
到目前为止,我在网上找到的解决方案仅涉及我不感兴趣的 cron 或 scrapyd。我更感兴趣的是使用 CrawlerRunner 或反应器等进程在爬虫项目中实现自定义调度程序。有没有人指点一二?
来自另一个 stackoverflow 问题的以下代码是我找到的关于我的问题的最接近的信息,但我正在寻找一些关于如何实施更连续方法的建议。
+ from twisted.internet import reactor, defer
+ from scrapy.crawler import CrawlerRunner
+ from scrapy.utils.log import configure_logging
+ def run_crawl():
+ """
+ Run a spider within Twisted. Once it completes,
+ wait 5 seconds and run another spider.
+ """
+ runner = CrawlerRunner(get_project_settings())
+ runner.crawl(SpiderA)
+ runner.crawl(SpiderB)
+ deferred = runner.join()
+ deferred.addCallback(reactor.callLater, 5, run_crawl)
+ return deferred
+ run_crawl()
+ reactor.run()
错误: "message": "模块 'twisted.internet.reactor' 没有 'run' 成员", “来源”:“pylint”,
更新 How to schedule Scrapy crawl execution programmatically
试图实现这一点,但无法导入我的蜘蛛,我得到模块未找到错误。反应堆变量也是红色的错误,并说模块'twisted.internet.reactor'没有'callLater'成员//////或没有'运行'成员。
【问题讨论】:
-
您未能链接到您从中复制代码的问题,但您的
run_crawl返回的deferred被丢弃是非常可疑 -
关于延迟的,它不会被丢弃,因为在函数结束时反应器已经将它排队。因此,我认为 return 语句一开始就不应该存在。
-
如果你想按时运行,你需要
cron -
我更感兴趣的是让它像我在原始帖子中所说的那样在完成后重新启动它的原始 url 请求。所以基本上,开始请求 -> 解析 -> 再次开始请求 -> 解析,在我手动执行之前不停止蜘蛛,有什么想法吗?
标签: scrapy web-crawler twisted scrapy-spider