gpt4 book ai didi

python - 在 Python 中运行 Scrapy 任务

转载 作者:太空狗 更新时间:2023-10-29 18:28:18 25 4
gpt4 key购买 nike

当我从命令行在“一次性”场景中运行我的 Scrapy 脚本时,它似乎工作得很好,但是如果我尝试在同一个 python session 中运行代码两次,我会收到此错误:

“ReactorNotRestartable”

为什么?

有问题的代码(最后一行抛出错误):

crawler = CrawlerProcess(settings)
crawler.install()
crawler.configure()

# schedule spider
#crawler.crawl(MySpider())
spider = MySpider()
crawler.queue.append_spider(spider)

# start engine scrapy/twisted
crawler.start()

最佳答案

接近 Joël 的回答,但我想在评论中详细说明。如果您查看 Crawler source code ,您会看到 CrawlerProcess 类有一个 start,还有一个 stop 函数。此 stop 函数负责清理爬行的内部结构,以便系统在可以重新启动的状态下结束。

因此,如果您想在不离开您的进程的情况下重新开始抓取,请在适当的时候调用crawler.stop()。稍后,只需再次调用 crawler.start() 即可恢复操作。

编辑:回想起来,这是不可能的(由于 Twisted react 堆,如另一个答案中所述); stop 只负责干净终止。回顾我的代码,我碰巧有一个 Crawler 进程的包装器。您可以在下面找到一些(编辑过的)代码,以使其使用 Python 的多处理模块工作。通过这种方式,您可以更轻松地重启爬虫。 (注意:我上个月在网上找到了代码,但我没有包括源代码...所以如果有人知道它来自哪里,我会更新源代码。)

from scrapy import project, signals
from scrapy.conf import settings
from scrapy.crawler import CrawlerProcess
from scrapy.xlib.pydispatch import dispatcher
from multiprocessing.queues import Queue
from multiprocessing import Process

class CrawlerWorker(Process):
def __init__(self, spider, results):
Process.__init__(self)
self.results = results

self.crawler = CrawlerProcess(settings)
if not hasattr(project, 'crawler'):
self.crawler.install()
self.crawler.configure()

self.items = []
self.spider = spider
dispatcher.connect(self._item_passed, signals.item_passed)

def _item_passed(self, item):
self.items.append(item)

def run(self):
self.crawler.crawl(self.spider)
self.crawler.start()
self.crawler.stop()
self.results.put(self.items)

# The part below can be called as often as you want
results = Queue()
crawler = CrawlerWorker(MySpider(myArgs), results)
crawler.start()
for item in results.get():
pass # Do something with item

关于python - 在 Python 中运行 Scrapy 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7993680/

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