1:使用python操作Redis的步骤
2.1:安装Redis
2.2:导入reids
2.3:连接redis
方法一
redis.strictRedis(host='127.0.01, port=6379)
方法二
redis.Redis(host='127.0.0.1', port=6379)
2.4:逻辑实现
- 这一步主要是实现如何使用python来操作Redis数据库的
- 添加操作Redis的方法
redis.set(key, value)
- 设置获取Redis-srting数据的方法
redis.get(key)
- 返回的数据类型为一个字节流
- 在python中一般返回数据的前面带有一个b返回的就是一个字节流
- 解决字节流的方法
- 1:使用srt()方法,对字节流进行强制类型转化
- 2:通过设置方法中的参数respose_decode=Tres,来实现解码操作,把字节流改为字符串的类型
- 注意:在使用get方法的时候,得到的是一个redis对象,所以在返回的时候一定要是redis的调用
2:scrapy-redis
2.1:学习目标
- 1:了解scrapy-redis是如何工作的
- 2:学会如何把一个普通的网络爬虫给改写为一个分布式爬虫
2.2:scrapy-redis的工作流程
- scrapy-redis的工作流程其实和scrapy的工作流程差不多,只不过是当中的一些步骤有一些改变而已
- 改变步骤一:原本scrapy框架的调度器要处理url入列和出列由redis中的调度器来完成,这个时候的scrapy中的调度器只是起了一个连接redis和scrapy的一个中间程序,只是用来把原来引擎分配给自己的url给redis中的调度器,再把调取器返回的url给引擎让其分配给下载中间件处理数据。
- 改变步骤二:原来要存储在管道的数据直接发送给redis,scrapy不存储数据,数据全都存储到redis数据库中了
2.3:redis数据库中需要存储的数据
- 由2.2可以知道redis存储的数据至少要有爬取后的数据和要爬取的url以及待爬取的url
2.4:名词解释
分布式
集群
3:scrapy与scrapy-redis的区别
scrapy
- python的一个爬虫框架,爬取效率极高,具有高度的定制性,不支持分布式
scrapy-redis
- 基于redis的一个数据库,运行在scrapy的一个组件,可以支持scrapy分布式,支持主从同步技术
4:分布式的优点
优点
- 1:可以充分利用每一台机器的带宽
- 2:可以充分利用每一台机器的IP地址
- 3:多台机器爬取的效率高
问题
- 1:多台机器进行爬取的时候怎末保证不会爬取相同的数据
- 2:怎么把数据存储到一个相同的地方
解释
- 这些问题都已经在redis中处理好了,所以这些问题都不是问题
5:如何把一个普通爬虫改写为分布式爬虫
5.1:通过分析已经分布式爬虫来学习改写
- 1 我们发现需要安装 pip install scrapy-redis
- 2 settings文件 学文大了 好多地方和我们的不一样,当中由一些配置和普通的scrapy爬虫不同
- 3 尝试的运行了一下这个爬虫文件 发现redis里面多了3个文件
- dmoz:items --> 爬取得到的数据
- dmoz:requests --> 带爬取的数据,一个有序不重复的集合,做了序列化的操作
- dmoz:dupefilter --> 已经爬取过的数据,一个无序不重复的集合,使用了hash进行了处理
5.1:改写步骤
1:创建scrapy项目
- 先创一个普通的scrapy爬虫,然后改写为一个分布式爬虫
2: 改写爬虫文件
- 2.1:安装库
- 需要事先检查一下自己是否安装了scrapy-redis库
- 安装代码
pip install scrapy-redis
- 2.2:改写爬虫文件
- 添加模块:
from scrapy_redis.spiders import RedisSpider
- 改写类所继承的父类为:
class DangdangSpider(RedisSpider)
- 把start_urls 改写成 reids_key='爬虫文件名字'
# 去重过滤
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# scheduler放到redis中的调度器中
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 数据持久化
SCHEDULER_PERSIST = True
# 管道改写
ITEM_PIPELINES = {
'example.pipelines.ExamplePipeline': 300,
'scrapy_redis.pipelines.RedisPipeline': 400,
}
3:逻辑操作