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

来源:17-1 课程总结

笑看风云号

2017-07-12

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

写回答

2回答

笑看风云号

提问者

2017-07-13

    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
0

bobby

2017-07-12

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

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

0
4
bobby
回复
笑看风云号
我看了一下 你的代码逻辑是没有问题的, 你现在可以测试一下 看看这个逻辑是否正确
2017-07-17
共4条回复

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

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

5796 学习 · 6290 问题

查看课程