请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

scrapy+redis,抓取结束后,程序一直处于等待状态

我们在运行 scrapy 的 spider 之后,然后在控制台输入 redis-cli 代码,scrapy 就开始抓取数据并保存到 redis数据库,当数据抓取完成之后,控制台一直处于等待状态,如何让Scrapy 在抓取完数据之后,自动结束,同时在结束之后调用其它Python代码呢?谢谢。

正在回答 回答被采纳积分+3

2回答

提问者 笑看风云号 2017-07-13 10:27:34
    def post_news(self,spider):
        # print("当前蜘蛛的 redis_key :" , spider.redis_key)
        # print("当前蜘蛛的 name :" , spider.name)

        key_requests = spider.redis_key.split(":")[0] + ":requests"
        requests_len = self.conn.zcard(key_requests)

        key_start_urls = spider.redis_key.split(":")[0] + ":start_urls"
        start_urls_len = self.conn.llen(key_start_urls)

        if requests_len == 0 and start_urls_len == 0 :
            print("爬虫处于等待状态 开始")
			……执行代码……
            print("爬虫处于等待状态 结束")
            end_time = datetime.datetime.now().strftime(SQL_DATETIME_FORMAT)
            print("采集开始时间:", spider.start_time)
            print("采集结束时间:", end_time)

首先在 spider 空闲的时候 执行该函数,然后在该函数里面读取 redis 服务器里面对应的 start_urls 和 requests 列表的长度,当  start_urls 和 requests 列表的长度等于 0 的时候 我就执行代码,如果不为 0  就不执行,不知道你说的 “用redis的命令判断request队列的长度”的代码是否是这样实现的呢?或者 说有别的更方便的实现方式呢?能否贴下参考代码???

0 回复 有任何疑惑可以回复我~
bobby 2017-07-12 09:59:28

这里我有个疑惑 为什么要让爬虫结束呢? 如果队列为空爬虫就会一直等着队列有数据就直接开始爬取, 这样不是很好么, 停止爬虫有什么好处呢

如果一定要爬虫停止可以修改一下源码中从request队列中取数据的逻辑修改为判断队列是否为空, 如果为空几秒再判断一下如果还是为空就直接退出爬虫就行了

0 回复 有任何疑惑可以回复我~
  • 提问者 笑看风云号 #1
    我在下面写了一个扩展,用来判断 spider 是否处于空闲状态,但是这样我觉得还不够,我觉得应该继续判断 request 队列是否为空,但是 判断 request 队列是否为空的代码如何写呢?
    回复 有任何疑惑可以回复我~ 2017-07-13 10:27:24
  • bobby 回复 提问者 笑看风云号 #2
    判断为空很简单啊 直接使用redis的命令判断request队列的长度啊
    回复 有任何疑惑可以回复我~ 2017-07-14 09:14:03
  • 提问者 笑看风云号 回复 bobby #3
    我现在贴上自己写的代码,麻烦老师看看是否合理。谢谢。
    回复 有任何疑惑可以回复我~ 2017-07-14 09:51:56
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信