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