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文件中先调试

运行

  1. 先启动我们的redis服务端redis_server

  2. 启动我们的爬虫scrapy crawl kugou_music_spider_redis,可以看到在这里插入图片描述

  3. 启动redis客户端redis_cli

  4. redis客户端中加入我们的start_urllpush kugou_music https://www.kugou.com/ ,切回程序终端,就可以看到抓取行动开始了

成果图

在这里插入图片描述

源码

代码托管于github,传送门,截止发文,有效。
部分资料可参考
scrapy官方文档
scrapy_redis
scrapy 爬取酷狗热门歌手音乐

posted @ 2021-01-10 17:30  silence4allen  阅读(93)  评论(0编辑  收藏  举报