scrapy服务化持久运行
如果要将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)
上一篇: python如何编写win程序
下一篇: Java编程思想总结(一)对象导论
推荐阅读
-
重启redis服务数据丢失的问题(rdb与aof持久化策略)
-
Scrapy持久化存储
-
sentinel学习第一章:sentinel数据持久化到influxdb,实现流控和服务降级规则持久化到nacos,并实现推模式将规则推送到服务
-
scrapy服务化持久运行
-
爬虫--使用scrapy爬取糗事百科并在txt文件中持久化存储
-
JMS服务器ActiveMQ的初体验并持久化消息到MySQL数据库中.
-
JMS服务器ActiveMQ的初体验并持久化消息到MySQL数据库中.
-
linux - apache这种模块化模式运行服务器下 可以/有需要 装php-fpm吗?有效果吗?
-
redis被注入了crackit,但是我关闭了持久化存储功能,如何确定我的服务器是否被黑过?
-
linux - apache这种模块化模式运行服务器下 可以/有需要 装php-fpm吗?有效果吗?