【python爬虫】网易云歌单下载(scrapy+selenium)

本文介绍如何使用scrapy框架结合selenium下载网易云音乐的歌单。通过分析网页结构,发现歌单信息位于iframe内,通过selenium切换frame获取完整信息。遇到的难点包括动态加载、iframe内容抓取以及AES加密的歌曲链接解密。借助GitHub上的资源解决解密问题,最后利用requests下载音乐。
摘要由CSDN通过智能技术生成

我又滚回来更新了,这一次我们的目标是网易云音乐,想要通过输入歌单的链接,然后把整个歌单的歌曲都下载下来,说做就做,看看这一次有会遇见怎样的问题把。
需要注意的点:

  1. 这一次使用的框架仍然是scrapy,不同于上个框架的是这一回加上了selenium,我是蛮不想借助这个的,但是让工具发挥他最大的用处,这才是我们该做的
  2. VIP才能下载的音乐依然无法下载,现在还没有那个实力,只能下载歌单中不是vip的音乐
  3. 本文用于技术交流,如果侵犯版权立即删除,任何人不能用于商业用途
    好的,那我们就开始吧,一开始我们先来分析一下网易云的歌单
    这是这一次要分析的网址: https://music.163.com/#/playlist?id=61650863 ,顺便卖一波安利,这个歌单蛮不错的,喜欢纯音乐的朋友可以听听看。
    在这里插入图片描述
    首先我们要做的是获取这个歌单所有的歌曲的链接和名字,一开始觉得应该没有什么难度,
    就算歌单是动态加载的,找起来应该也没有什么难度,但是事实是对现在的我确实是蛮难的。
    右键网页源代码,搜索Rain after Summer(歌单第一首歌)发现果然是没有的
    在这里插入图片描述
    接下来便是在f12中查找,确实发现了歌单的信息,本来接下来就是
    在这里插入图片描述
response = requests.get(url,headers=DEFAULT_REQUEST_HEADERS)

但即使发所有的request headers都加上了,这部分内容页面没能显示出来,要是有朋友知道这是怎么回事,希望可以多多指教。
但是我们是不能在一颗树上吊死的,既然这个方法行不通,那么就使别的方法,这次我是使用了selenium,但是用这个的时候也遇见一个坑了,在使用selenium之后本来以为所有问题都会迎刃而解的,但是发现仍然搜索不到任何有关歌单的信息,就纠结测试了许久之后,终于发现了问题的所在,一切都源于他
在这里插入图片描述
这是一个iframe,歌单所有的消息都在这个里面,但是selenium是没有办法自动加载这个里面的内容的,这就导致了我们怎样都看不见歌单的消息。成功得到歌单信息之后,那么就可以开始我们的下载大业了,下面就开始说代码了,里面遇见的问题再一边分析。

使用scrapy进行爬虫,scrapy框架目录结构如下:
在这里插入图片描述
在使用命令行创建scrapy之后,首先是在setting.py中将机器人协议改为false࿰

基于Python Scrapy实现的网易云音乐music163数据爬取爬虫系统 含全部源代码 基于Scrapy框架的网易云音乐爬虫,大致爬虫流程如下: - 以歌手页为索引页,抓取到全部歌手; - 从全部歌手页抓取到全部专辑; - 通过所有专辑抓取到所有歌曲; - 最后抓取歌曲的精彩评论。 数据保存到`Mongodb`数据库,保存歌曲的歌手,歌名,专辑,和热评的作者,赞数,以及作者头像url。 抓取评论者的头像url,是因为如果大家喜欢,可以将他做web端。 ### 运行: ``` $ scrapy crawl music ``` #!/usr/bin/python #-*-coding:utf-8-*- import time from pprint import pprint from scrapy.spider import BaseSpider from scrapy.selector import HtmlXPathSelector from scrapy.http import Request from woaidu_crawler.items import WoaiduCrawlerItem from woaidu_crawler.utils.select_result import list_first_item,strip_null,deduplication,clean_url class WoaiduSpider(BaseSpider): name = "woaidu" start_urls = ( 'http://www.woaidu.org/sitemap_1.html', ) def parse(self,response): response_selector = HtmlXPathSelector(response) next_link = list_first_item(response_selector.select(u'//div[@class="k2"]/div/a[text()="下一页"]/@href').extract()) if next_link: next_link = clean_url(response.url,next_link,response.encoding) yield Request(url=next_link, callback=self.parse) for detail_link in response_selector.select(u'//div[contains(@class,"sousuolist")]/a/@href').extract(): if detail_link: detail_link = clean_url(response.url,detail_link,response.encoding) yield Request(url=detail_link, callback=self.parse_detail) def parse_detail(self, response): woaidu_item = WoaiduCrawlerItem() response_selector = HtmlXPathSelector(response) woaidu_item['book_name'] = list_first_item(response_selector.select('//div[@class="zizida"][1]/text()').extract()) woaidu_item['author'] = [list_first_item(response_selector.select('//div[@class="xiaoxiao"][1]/text()').extract())[5:].strip(),] woaidu_item['book_description'] = list_first_item(response_selector.select('//div[@class="lili"][1]/text()').extract()).strip() woaidu_item['book_covor_image_url'] = list
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值