python - Scrapy在长时间运行的过程中多次抓取

标签 python scrapy web-crawler reactor

所以,我创建了这个类,以便我可以使用 Scrapy 进行按需抓取:

from scrapy import signals
from scrapy.crawler import CrawlerProcess, Crawler
from scrapy.settings import Settings


class NewsCrawler(object):

    def __init__(self, spiders=[]):
        self.spiders = spiders
        self.settings = Settings()

    def crawl(self, start_date, end_date):
        crawled_items = []

        def add_item(item):
            crawled_items.append(item)

        process = CrawlerProcess(self.settings)

        for spider in self.spiders:
            crawler = Crawler(spider, self.settings)
            crawler.signals.connect(add_item, signals.item_scraped)
            process.crawl(crawler, start_date=start_date, end_date=end_date)

        process.start()

        return crawled_items

基本上,我有一个长时间运行的过程,我会多次调用上面类的 crawl 方法,如下所示:

import time


crawler = NewsCrawler(spiders=[Spider1, Spider2])

while True:
    items = crawler.crawl(start_date, end_date)
    # do something with crawled items ...
    time.sleep(3600)

问题是,第二次调用 crawl 时,会出现以下错误:twisted.internet.error.ReactorNotRestartable

据我了解,这是因为reactor停止后无法运行。有什么解决办法吗?

谢谢!

最佳答案

这是目前 scrapy(twisted) 的一个限制,使得使用 scrapy 作为库变得很困难。

您可以做的是创建一个新进程,该进程运行爬网程序并在爬网完成时停止 react 器。然后,您可以等待加入并在爬网完成后生成一个新进程。如果您想处理主线程中的项目,您可以将结果发布到队列中。不过,我建议您为您的项目使用定制的管道。

看看我的以下回答:https://stackoverflow.com/a/22202877/2208253

您应该能够应用相同的原则。但您宁愿使用多处理而不是台球。

关于python - Scrapy在长时间运行的过程中多次抓取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35289054/

相关文章:

python - 无法将文章插入 MySQL Python

list - 是否有已知的网络爬虫列表?

Python Flask 获取 404 未找到错误

python - 从其中一项的事件中清除 QGraphicsScene

Python 快速创建和删除目录会间歇性导致 WindowsError [错误 5]

nlp - 关于从 TripAdvisor 抓取数据的任何建议

javascript - 使用 Selenium 收集 Javascript 下拉菜单上的每个选项

python - 用Python挖掘海量数据集

python - 如何使用 PANDAS 插入数据和角度

python - Scrapy:从网站上抓取所有文本,但不抓取超链接的文本