本文主要是介绍Python爬虫从入门到精通:(38)分布式爬虫_Python涛哥,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
什么是分布式爬虫:
- 默认情况下,我们使用scrapy框架进行爬虫时使用的是单机爬虫,就是说它只能在一台电脑上运行,因为爬虫调度器当中的队列queue去重和set集合都只能在本机上创建的,其他电脑无法访问另外一台电脑上的内存和内容。
- 分布式爬虫实现了多台电脑使用一个共同的爬虫程序,它可以同时将爬虫任务部署到多台电脑上运行,这样可以提高爬虫速度,实现分布式爬虫。
分布式的主要内容在于配置!!!
实现方式:
scrapy+redis(scrapy结合着scrapy-redis组件)
原生的scrapy框架是无法实现分布式的.
-
什么是分布式:
需要搭建一个分布式的机群,然后让机群中的每一台电脑执行同一组程序,让其对同一组资源进行联合且分布的数据爬取。
-
为什么原生的scrapy框架无法实现分布式?
- 调度器无法被分布式机群共享
- 管道无法被共享
-
如何实现分布式:
使用
scrapy-redis
组件结合 -
scrapy-redis
组件的作用- 可以给原生的scrapy框架提供共享的管道和调度器
- 安装:
pip install scrapy-redis
实现流程
创建爬虫工程:
scrapy startproject fbsPro
cd fbsPro
scrapy genspider -t crawl fbs www.xxx.com
修改配置文件:UA
、 ROBOTSTXT_OBEY
.其他的先不要改,我们要看日志的
1.修改爬虫文件
- 导包:
from scrapy_redis.spiders import RedisCrawlSpider
from scrapy_redis.spiders import RedisCrawlSpider
- 修改当前爬虫类的父类为:
RedisCrawlSpider
class FbsSpider(RedisCrawlSpider):name = 'fbs'xxx
- 将
strat_ur
l替换成redis_key
的属性,属性值为任意字符串
redis_key = 'sunQueue' # 可以被共享的调度器队列的名称
# 稍后我们是需要将一个起始的url手动的添加到redis_key表示的队列中
redis_key = 'xxx'
表示的是可以被共享的调度器队列的名称,最终是需要将起始的url手动防止到redis_key表示的队列中
- 将数据解析补充完整
rules = (Rule(LinkExtractor(allow=r'id=1&page=\d+'), callback='parse_item', follow=False),
)def parse_item(self, response):# 将全站的标题获取li_list = response.xpath('/html/body/div[2]/div[3]/ul[2]/li')for li in li_list:title = li.xpath('./span[3]/a/text()').extract_first()item = FbsproItem()item['title'] = titleyield item# items.py记得改
2.对settings.py进行配置
-
指定调度器
1.增加了一个去重容器类的配置,作用使用Redis的ser集合来存储请求的指纹数据,从而实现请求去重的持久化
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
-
使用scrapy-redis组件自己的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
-
配置调度器是否需要持久化,也就是当爬虫结束了,要不要情况Redis中请求队列和去重指纹的set.如果是True,就表示要持久化存储,就不清空数据,否则清空数据
SCHEDULER_PERSIST = True
-
-
指定管道
ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline': 400, } # 特点:该种管道只可以将item写入redis
-
指定
redis
REDIS_HOST = 'redis服务器的ip地址' REDIS_PORT = 6379 REDIS_ENCODING = 'utf-8' REDIS_PARAMS = {'password':'123456'}
总之就是settings.py
增加如下代码:
3.配置redis的配置文件(redis.window.conf
)
- 解除默认绑定
- 56行:# 127.0.0.1 (注释掉)
- 关闭保护模式
- 75行:protected-mode no
4.启动redis服务和客户端
5.执行scrapy工程(不要再配置文件中加入LOG_LEVEL)
执行后程序会停留在listening
位置:等待起始url
加入
6.向redis_key表示的队列中添加起始的url
需要在redis的客户端执行如下指令:(调度器队列是存在于redis中)
lpush sunQueue https://wz.sun0769.com/political/index/politicsNewest?id=1&type=4&page=1
这样配置执行后,就可以进行分布式爬取了,多台电脑一起爬取。
最后再说下,分布式的实现在于配置!
关注Python涛哥!学习更多python知识!
这篇关于Python爬虫从入门到精通:(38)分布式爬虫_Python涛哥的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!