【问题标题】:How to keep Scrapy Crawler running如何保持 Scrapy Crawler 运行
【发布时间】: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


【解决方案1】:

除非您详细说明“更连续”是什么意思,否则我能想到的使 quoted response 的代码更连续的唯一方法是将 5 替换为延迟代码中的 0

【讨论】:

【解决方案2】:

使用调度器

# -*- coding: utf-8 -*-
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from apscheduler.schedulers.twisted import TwistedScheduler

from Demo.spiders.google import GoogleSpider # your spider

process = CrawlerProcess(get_project_settings())
scheduler = TwistedScheduler()
scheduler.add_job(process.crawl, 'interval', args=[GoogleSpider], seconds=10)
scheduler.start()
process.start(False)

【讨论】:

  • 在回答一个老问题或任何一般性问题时,如果您可以为您的回答提供一些上下文而不是主要是代码,那就太好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多