Scrapy-Redis爬虫启动后,是如何做到进程不Close的

来源:10-8 scrapy-redis源码分析- scheduler.py、spider.py-

慕尼黑7546459

2020-01-15

老师,直接使用Scrapy的话,在爬虫执行结束后,会被close, 最后的日志基本像这样:

2020-01-15 11:36:51 [scrapy.core.engine] INFO: Spider closed
(finished)

那么,scrapy-redis 是在哪里实现,当没有爬取任务的时候,进程不被关闭的呢?

另外,关于scrapy-redis, 还有几个疑问,顺便请教下老师

1、如果不需要去修改源代码进行扩展,是不是可以通过:pip install scrapy-redis 安装就行,而不需要将源码集成到项目中啊? (这个我看文档是支持直接 install 和下载源码 2种方式的)

2、当往队列发布start_urls的消息后, scrapy是如何实时监听到消息的(中间可能没有执行任务,当往队列push url, 能实时监听到),这个我在源码中一直没找到

写回答

2回答

bobby

2020-01-19

你下面虽然问题比较多,但是都可以归到一个函数上 //img.mukewang.com/szimg/5e23d098096aa03f15360696.jpg,每次获取下一个url都是这行代码完成的,你只要搞清楚这里的queue是怎么初始化的以及获取的时候是从哪里获取的就知道怎么办了

0
0

bobby

2020-01-15

scrapy-redis不会关闭,因为scrapy会一直等待redis返回数据,如果一直没有返回会一直阻塞住,如果想关闭可以改一下源码,把从redis中获取数据设置一个timeout,如果超时没有获取到数据就发送一个关闭spider的信号就行了

  1. 通过pip安装没有问题,。但是我个人更加建议直接配置源码,因为有可能你就得这个不够灵活需要修改源码,通过pip安装的源码你修改了放到线上就没法用了,基本上所有的python库都可以直接拷贝源码

  2. start_urls只有在启动的时候会去用,如果你要想push一个url不应该是push到这个队列而应该是url的队列

0
1
慕尼黑7546459
额,老师,我有几个地方还是不太明白。 1、scrapy-redis执行结束后,没有像scrapy关闭掉,这个我不是想关闭,我就是想了解原理。 老师上面回复的:“因为scrapy会一直等待redis返回数据,如果一直没有返回会一直阻塞住”, 这个逻辑是在哪里控制的啊? 2、我的业务需求:比如我想去豆瓣电影上爬取:战狼、奇幻森林、速度与激情8、我不是药神等电影(目的就是想爬啥才爬啥,想啥时候爬都行,不是一次性和全量爬取)。 我现在的做法是,往redis的start_urls 队列 lpush 这些电影的url(可能不是一下子放完,中间可能存在时间间隔)。 发现scrappy-redis爬虫项目服务启动后,都是能正常从这个队列里获取url并去爬取和执行的,我之前觉得这样就能满足我的需求了,但是老师你说应该push到url队列,我就有点懵了。 push到start_urls队列有什么问题吗? 难道start_urls只push一部电影的url, 其他的电影push到url队列? 3、scrappy-redis项目启动好之后,比如我现在往redis push 战狼的url, 过一会或几个小时甚至更长时间之后,push别的电影的url, 都是接收到这些url。 它的原理是什么呢, 通过轮训 或者 类型pub/sub 那种? 源码似乎是通过信号量,只是看懂大概: spiders.py中setup_redis()方法的这一行,然后触发spider_idle,进而触发next_requests(), 从start_url队列获取一些url: # The idle signal is called when the spider has no requests left, # that's when we will schedule new requests from redis queue crawler.signals.connect(self.spider_idle, signal=signals.spider_idle) 麻烦老师再帮忙解释一下,最好从源码的层面
2020-01-17
共1条回复

Scrapy打造搜索引擎 畅销4年的Python分布式爬虫课

带你彻底掌握Scrapy,用Django+Elasticsearch搭建搜索引擎

5795 学习 · 6290 问题

查看课程