分布式爬虫
redis安装
- 用户自定义目录,也就是你想安装的位置,新建一个文件夹,注意你的路径里不要有中文
- 将redis-x64-3.2.100.zip压缩包 解压到你当前新建的文件夹里
- 将解压的文件的路径复制 并 配置到环境变量中
- 右击此电脑点击属性找到高级设置,然后点环境变量—系统变量—双击path—新建–粘贴路径即可
分布式
-
分布式爬虫
- 多台服务器机群,共同爬取数据
- 适用于数据量较大
- 提高了成本
-
原生scrapy 不能实现分布式,要通过scrapy-redis
- scrapy-redis提供了共享的调度器
- scrapy-redis提供了共享的管道
-
使用scrapy实现分布式的思路
- 为原生的scrapy框架提供共享的管道和调度器
- pip install scrapy-redis
-
配置及创建项目
-
创建工程
- scrapy startproject projectname
-
爬虫文件
- scrapy genspider -t crawl spidername www.baidu.com
-
修改爬虫文件
- 导包:from scrapy_redis.spiders import RedisCrawlSpider
- 将当前爬虫类的父类进行修改RedisCrawlSpider
- allowed_demains,start_urls 注释掉,添加一个新属性redis_key=“qn”(调度器队列的名称)
- 指定redis_key = ‘xxx’,即共享调度器队列名字
- lpush xxx url
- 数据解析:将解析的数据封装到item中然后向管道提交
-
配置文件的编写
-
指定管道
-
ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 400, }
-
指定调度器
# 增加了一个去重容器类的配置,作用使用redis的set集合来存储请求的指纹数据,从而实现请求去重的持久化 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 使用scrapy-redis组件自己的调度器 SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 配置调度器是否要持久化,也就是当爬虫结束了,要不要清空redis中请求队列和去重指纹的set,如果是True,就表示要持久化存储,就不清空数据,否则清空数据 SCHEDULER_PERSIST = True
-
指定具体的redis
REDIS_HOST = 'redis服务器的ip地址' REDIS_PORT = 6379
-
修改redis配置并指定配置启动
-
启动程序:scrapy runspider xxx.py(需要进入spider文件夹)
-
向调度器队列中扔入一个起始的url(redis的客户端):lpush xxx www.xxx.com (xxx表示的就是redis_key的值)
-
-
代码演示
-
爬虫文件中
import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from scrapy_redis.spiders import RedisCrawlSpider from fbsspider.items import FbsspiderItem class SunaskSpider(RedisCrawlSpider): # 爬虫名虽然运行时不再使用,但是不能删(******) name = 'sunask' # allowed_domains = ['baidu.com'] # start_urls = ['http://baidu.com/'] # 共享调度器 redis_key = 'sch' # http: // wz.sun0769.com / index.php / question / questionType?type = 4 & page = 30 link = LinkExtractor(allow=r'http://wz.sun0769.com.*?page=\d+')