基于scrapy-redis的分布式爬虫 2018-11-04

一、配置redis

  • 对redis配置文件进行配置:
    • 注释该行:bind 127.0.0.1,表示可以让其他ip访问redis
    • 将yes该为no:protected-mode no,表示可以让其他ip操作redis

二、scrapy基于redis的数据持久化操作流程

1.安装scrapy-redis组件:

  • pip install scrapy-redis
  • scrapy-redis是基于scrapy框架开发出的一套组件,其作用就是可以让scrapy实现分布式爬虫。

2.编写爬虫文件:

  • 同之前scrapy中基于Spider或者CrawlSpider的编写方式一致。

3.编写管道文件:

  • 在scrapy-redis组件中已经帮助我们封装好了一个专门用于连接存储redis数据库的管道(RedisPipeline),因此我们直接使用即可,无需自己编写管道文件。

4.编写配置文件:

  • 在settings.py中开启管道,且指定使用scrapy-redis中封装好的管道。
ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 400
}
  • 该管道默认会连接且将数据存储到本机的redis服务中,如果想要连接存储到其他redis服务中需要在settings.py中进行如下配置:
REDIS_HOST = 'redis服务的ip地址'
REDIS_PORT = 6379
REDIS_ENCODING = ‘utf-8’
REDIS_PARAMS = {‘password’:’123456’}
  • 使用scrapy-redis组件中封装好的调度器,将所有的url存储到该指定的调度器中,从而实现了多台机器的调度器共享。
# 使用scrapy-redis组件的去重队列
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis组件自己的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 是否允许暂停
SCHEDULER_PERSIST = True

5.启动redis

  • 启动服务端
    • mac/linux: redis-server redis.conf
    • windows: redis-server.exe redis-windows.conf
  • 启动客户端
    • redis-cli

6.执行当前爬虫文件:

  • scrapy runspider 爬虫文件 (注意爬虫文件必须加上后缀名.py)

7. 向队列中扔一个起始url

  • 在redis-cli执行扔的操作(lpush redis_key的value值 起始url)

例:爬虫文件

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy_redis.spiders import RedisCrawlSpider
from redisScrapyPro.items import RedisscrapyproItem
#-1.将redis数据库的配置文件进行改动: protected-mode no        #bind 127.0.0.1
#0.下载scrapy-redis
#1.创建工程
#2.创建基于scrawlSpider的爬虫文件
#3.导入RedisCrawlSpider类
#4.将start_urls更换成redis_key属性
#5.在现有代码的基础上进行连接提取和解析操作
#6.将解析的数据值封装到item中,然后将item对象提交到scrapy-redis组件中的管道里('scrapy_redis.pipelines.RedisPipeline': 400,)
#7.管道会将数据值写入到指定的redis数据库中(在配置文件中进行指定redis数据库ip的编写)
#8.在当前工程中使用scrapy-redis封装好的调度器(在配置文件中进行配置)
#9.将起始url扔到调度器队列(redis_key)中
#10.启动redis服务器:redis-server redis.windows.conf
#11.启动redis-cli
#12.执行当前爬虫文件:scrapy runspider 爬虫文件
#13.向队列中扔一个起始url:在redis-cli执行扔的操作(lpush redis_key的value值 起始url)
class RedisdemoSpider(RedisCrawlSpider):
    name = 'redisDemo'
    #allowed_domains = ['www.xxx.com']
    #start_urls = ['http://www.xxx.com/']

    #scrapy_redis的调度器队列的名称,最终我们会根据该队列的名称向调度器队列中扔一个起始url
    redis_key = "redisQueue"

    link = LinkExtractor(allow=r'/pic/page/\d+\?s=\d+')
    link1 = LinkExtractor(allow=r'/pic/page/1')
    rules = (
        Rule(link, callback='parse_item', follow=True),
        Rule(link1, callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        div_list = response.xpath('//div[@class="thumb"]')
        for div in div_list:
            img_url = "https:"+div.xpath('./a/img/@src').extract_first()
            item = RedisscrapyproItem()
            item['imgUrl'] = img_url

            yield item

你可能感兴趣的:(基于scrapy-redis的分布式爬虫 2018-11-04)