分布式
分布式爬虫,搭建一个分布式的机群,然后让机群中的每一台电脑执行同一组程序,让其对同一组资源进行联合且分布的数据爬取。
实现方式是scrapy + redis (使用scrapy结合着scrapy-redis组件)。原生scrapy框架无法实现分布式,因为调度器、管道无法被分布式机群共享。scrapy-redis组件可以给原生scrapy框架提供共享的管道和调度器。
实现流程
1.修改爬虫文件
- 1.1 导包:from scrapy_redis.spiders import RedisCrawlSpider
- 1.2 修改当前爬虫类的父类为:RedisCrawlSpider
- 1.3 将start_url替换成redis_keys的属性,属性值为任意字符串
- redis_key = ‘xxx’:表示的是可以被共享的调度器队列的名称,最终是需要将起始的url手动
放置到redis_key表示的队列中
- 1.4 将数据解析的补充完整即可
2.对settings.py进行配置
- 指定调度器
# 增加了一个去重容器类的配置, 作用使用Redis的set集合来存储请求的指纹数据, 从而实现请求去重的持久化
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
3.配置redis的配置文件(redis.window.conf)
- 解除默认绑定
- 56行:#bind 127.0.0.1
- 关闭保护模式
- 75行:protected-mode no
4.启动redis服务和客户端
5.执行scrapy工程(不要在配置文件中加入LOG_LEVEL)
- 程序会停留在listening位置:等待起始的url加入
6.向redis_key表示的队列中添加起始url
- 需要在redis的客户端执行如下指令:(调度器队列是存在于redis中)
- lpush 队列名称 http://wz.sun0769.com/political/index/politicsNewest?id=1&page=1
代码(不包括Redis部分)
spider
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy_redis.spiders import RedisCrawlSpider
from fbsPro.items import FbsproItem
# 修改父类
class FbsSpider(RedisCrawlSpider):
name = 'fbs'
# allowed_domains = ['www.xxx.co']
# start_urls = ['http://www.xxx.co/']
redis_key = 'sunQueue' #可以被共享的调度器队列的名称
#在Redis中将一个起始的url手动的添加到redis_key表示的队列中
rules = (