gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:19:01 25 4
gpt4 key购买 nike

所以,我创建了这个类,以便我可以使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com