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数据库。
如果觉得本文有用,万望看官慷慨解囊,不吝打赏,激励本编提供更加优质的内容
[点击进行打赏](https://www.cnblogs.com/52note/p/16507868.html)