基于scrapy-redis的分布式爬虫 2018-11-04
2018-11-05 本文已影响0人
Mr_Du_Biao
一、配置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