####
###
####
###
原生的scrapy,今天启动了,关闭了,明天再启动,昨天爬取的url,会再次爬取,这不是我们想要的,
我们想要的是今天爬过的url,下一次就不再爬取了,这就是增量式爬虫,
而且,如果我们再一个机器爬取,如果我们想要再另外一个机器再开启一个爬虫,原来的scrapy会重复爬取之前的url,这不是我们想要的,
我们想要的是大家同时爬取一个url池,不会重复爬取,可以多个爬虫协同工作,这就是分布式爬虫,
###
调度器会和redis相连,这是最重要的,这样我们是只有一个url维护的地方,
这个Redis做了两个事情,
1是维护request,这是待爬取的request,
2是指纹集合,这是为了保存爬取过的request的指纹,
至于pipeline和redis相连,我们原来的scrapy也可以实现,
也就是实际scrapy-redis也帮助我们把数据保存到了redis,但是实际这个我们可以注释掉,不使用这个功能
关键是前两个事情,
###
看看scrapy-redis给出的示例项目
###
spider
原地址url已经不能用了,替换一下:
pipeline
setting
####
启动这个项目
看redis的变化
第一个request,是保存的待爬取request对象,
redis不支持保存对象,他是怎么存的,他是对request做了序列化操作,然后拿出来之后又反序列化,
第二个,items,这是一个列表,
这是抓取到的内容,这个就是保存的定义的内容,
这个地方我们并没有保存到redis,为什么在这里,是通过setting里面的redispipeline保存的,
第三个dupefilter,这个是保存的已经抓取过的request的指纹,
###
关闭redispipeline,观察三个Redis的变化,
可以发现item已经不变化了,说明刚刚我们关闭的Redis就是做了保存到redis的事情,
这个pipeline,我们可以注释掉,不使用redis保存,
####
所以说这个scrapy-redis里面是怎么实现的这个request的存储,以及request的指纹去重的呢?
看看源码
先看redispipeline,
这个类做的事情,就是把数据保存到了redis,这个不难,自己也能写,
###
然后看dupefilter类
这个就是把已经爬取的request做了指纹处理保存,下次来的时候就去看看有没有这个request指纹,如果有就说明爬过了就不爬了,从而实现去重,
所以怎么生成指纹的,就是使用的hashlib.sha1来生成的
###
然后看看调度器scheduler,
会读取setting里面的一个是否持久化的字段,如果是TRUE,就存储,如果不存,关闭的时候,就全都清除
还有就是如何入队的,
1,如果指纹已经存在了,肯定不会是入队的,
2,如果是一个全新的url,肯定是入队的,
3,dont_filter,是ture,就是说不管有没有请求过,统统都去请求,这个也是入队,什么时候用这个,就是那些页面会变化的会更新的,就是每次都去爬
####
实战京东爬虫
####
思路和爬取苏宁图书一样的,
就是先获取大分类,然后获取小分类,
然后获取列表页,然后翻页
然后获取详情页,
整个的过程,需要对scrapy的使用非常的数量,还要对xpath,re,等模块的使用非常的熟悉,
这个就要多写,多练,
###
用scrapy-redis实现分布式爬虫,redisspider
第一个不同,父类不同了,使用了redisspider
第二个不同,使用了一个rediskey,来存储待爬取的redis对象,没有starturl地址了, 因为这个代码要放到不同的电脑执行的,如果写在代码里,每个机器运行,都会抓取这个url就重复了,
注意,这个starturl需要单独在redis里面添加一下,
所有的机器,都从redis这个队列里面取值,取得时候使用的pop这样的方法,取到就删除,
也就是一个url只会有一个机器能获取到,
其他的都一样,
这样就可以实现分布式爬虫了,
一个电脑可以发送100个请求,10个电脑就可以发送1000个请求了,这是因为使用了redisspider, 所以实现了分布式爬虫,
###
案例,当当网爬虫,
###
还有一个爬虫rediscrowlspider
###
可以使用rule,里面的xpath提取连接,因为只需要写到ul,一级,就可以把这个下面所有的url都提取出来了 ,
###
可以使用pycharm的一个工具,发布代码到服务器,
可以使用crontab,定时执行爬虫,
####