数据采集: 让scrapy-redis的start_urls支持优先级

scrapy-redis默认只支持redis中listset数据结构, 但是当面对的业务多了后需要考虑到爬虫任务优先级的问题. 比如目前有3个业务线同时需要用一个爬虫, 3个业务线的重要程度不一样, 那么有以下几种方案:

  • 开3个spider(不建议)
  • 加入调度器进行优先级调度(加入了复杂度)
  • scrapy-redisstart_urls支持优先级

当时也是面临这个问题, 采用的是加入了一层调度器来运行, 后来抽时间给scrapy-redis提供了支持start_urls优先级的feature, 通过在settings.py中设置参数就可以支持了, 测试也已经通过, 可能项目作者太忙了, 没有给这个PR反馈.

项目地址

https://github.com/qshine/scrapy-redis

使用方法

git clone https://github.com/qshine/scrapy-redis.git
cd scrapy-redis
python setup.py install

settings.py中设置该参数, 其它参数可以参考README

# settings.py
......

REDIS_URL = 'redis://:@127.0.0.1:6379'
REDIS_START_URLS_KEY = '%(name)s:start_urls'
REDIS_START_URLS_AS_ZSET = True

......

测试spider如下

# -*- coding: utf-8 -*-

from scrapy_redis.spiders import RedisSpider


class MysiteSpider(RedisSpider):
    name = 'mysite'

    def parse(self, response):
        print(response.url)

redis中添加3个优先级不同的任务

zadd mysite:start_urls 0 http://www.baidu.com 10 http://www.sina.com 5 http://www.163.com

启动spider, 日志如下

http://www.sina.com
2019-07-03 23:54:34 [mysite] DEBUG: Request not made from data: b'http://www.sina.com'
http://www.163.com
2019-07-03 23:54:34 [mysite] DEBUG: Request not made from data: b'http://www.163.com'
http://www.baidu.com
2019-07-03 23:54:34 [mysite] DEBUG: Request not made from data: b'http://www.baidu.com'

结语

这个feature是最近解决优先级提交的, 个人认为是一个比较实用的功能. 如果有不足欢迎大家交流, 如果能帮你快速实现需求, 也欢迎点击star.

1634914-20190623172836409-113676237.jpg

转载于:https://www.cnblogs.com/zlone/p/11129953.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值