分布式爬虫
介绍
一个分布式爬虫,一般有两个端:master端,主要负责处理数据;slaver端,主要负责爬取数据业务。
不同的端采用不同的平台。服务程序都用linux系统,业务程序都用widoms系统。
服务器端(master端):
可以用某一台主机作为redis服务器的运行方(即服务端),也称为master。服务程序都用linux系统
客户端(slaver端):
1)把普通爬虫修改成分布式,去掉start_urls(不让slaver随意的执行),替换成redis_key(为了让master能够控制slaver的爬取)
安装
- pip install scrapy_redis
部署
- settings.py 文件中
1 ITEM_PIPELINES = { 2 # 'DushuPro.pipelines.DushuproPipeline': 300, # 数据的管道现在统一成分布式的管道 3 "scrapy_redis.pipelines.RedisPipeline":400, # 开启分布式管道 4 } 5 6 # 指定redis分布式管道的服务器 7 # 主机地址 8 REDIS_HOST = "39.106.191.15" 9 # 端口号 10 REDIS_PORT = 6379 11 # 密码 12 # REDIS_PARAMS = {"password":"xxxx"} 13 14 # 调度器,把scrapy调度器修改成scrapy_redis调度器 15 SCHEDULER = "scrapy_redis.scheduler.Scheduler" 16 # 是否允许调度的过程暂停 17 SCHEDULER_PERSIST = True 18 # 去重组件 19 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
- spilder/book.py 文件中
# -*- coding: utf-8 -*- import scrapy # 在scrapy中有很多的爬虫模板,这些模板都是基于basic模板进行的功能的扩展(例如:crawl模板、feed模板等),最常用的就是crawl(即增量式爬虫),basicspider的设计理念是:从start_urls里面取出起始的url,使用start_urls来驱动引擎的工作; # 【增量式爬虫】首先以start_urls中的url为起点,从这些url中不断的请求网页,然后从新的网页中匹配出新的url重新放入调度器的队列进行调度,再从新的url网页中提取新的url,再进行调度依次类推直至所有的url都匹配完成为止 from scrapy.linkextractors import LinkExtractor # 用于根据一定的规则从网页中提取新的url from scrapy.spiders import CrawlSpider, Rule # CrawlSpider增量爬虫,Rule一个规则对象,可以根据LinkExtractor匹配的网址发起请求,并且回调函数 from DushuPro.items import DushuproItem # 数据模型导入 from scrapy_redis.spiders import RedisCrawlSpider # 分布式爬虫继承文件 # 将此类继承自RedisCrawlSpider class BookSpider(RedisCrawlSpider): name = 'book' allowed_domains = ['dushu.com'] # start_urls = ['https://www.dushu.com/book/1002.html'] # 起始url从redis数据库中的book:start_urls这个键中获取 redis_key = "book:start_urls" # -----------------------后面的数据没有变化---------------------
运行
将起始url即start_url放入到阿里云服务器redis数据库的book:start_urls键中。然后启动爬虫,多台计算机共同访问此url进行爬取
在终端连接上redis数据库后,输入:LPUSH book: start_url https://www.dushu.com/book/1002.html
之后运行终止中的爬虫自动启动爬取
总结
分布式redis数据库中有4个key
- xxx:start_urls:用于向分布式系统提供起始url
- xxx:requests:用于盛放在爬虫运行的过程中新产生的那些请求对象
- xxx:items:用于存储爬虫爬取的数据
- xxx:dupefilter:用于盛放已经被访过的那些请求对象
分布式爬虫的运行过程
- 把所有的分机(slaver端)上的爬虫运行起来,由于没有start_urls,所有的分机都在等待起始url的产生
- 通过服务器脚本把那些起始的url放入到xxx:start_urls列表中
- 所有的slaver去竞争master端的xxx:start_urls中的起始url,一旦竞争到url则开启爬虫,没有竞争到slaver端继续监视xxx:start_urls和xxx:requests这两个列表
- 所有的分机如果对某个url访问成功则会把这个url加入去重列表中(即xxx:dupefilter),如果没有访问成功则会启动重传机制,如果再不成功就会这个url返回给requests列供其他slaver来使用
- 爬取成功的数据会通过管道组件存入到redis数据库的xxx:items列表中,并且把该页面新产生的url加入到xxx:requests列表中
- 如果所有的url都被取完(start_urls和requests两个列表都为空),则所有的slaver端都会暂停等待