爬虫--分布式爬虫
分布式爬虫
--实现方式:scrapy+redis(scrapy结合scrapy-redis组件)
--原生的scrapy框架是无法实现分布式
--分布式: 搭建一个分布式的机群,让机群中的每一台电脑执行同一组程序对同一组资源进行联合且分布的爬取
--原生的scrapy框架
--调度器无法被分布式机群共享
--管道无法被分布式机群共享
--scrapy-redis组件的作用:
--给原生的scrapy框架提供共享的管道和调度器
--pip install scrapy-redis
--实现流程:
--1.修改爬虫文件
-1.1 导包:from scrapy_redis.spiders import RedisCrawlSpider
-1.2 修改当前爬虫类的父类为:RedisCrawlSpider
--1.3 将start_urls替换成redis_key属性,代表共享的调度器队列名称
--redis_key = 'xxx' : 最终会将起始url放到这个队列中
--1.4 将数据解析的操作补充完整
# 爬虫文件
import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from scrapy_redis.spiders import RedisCrawlSpider from scrapyredis.items import ScrapyredisItem class FbsSpider(RedisCrawlSpider): name = 'fbs' # allowed_domains = ['www.xxx.com'] redis_key = 'fbsQueue' # 可以被共享的调度器队列的名称 # 稍后我们是要将一个其实urls手动的添加到调度器队列中 rules = ( Rule(LinkExtractor(allow=r'category/xxx/page/\d+'), callback='parse_item', follow=True), ) def parse_item(self, response): article_list = response.xpath('//article') for article in article_list: article_title = article.xpath('./div[2]/header/h2/a/@title').extract_first() item = ScrapyredisItem item['article_title'] = article_title yield item
--2.对settings.py进行配置
--指定调度器
# 增加了一个去重容器类的配置,作为使用Redis的set集合来存储请求的数据,从而实现请求去重 DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter' # 使用scrapy-redis组件自己的调度器 SCHEDULER = 'scrapy_redis.scheduler.Scheduler' # 配置调度器是否需要持久化,即当爬虫结束了,是否要清空redis队列中的数据. # 如果是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':'你的密码'}
# 如果有用户名和密码,同样进行配置
--3.配置redis的配置文件(redis.window.conf)
--解除默认绑定
#bind 127.0.0.1 注释掉,否则只能127.0.0.1访问
--关闭保护模式
protected-mode yes 否则redis只读,不能写入数据,分布式爬虫需要将数据写入redis
--4.启动redis服务和客户端: redis-server redis-cli
--5.执行scrapy工程(不要在配置文件中加入LOG_LEVEL)
--程序会监听listening,等到其实url加入
--6.向redis_key表示的队列中添加其实url
-- 需要在redis客户端执行如下指令:(调度器队列是在redis中的)
--lpush fbsQueue https://www.xxx.com
--7.数据是保存在redis中,再从redis中将数据保存到其他位置
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通