####

scrapy框架使用-scrapy-redis的使用_序列化

 

###

scrapy框架使用-scrapy-redis的使用_序列化_02

 

 ####

scrapy框架使用-scrapy-redis的使用_分布式爬虫_03

 

###

原生的scrapy,今天启动了,关闭了,明天再启动,昨天爬取的url,会再次爬取,这不是我们想要的,

我们想要的是今天爬过的url,下一次就不再爬取了,这就是增量式爬虫,

而且,如果我们再一个机器爬取,如果我们想要再另外一个机器再开启一个爬虫,原来的scrapy会重复爬取之前的url,这不是我们想要的,

我们想要的是大家同时爬取一个url池,不会重复爬取,可以多个爬虫协同工作,这就是分布式爬虫,

### 

scrapy框架使用-scrapy-redis的使用_分布式爬虫_04

 

调度器会和redis相连,这是最重要的,这样我们是只有一个url维护的地方,

这个Redis做了两个事情,

1是维护request,这是待爬取的request,

2是指纹集合,这是为了保存爬取过的request的指纹,

至于pipeline和redis相连,我们原来的scrapy也可以实现,

也就是实际scrapy-redis也帮助我们把数据保存到了redis,但是实际这个我们可以注释掉,不使用这个功能

关键是前两个事情,

###

看看scrapy-redis给出的示例项目

###

spider

scrapy框架使用-scrapy-redis的使用_redis_05

原地址url已经不能用了,替换一下:

scrapy框架使用-scrapy-redis的使用_分布式爬虫_06

pipeline

scrapy框架使用-scrapy-redis的使用_redis_07

 

 setting

scrapy框架使用-scrapy-redis的使用_序列化_08

 

scrapy框架使用-scrapy-redis的使用_redis_09

 

 

 ####

启动这个项目

scrapy框架使用-scrapy-redis的使用_ide_10

 

看redis的变化

 scrapy框架使用-scrapy-redis的使用_数据保存_11

 

第一个request,是保存的待爬取request对象,

redis不支持保存对象,他是怎么存的,他是对request做了序列化操作,然后拿出来之后又反序列化,

第二个,items,这是一个列表,

这是抓取到的内容,这个就是保存的定义的内容,

这个地方我们并没有保存到redis,为什么在这里,是通过setting里面的redispipeline保存的,

第三个dupefilter,这个是保存的已经抓取过的request的指纹,

 

###

关闭redispipeline,观察三个Redis的变化,

scrapy框架使用-scrapy-redis的使用_分布式爬虫_12

 可以发现item已经不变化了,说明刚刚我们关闭的Redis就是做了保存到redis的事情,

这个pipeline,我们可以注释掉,不使用redis保存, 

 ####

所以说这个scrapy-redis里面是怎么实现的这个request的存储,以及request的指纹去重的呢?

看看源码

先看redispipeline,

这个类做的事情,就是把数据保存到了redis,这个不难,自己也能写,

scrapy框架使用-scrapy-redis的使用_ide_13

###

然后看dupefilter类

这个就是把已经爬取的request做了指纹处理保存,下次来的时候就去看看有没有这个request指纹,如果有就说明爬过了就不爬了,从而实现去重,

 scrapy框架使用-scrapy-redis的使用_ide_14

 

所以怎么生成指纹的,就是使用的hashlib.sha1来生成的

scrapy框架使用-scrapy-redis的使用_ide_15

 

 

###

然后看看调度器scheduler,

会读取setting里面的一个是否持久化的字段,如果是TRUE,就存储,如果不存,关闭的时候,就全都清除

还有就是如何入队的,

1,如果指纹已经存在了,肯定不会是入队的,

2,如果是一个全新的url,肯定是入队的,

3,dont_filter,是ture,就是说不管有没有请求过,统统都去请求,这个也是入队,什么时候用这个,就是那些页面会变化的会更新的,就是每次都去爬

scrapy框架使用-scrapy-redis的使用_序列化_16

 

 

 ####

实战京东爬虫

scrapy框架使用-scrapy-redis的使用_数据保存_17

 

 ####

思路和爬取苏宁图书一样的,

就是先获取大分类,然后获取小分类,

然后获取列表页,然后翻页

然后获取详情页,

整个的过程,需要对scrapy的使用非常的数量,还要对xpath,re,等模块的使用非常的熟悉,

这个就要多写,多练,

###

用scrapy-redis实现分布式爬虫,redisspider

 

 scrapy框架使用-scrapy-redis的使用_redis_18

 

第一个不同,父类不同了,使用了redisspider

第二个不同,使用了一个rediskey,来存储待爬取的redis对象,没有starturl地址了, 因为这个代码要放到不同的电脑执行的,如果写在代码里,每个机器运行,都会抓取这个url就重复了,

注意,这个starturl需要单独在redis里面添加一下,

 

所有的机器,都从redis这个队列里面取值,取得时候使用的pop这样的方法,取到就删除,

也就是一个url只会有一个机器能获取到,

 其他的都一样,

这样就可以实现分布式爬虫了,

一个电脑可以发送100个请求,10个电脑就可以发送1000个请求了,这是因为使用了redisspider, 所以实现了分布式爬虫,

 

###

案例,当当网爬虫,

###

还有一个爬虫rediscrowlspider

scrapy框架使用-scrapy-redis的使用_序列化_19

 

###

scrapy框架使用-scrapy-redis的使用_数据保存_20

 

 可以使用rule,里面的xpath提取连接,因为只需要写到ul,一级,就可以把这个下面所有的url都提取出来了 ,

 

###

可以使用pycharm的一个工具,发布代码到服务器,

可以使用crontab,定时执行爬虫, 

 

####