当前位置: 移动技术网 > IT编程>脚本编程>Python > scrapy服务化持久运行

scrapy服务化持久运行

2019年12月06日  | 移动技术网IT编程  | 我要评论

金波旬花,任立佳,烧饼皇后结局

如果要将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)

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网