因此,我制作了此类,以便可以使用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

根据我的收集,这是因为反应堆停止后无法运行。有什么解决方法吗?

谢谢!

最佳答案

这是目前scrapy(twisted)的一种局限性,因此很难使用scrapy作为lib。

您可以做的是派生一个新进程,该进程将运行搜寻器并在搜寻完成后停止反应器。然后,您可以等待加入并在爬网完成后生成新进程。如果要处理主线程中的项目,可以将结果发布到队列中。我还是建议您为项目使用自定义管道。

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

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

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

10-12 22:24