scrapy-redis分布式爬虫

scrapy-redis分布式爬虫

开发步骤

一、安装模块

pip install scrapy-redis -i https://pypi.douban.com/simple

tips:重点讲解scrapy-redis与scrapy不同的地方。以下步骤均是在原scrapy项目中进行修改

二、修改settings文件

1、在settings.py文件中添加如下代码,
# scrapy_redis
# 过滤器 类模板, 过滤重复的请求对象
DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'
# 调度器 类模板
SCHEDULER = 'scrapy_redis.scheduler.Scheduler'
# 调度器持久化,实现断点续爬
SCHEDULER_PERSIST = True
# 使用redis
REDIS_URL = 'redis://127.0.0.1:6379'
2、修改ITEM_PIPELINES, 添加redis管道。可以将数据保存到redis数据库中。
ITEM_PIPELINES = {
   # 将数据保存到redis数据库
   'scrapy_redis.pipelines.RedisPipeline': 400,
}

三、修改爬虫文件

1、导入模块
from scrapy_redis.spiders import RedisSpider	# 导入RedisSpider类
2、修改类,让爬虫继承RedisSpider类
class xxxSpider(RedisSpider): # 爬虫继承RedisSpider类

3、添加类属性redis_key,并注释原来的start_urls

redis_key = 'key'	# key 为redis数据库中的键,列表类型、保存开始url

四、进入redis数据库

1、运行爬虫文件
scrapy crawl 爬虫名

可以看见程序最后停在了, 表示正在监听redis数据库,等待redis数据库分配开始url

Telnet console listening on 127.0.0.1:6023
2、进入redis数据库

redis安装就不赘述了。

# 进入redis
redis-cli
# 设置开始url
lpush key http://www.xxx.com

设置完开始url后,爬虫立刻开始爬取网页。直到所有网页爬取完毕,但是爬虫程序并没有结束,而是继续等待redis数据库分配网址。所以此时需要手动结束爬虫程序:Ctrl+C 结束进程。

5、保存数据到文件

import redis
import json

# 设置编码。按需修改其他参数:host\port\db\...
r = redis.StrictRedis(decode_responses=True)
# spider为爬虫名,自定义。数据类型为列表
itemslist = r.lrange('spider:items', 0, -1)

# 保存到文件
with open('store_redis_data.json', 'w') as f:
    json.dump(itemslist, f,ensure_ascii=False, indent=4)

"""
StrictRedis()的参数
decode_responses=True
设置自动将字节数据解码,将直接得到字符串数据,json不能保存字节数据。
encoding = 'utf-8' 
编码格式默认为utf-8,看情况修改
host='localhost'
设置ip地址
port=6379
端口号
db=0
选择数据库
password=None
填写密码

dump()的参数
ensure_ascii=False
默认使用ascii编码,需要关闭,否则不能显示中文。
indent=4
设置换行缩进,子节点缩进4格。默认不换行,所有内容显示在一行中。
"""

scrapy-redis分布式原理

1、原理

用redis数据库代替scrapy中的调度器和管道。由redis统一分配任务和保存数据。

2、redis的工作:

1、保存请求对象。接收各服务器爬虫发送的url请求对象。并过滤掉重复的。

2、保存item对象。接收各服务器爬虫发送的数据。

3、分配任务。将请求对象均分给各服务器。

4、实现断点续爬。过滤掉已完成的任务,保存未完成的任务。在任务中断后,再次启动任务可以从断点开始任务。

3、实现要求:

多台服务器需连接到同一个redis数据库。

posted @ 2020-11-19 18:20  流水自净  阅读(197)  评论(0编辑  收藏  举报