如何保持Scrapy Crawler的运行

时间:2019-01-20 08:29:54

标签: scrapy web-crawler twisted scrapy-spider

我目前有一个只能运行一次的Scrapy搜寻器。我一直在寻找一种解决方案,以使其不断重复其爬网周期,直到停止为止。

换句话说,爬网的第一次迭代完成后,将自动开始第二次迭代,而不会停止整个爬网程序,此后第三次迭代,依此类推。另外,也许我会在x秒后再次运行,尽管我不确定系统在前一个抓取过程未完成而又尝试启动另一个迭代的情况下会如何反应。

到目前为止,我在网上找到的解决方案仅涉及我不感兴趣的cron或scrapyd。我对使用诸如CrawlerRunner或Reactor之类的履带项目实现自定义调度程序更感兴趣。有人有几个指针吗?

来自另一个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'成员”, “ source”:“ pylint”,

更新 How to schedule Scrapy crawl execution programmatically

试图实现此功能,但无法导入我的蜘蛛,但出现模块未找到错误。反应堆变量也带有错误的红色,并说模块'twisted.internet.reactor'没有'callLater'成员///////没有'run'成员。

2 个答案:

答案 0 :(得分:0)

除非您详细说明“更连续”的含义,否则我想使quoted response的代码更连续的唯一方法是将5替换为0在延期。

答案 1 :(得分:0)

使用apscheduler

# -*- 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)