RedisSpider
继承自父类为RedisSpider
增加了一个redis_key的键,没有start_urls,因为分布式中,如果每台电脑都请求一次start_url就会重复
多了__init__方法,该方法不是必须的,可以手动指定allow_domains
爬虫 创建爬虫
scrapy genspider dangdang dangdang.com
- 修改
引入父类
from scrapy_redis.spiders import RedisSpider
修改父类
class DangdangSpider(RedisSpider):
修改starr_urls为redis_key
start_urls = [‘http://book.dangdang.com/’]
redis_key = “dangdang”
爬虫运行
测试阶段 每次都需要清空redis
flushdb
每次给redis_key添加start_url
lpush dangdang http://book.dangdang.com/
运行爬虫
scrapy crawl dangdang
注意点
在方法parse_book_list中 yield item的时候需要deepcopy
因为一个item for循环多次赋值
yield deepcopy(item)
分布式演示
可以用两台机器 你自己的 和同桌
本地开启两个或多个爬虫
断点续爬
请求队列有很多请求 scrapy爬取了一半 突然挂掉了
再启动一个scrapy 会接着上一次请求挂掉的地方 继续请求
增量式
增量式爬虫 只获取新增加的数据
首先我们要把对放网站的数据全部过到 对方有新增加了一些数据
然后只爬去新增加的内容
三个父类的分析
- 配置
去重的持久化
DUPEFILTER_CLASS = “scrapy_redis.dupefilter.RFPDupeFilter”
调度器 请求队列的持久化
SCHEDULER = “scrapy_redis.scheduler.Scheduler”
以上连个配置实现了 请求队列的分布式
- Spider
scrapy.Spider有的功能这个类都有
- Crawl
通过rules中的正则表达式或者xpath提取url
- Redis
添加了redis_key 使start_url实现了分布式
爬虫 创建爬虫
创建爬虫
scrapy genspider -t crawl amazon amazon.cn
引入父类ReidsCrawlSpider
from scrapy_redis.spiders import RedisCrawlSpider
修改父类
class AmazonSpider(RedisCrawlSpider):
修改start_urls为redis_key
start_urls = [‘https://www.amazon.cn/图书/b/ref=sd_allcat_books_l1?ie=UTF8&node=658390051’]
redis_key = “amazon”
定时执行任务
linux crontab
windows 计划任务