scrapy框架只能单机爬取,不能做分布式,配合redis可实现分布式爬虫。
实现分布式爬虫需要三类服务器,需要自己搭建
一:redis服务器,即url调度器,所有分布式节点需要在此服务器中读取url等信息
二:节点服务器,存放所有经过scrapy_redis配置过的项目文件
三:目标数据库服务器,用于持久化存储爬取的数据,搭建的数据库可以是redis,mysql,mongo等
配置步骤:
1.需要已经开发完成的单机的基于scrapy框架的爬虫项目
2.配置setting.py文件,需要配置的已在注释中写明:
# 只打印出error级错误
LOG_LEVEL = 'ERROR'
# scrapy_redis去重组件 # scrapy_redis配置必须
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用redis调度器 # scrapy_redis配置必须
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 指定redis数据库 # scrapy_redis配置必须
REDIS_HOST = 'xxx.xxx.xxx.xxx'
REDIS_PORT = xxxx
# 不清除数据库 # scrapy_redis配置非必须
SCHEDULER_RERSIST = True
# 爬虫中间件 去掉注释
DOWNLOADER_MIDDLEWARES = {
'pinganSpider.middlewares.DownloaderMiddleware': 543,
}
# item管道 去掉注释
ITEM_PIPELINES = {
'pinganSpider.pipelines.Pipeline': 300,
# 开启管道 存入redis数据库 # scrapy_redis配置必须
'scrapy_redis.pipelines.RedisPipeline': 301,
}
3.配置项目.py爬虫文件
引入RedisSpider类
from scrapy_redis.spiders import RedisSpider
继承这个类
class Spider(RedisSpider): # scrapy.Spider)
起始地址改写成这样,此处爬虫项目名可随意,习惯此命名
redis_key = '爬虫项目名:start_urls'
4.配置pipelines.py文件,统一写入一个目标数据库(外网可访问数据库)中,单机爬虫开发完成,此处不需要改
5.将n个节点的服务器都上传完成项目文件。所有节点先命令行启动项目
scrapy crawl 爬虫名
6.命令行启动redis调度器服务器
redis-cli -h xxx.xxx.xxx.xxx -p xxxx
将起始地址写入此redis数据库
lpush pingan:start_urls 'https://www.baidu.com'
到此完成分布式爬虫
节点服务器会自动抢起始url以及后续url,完成爬虫