当前位置:  开发笔记 > 编程语言 > 正文

在Python中运行Scrapy任务

如何解决《在Python中运行Scrapy任务》经验,为你挑选了1个好方法。



1> jro..:

接近Joël的答案,但我想在评论中详细说明.如果你查看Crawler源代码,你会发现CrawlerProcess该类有一个start,但也有一个stop函数.此stop功能负责清理爬行的内部,以便系统最终处于可以再次启动的状态.

因此,如果您想在不离开流程的情况下重新启动抓取,请crawler.stop()在适当的时候致电.稍后,只需crawler.start()再次呼叫即可恢复运营.

编辑:回想起来,这是不可能的(由于扭曲的反应堆,如不同答案中所述); 在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


我猜你在这里发现了它...... http://www.tryolabs.com/Blog/2011/09/27/calling-scrapy-python-script/
推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有