欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

scrapy服务化持久运行

程序员文章站 2022-06-15 17:38:16
如果要将scrapy做成服务持久运行,通常我们会尝试下面的方式,这样是不可行的: class myspider(scrapy.Spider): q = queue() #task queue, receive pending task. def start_requests(self): while ......

如果要将scrapy做成服务持久运行,通常我们会尝试下面的方式,这样是不可行的:

class myspider(scrapy.spider):

  q = queue()         #task queue, receive pending task.

  def start_requests(self):

    while true:

      task = q.get()       #get a task from queue

                     yield scrapy.request(task['url'], self.parse)

 

这是由于scrapy使用的异步框架,会尝试在start_request这一步时,先将所有的任务缓存到内部的缓冲区,然后再对全部的任务逐一处理,而这里while true会导致start_request这一步永远无法结束。

scrapy在执行完任务后会进入idle挂起状态,然后退出,并且允许我们捕获这些信号(也可以定义自己的信号),在进入挂起/退出前执行我们设置的回调。具体有哪些预置信号,查看官方文档。

这里捕获idle信号,在挂起前获取下一个任务即可。

from scrapy import spider, request, signals

class myspider(scrapy.spider):

  q = queue()

  @classmethod

  def from_crawler(cls, crawler):

    spider = super(myspider, cls).from_crawler(crawler)                           

    crawler.signals.connect(spider.spider_idle, signals.spider_idle)          

  def spider_idle(self, spider):

    task = q.get()

    self.crawler.engine.crawl(request(task['url']), self)