Scrapy框架 分布式爬虫scrapy-redis组件 使用

使用流程

Redis基于内存,读写速度快,也可做持久化,但是内存空间有限,当数据量超过内存空间时,需扩充内存,但内存价格贵;
MySQL基于磁盘,读写速度没有Redis快,但是不受空间容量限制,性价比高;

大多数的应用场景是MySQL(主)+Redis(辅),MySQL做为主存储,Redis用于缓存,加快访问速度。需要高性能的地方使用Redis,不需要高性能的地方使用MySQL。存储数据在MySQL和Redis之间做同步;

  1. 下载 pip install scrapy-redis
  2. 下载 redis数据库 下载稳定版
  3. 安装教程
  4. 配置redis
'''[终端]cd到目录'''
'''[终端]vi redis.conf 利用vim修改配置'''
【修改内容】
1.  bind 127.0.0.1 注释掉(否则只运行本机进行链接)
2.  protected-mode no  关闭保护模式  改为no
  1. 基于配置文件进行开启redis

终端: cd到目下的src文件 ./redis-server ../redis.conf

  1. 客户端链接

终端: redis-cli

如何强制关闭sever服务

终端 sudo pkill redis-server

  1. 创建项目

scrapy startproject 工程名 (创建项目)

  1. 创建crawlSpider爬虫

scrapy genspider -t crawl 爬虫名 起始url

至此已做好前期准备工作


setting配置

  • 其他电脑上爬必须配置redis!!
# 19行 请求身份伪装user_agent 定义
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'

# 22行 是否遵从robots协议(君子协议)
ROBOTSTXT_OBEY = False


# redis管道配置
ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 400,
    # 'redisPro.pipelines.RedisproPipeline': 300,

}

# redis调度器配置
# 使用scrapy-redis组件的去重队列
DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'
# 使用scrapy-redis组件自己的调度器
SCHEDULER = 'scrapy_redis.scheduler.Scheduler'
# 是否允许暂停,以外关机后,重新开继续爬
SCHEDULER_PERSIST = True


# 注意!!!
# 如果redis数据库服务器不在本机,那么需要配置~~
# REDIS_HOST = 'redis服务器ip'
# REDIS_PORT = 6379


代码

# 父类替换
from scrapy_redis.spiders import RedisCrawlSpider  # 父类替换
from redisPro.items import RedisproItem    # 自己定义的item类

class QiubaiSpider(RedisCrawlSpider):  # 父类改为 RedisCrawlSpider
    name = 'qiubai'

    # 调度器队列名称
    redis_key = 'qiubaispider'  # 和 start_urls同理

    # 正则链接分页 提取器
    link = LinkExtractor(allow=r'/pic/page/\d+')

    # 规则解析器接收到链接提取器的链接,后对链接发起请求,获取内容根据规则进行解析
    # follow参数:是否自动在 被提取的页面中继续提 (自动去重)
    rules = (
        Rule(link, callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        div_list = response.xpath('//div[@id="content-left"]/div')

        for div in div_list:
            img_url = 'https:' + div.xpath('.//div[@class="thumb"]/a/img/@src').extract_first()
            item = RedisproItem()
            item['img_url'] = img_url

            # 原始的scrapy管道不支持分布式!!!
            # 用redis框架封装的管道!!!和调度器!! 在setting中配置

            yield item

1. 执行分布爬虫方法

【终端】cd到 cd 项目/spiders/

【终端】允许爬虫的py文件 scrapy runspider 爬虫文件.py

执行后等待调度器分配

2. 把url扔到调度器队列

【终端】【redis客户端连接上后】lpush 调度器队列名(爬虫中设定的) 起始url

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值