scrapy_redis 分布式爬取酷狗音乐
声明
文章仅供学习交流使用,切勿他用。如有侵权,请联系本人处理。
上次我们完成了使用scrapy框架爬取酷狗音乐,今天我们试试scrapy_redis。
上一篇 : scrapy 爬取酷狗热门歌手音乐
安装scrapy_redis
pip install -i https://pypi.douban.com/simple scrapy_redis
创建scrapy项目
想必,我们应该得心应手了
scrapy startproject KugouMusicSpiderRedis
cd KugouMusicSpiderRedis
scrapy genspider kugou_music_spider_redis www.kugou.com/
spider模块
直接将上次的代码copy过来,有几点需要注意
- 我们的spider需要继承RedisSpider
- 可以不需要变量start_urls
- 添加必要变量redis_key,见名思意,无需多言。建议以spider_name:start_url命名
- 不要复写start_requests方法,使用parse方法解析就行了。想实现相同功能的话可以参考scrapy-redis记录,重写make_requests_from_url实现start_url
这里,我们可以直接将parse_index方法改为parse即可
def parse(self, response):
"""
根据酷狗首页获取'更多'歌手连接(即歌手首页)
:param response:
:return:
"""
singer_index_url = response.xpath('//div[@id="tabMenu"]//a[@class="more"]/@href').extract_first()
singer_index_url = parse.urljoin(response.url, singer_index_url)
yield Request(
url=singer_index_url,
callback=self.parse_singer_index,
dont_filter=True
)
items模块、pipelines模块
这两个模块同之前的代码,无需修改
setting.py
可以参见github使用文档,总的来说
- 添加
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
,这个应该是注册调度器,使Redis可以调度存储request队列功能 - 添加
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
,确保redis过滤所有spider的请求是否重复 ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline':300}
,确保item可以存在redis中让不同的机器可以处理,这里我只有一台机器,便没有使用这个玩意,仍然使用我们自己原来的pipeline来处理- 其他可选参数,大家自行参考文档抉择
调试
类似之前爬取的处理,还是在main.py文件中先调试
运行
-
先启动我们的redis服务端
redis_server
-
启动我们的爬虫
scrapy crawl kugou_music_spider_redis
,可以看到 -
启动redis客户端
redis_cli
-
redis客户端中加入我们的start_url
lpush kugou_music https://www.kugou.com/
,切回程序终端,就可以看到抓取行动开始了
成果图
源码
代码托管于github,传送门,截止发文,有效。
部分资料可参考
scrapy官方文档
scrapy_redis
scrapy 爬取酷狗热门歌手音乐
一点点进步...