企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
**1. 编写普通爬虫** ```shell >scrapy startproject jdbooks >cd jdbooks >scrapy genspider jdbooksspider jd.com ``` <br/> **2. 将普通爬虫改造成分布式爬虫** (1)修改你的爬虫 `jdbooksspider.py` ```python """ @Date 2021/4/28 """ import scrapy # 1. 导入RedisSpider from scrapy_redis.spiders import RedisSpider # 2. 继承RedisSpider # class JdbooksspiderSpider(scrapy.Spider): class JdbooksspiderSpider(RedisSpider): name = 'jdbooksspider' # 3. 注销allowed_domains和start_urls # allowed_domains = ['jd.com'] # start_urls = ['https://book.jd.com/booksort.html'] # 4. 设置 redis_key # redis_key是固定变量名,不能更改 # 当往Redis数据库读取或写入初始url时,寻找的就是redis_key对应的值 redis_key = 'jdbooks' # 5. 设置 __init__ 函数 def __init__(self, *args, **kwargs): # 当没有传入domain参数,则默认为 '' domain = kwargs.pop('domain', '') # 多个允许的域采用 , 分割 self.allowed_domains = list(filter(None, domain.split(','))) super(JdbooksspiderSpider, self).__init__(*args, **kwargs) def parse(self, response): pass ``` <br/> (2)修改`settings.py`配置 ```python ###### 添加如下配置 ######### # 设置重复过滤器的模块 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 设置调度器,调度器具备与redis数据库交互的功能 SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 设置当爬虫结束时是否保持redis数据库中没有完成的任务 # True: 保持,如果因为某些原因导致任务中断,则没有完成的任务继续进行 # False: 不保持,任务结束就会清空数据库,则所有的任务都将从头开启执行 SCHEDULER_PERSIST = True #SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue" #SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue" #SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack" ITEM_PIPELINES = { 'example.pipelines.ExamplePipeline': 300, # 当开启该管道,该管道将会自动把指纹、items、request请求信息存储到redis数据库中 'scrapy_redis.pipelines.RedisPipeline': 400, } # 设置redis数据库 REDIS_URL = "redis://localhost:6379" # 或者采用下面这种方式设置 # REDIS_HOST = 'localhost' # REDIS_PORT = 6379 LOG_LEVEL = 'DEBUG' # Introduce an artifical delay to make use of parallelism. to speed up the # crawl. DOWNLOAD_DELAY = 1 ``` <br/> **3. 启动分布式爬虫** ```shell # 打开不同的终端,切换到 jdbooksspider.py 爬虫文件所在目录下 # 假如启动三个爬虫,分别在3个终端中运行 # scrapy runspider jdbooksspider.py # 终端窗口1 >scrapy runspider jdbooksspider.py # 终端窗口2 >scrapy runspider jdbooksspider.py # 终端窗口3 >scrapy runspider jdbooksspider.py ``` 当redis数据库中没有`redis_key`时,三个爬虫程序处于等待状态。 <br/> **4. 往redis数据库中保存一个redis_key** ```shell # redis_key=jdbooks > lpush jdbooks https://book.jd.com/booksort.html ``` 当往redis数据库 push 一个 start_urls 后,上面三个程序根据自身的速度抢占 start_urls,谁抢到由谁向 start_urls 发起请求。 <br/> **5. redis数据库中的信息** 当爬虫程序跑起来后,会在Redis数据库自动生成如下三个数据: ![](https://img.kancloud.cn/24/99/24998419dcadfb2f35131e99a533d3a0_1150x122.jpg) dupefilter:去重后的指纹信息,每个指纹信息都是唯一的(可以持久化); items:只要有一次 `yield item`,就会被保存到 items中,每个item都是唯一的(可以持久化); requests: 记录每次请求信息,每个请求都是唯一的(好像不能持久化,爬虫结束后就不存在了);