爬虫实战(二) 用Python爬取网易云歌单
最近,博主喜欢上了听歌,但是又苦于找不到好音乐,于是就打算到网易云的歌单中逛逛
本着 “用技术改变生活” 的想法,于是便想着写一个爬虫爬取网易云的歌单,并按播放量自动进行排序
这篇文章,我们就来讲讲怎样爬取网易云歌单,并将歌单按播放量进行排序,下面先上效果图
1、用 requests 爬取网易云歌单
打开 网易云音乐 歌单首页,不难发现这是一个静态网页,而且格式很有规律,爬取起来应该十分简单
按照以前的套路,很快就可以写完代码,无非就是分为下面几个部分:
(1)获取网页源代码
这里我们使用 requests 发送和接收请求,核心代码如下:
import requests
def get_page(url):# 构造请求头部headers = {'USER-AGENT':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}# 发送请求,获得响应response = requests.get(url=url,headers=headers)# 获取响应内容html = response.textreturn html
(2)解析网页源代码
解析数据部分我们使用 xpath(对于 xpath 的语法不太熟悉的朋友,可以看看博主之前的文章)
文章传送门:
- 爬虫系列(九) xpath的基本使用
- 爬虫系列(十) 用requests和xpath爬取豆瓣电影
- 爬虫系列(十一) 用requests和xpath爬取豆瓣电影评论
核心代码如下:
from lxml import etree
# 解析网页源代码,获取数据
def parse4data(self,html):html_elem = etree.HTML(html)# 播放量play_num = html_elem.xpath('//ul[@id="m-pl-container"]/li/div/div/span[@class="nb"]/text()')# 歌单名称song_title = html_elem.xpath('//ul[@id="m-pl-container"]/li/p[1]/a/@title')# 歌单链接song_href = html_elem.xpath('//ul[@id="m-pl-container"]/li/p[1]/a/@href')song_link = ['https://music.163.com/#'+item for item in song_href]# 用户名称user_title = html_elem.xpath('//ul[@id="m-pl-container"]/li/p[2]/a/@title')# 用户链接user_href = html_elem.xpath('//ul[@id="m-pl-container"]/li/p[2]/a/@href')user_link = ['https://music.163.com/#'+item for item in user_href]# 将数据打包成列表,其中列表中的每一个元素是一个字典,每一个字典对应一份歌单信息data = list(map(lambda a,b,c,d,e:{'播放量':a,'歌单名称':b,'歌单链接':c,'用户名称':d,'用户链接':e},play_num,song_title,song_link,user_title,user_link))# 返回数据return data# 解析网页源代码,获取下一页链接
def parse4link(self,html):html_elem = etree.HTML(html)# 下一页链接href = html_elem.xpath('//div[@id="m-pl-pager"]/div[@class="u-page"]/a[@class="zbtn znxt"]/@href')# 如果为空,则返回 None;如果不为空,则返回链接地址if not href:return Noneelse:return 'https://music.163.com/#' + href[0]
(3)完整代码
import requests
from lxml import etree
import json
import time
import randomclass Netease_spider:# 初始化数据def __init__(self):self.originURL = 'https://music.163.com/#/discover/playlist'self.data = list()# 获取网页源代码def get_page(self,url):headers = {'USER-AGENT':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}response = requests.get(url=url,headers=headers)html = response.textreturn html# 解析网页源代码,获取数据def parse4data(self,html):html_elem = etree.HTML(html)play_num = html_elem.xpath('//ul[@id="m-pl-container"]/li/div/div/span[@class="nb"]/text()')song_title = html_elem.xpath('//ul[@id="m-pl-container"]/li/p[1]/a/@title')song_href = html_elem.xpath('//ul[@id="m-pl-container"]/li/p[1]/a/@href')song_link = ['https://music.163.com/#'+item for item in song_href]user_title = html_elem.xpath('//ul[@id="m-pl-container"]/li/p[2]/a/@title')user_href = html_elem.xpath('//ul[@id="m-pl-container"]/li/p[2]/a/@href')user_link = ['https://music.163.com/#'+item for item in user_href]data = list(map(lambda a,b,c,d,e:{'播放量':a,'歌单名称':b,'歌单链接':c,'用户名称':d,'用户链接':e},play_num,song_title,song_link,user_title,user_link))return data# 解析网页源代码,获取下一页链接def parse4link(self,html):html_elem = etree.HTML(html)href = html_elem.xpath('//div[@id="m-pl-pager"]/div[@class="u-page"]/a[@class="zbtn znxt"]/@href')if not href:return Noneelse:return 'https://music.163.com/#' + href[0]# 开始爬取网页def crawl(self):# 爬取数据print('爬取数据')html = self.get_page(self.originURL)data = self.parse4data(html)self.data.extend(data)link = self.parse4link(html)while(link):html = self.get_page(link)data = self.parse4data(html)self.data.extend(data)link = self.parse4link(html)time.sleep(random.random())# 处理数据,按播放量进行排序print('处理数据')data_after_sort = sorted(self.data,key=lambda item:int(item['播放量'].replace('万','0000')),reverse=True)# 写入文件print('写入文件')with open('netease.json','w',encoding='utf-8') as f:for item in data_after_sort:json.dump(item,f,ensure_ascii=False)if __name__ == '__main__':spider = Netease_spider()spider.crawl()print('Finished')
2、用 selenium 爬取网易云歌单
然而,事情真的有这么简单吗?
当我们运行上面的代码的时候,会发现解析网页源代码部分,返回的竟然是空列表!
这是为什么呢?敲重点,敲重点,敲重点,这绝对是一个坑啊!
我们重新打开浏览器,认真观察网页的源代码
原来,我们所提取的元素被包含在 标签内部,这样我们是无法直接进行定位的
因为 iframe 会在原有页面中加载另外一个页面,当我们需要获取内嵌页面的元素时,需要先切换到 iframe 中
明白了原理之后,重新修改一下上面的代码
思路是利用 selenium 获取原有网页,然后使用 switch_to.frame()
方法切换到 iframe 中,最后返回内嵌网页
对 selenium 的使用以及环境配置不清楚的朋友,可以参考博主之前的文章
- 爬虫系列(十二) selenium的基本使用
- 爬虫系列(十三) 用selenium爬取京东商品
需要修改的地方是获取网页源代码的函数,另外也需要在初始化数据的函数中实例化 webdriver,完整代码如下:
from selenium import webdriver
from lxml import etree
import json
import time
import randomclass Netease_spider:# 初始化数据(需要修改)def __init__(self):# 无头启动 seleniumopt = webdriver.chrome.options.Options()opt.set_headless()self.browser = webdriver.Chrome(chrome_options=opt)self.originURL = 'https://music.163.com/#/discover/playlist'self.data = list()# 获取网页源代码(需要修改)def get_page(self,url):self.browser.get(url)self.browser.switch_to.frame('g_iframe')html = self.browser.page_sourcereturn html# 解析网页源代码,获取数据def parse4data(self,html):html_elem = etree.HTML(html)play_num = html_elem.xpath('//ul[@id="m-pl-container"]/li/div/div/span[@class="nb"]/text()')song_title = html_elem.xpath('//ul[@id="m-pl-container"]/li/p[1]/a/@title')song_href = html_elem.xpath('//ul[@id="m-pl-container"]/li/p[1]/a/@href')song_link = ['https://music.163.com/#'+item for item in song_href]user_title = html_elem.xpath('//ul[@id="m-pl-container"]/li/p[2]/a/@title')user_href = html_elem.xpath('//ul[@id="m-pl-container"]/li/p[2]/a/@href')user_link = ['https://music.163.com/#'+item for item in user_href]data = list(map(lambda a,b,c,d,e:{'播放量':a,'歌单名称':b,'歌单链接':c,'用户名称':d,'用户链接':e},play_num,song_title,song_link,user_title,user_link))return data# 解析网页源代码,获取下一页链接def parse4link(self,html):html_elem = etree.HTML(html)href = html_elem.xpath('//div[@id="m-pl-pager"]/div[@class="u-page"]/a[@class="zbtn znxt"]/@href')if not href:return Noneelse:return 'https://music.163.com/#' + href[0]# 开始爬取网页def crawl(self):# 爬取数据print('爬取数据')html = self.get_page(self.originURL)data = self.parse4data(html)self.data.extend(data)link = self.parse4link(html)while(link):html = self.get_page(link)data = self.parse4data(html)self.data.extend(data)link = self.parse4link(html)time.sleep(random.random())# 处理数据,按播放量进行排序print('处理数据')data_after_sort = sorted(self.data,key=lambda item:int(item['播放量'].replace('万','0000')),reverse=True)# 写入文件print('写入文件')with open('netease.json','w',encoding='utf-8') as f:for item in data_after_sort:json.dump(item,f,ensure_ascii=False)if __name__ == '__main__':spider = Netease_spider()spider.crawl()print('Finished')
这样,得到目前网易云音乐中播放量排名前十的歌单如下(哈哈,又可以愉快的听歌啦):
- 2018年度最热新歌TOP100
- 听说你也在找好听的华语歌
- 精选 | 网络热歌分享
- 隔壁老樊的孤单
- 温柔暴击 | 沉溺于男友音的甜蜜乡
- 谁说翻唱不好听
- 若是心怀旧梦 就别再无疾而终
- KTV必点:有没有一首歌,唱着唱着就泪奔
- 化妆拍照BGM.
- 会讲故事的男声 歌词唱的太像自己
注意:本项目代码仅作学习交流使用!!!
转载于:https://www.cnblogs.com/wsmrzx/p/10684680.html
爬虫实战(二) 用Python爬取网易云歌单相关推荐
- 爬虫python代码网易云_爬虫实战(二) 用Python爬取网易云歌单
最近,博主喜欢上了听歌,但是又苦于找不到好音乐,于是就打算到网易云的歌单中逛逛 本着 "用技术改变生活" 的想法,于是便想着写一个爬虫爬取网易云的歌单,并按播放量自动进行排序 这篇 ...
- python爬虫实例网易云-爬虫实战(二) 用Python爬取网易云歌单
最近,博主喜欢上了听歌,但是又苦于找不到好音乐,于是就打算到网易云的歌单中逛逛 本着 "用技术改变生活" 的想法,于是便想着写一个爬虫爬取网易云的歌单,并按播放量自动进行排序 这篇 ...
- 运用Python——爬取网易云歌单的全部歌曲热评_爬虫的简单应用
导航 ·运用Python--爬虫_网易云音乐热评 ·运用Python--游戏_四子棋_劳拉下棋 文章目录 导航 1.展示截图 2.代码 3.分析 常量的定义.界面设计 依次爬取歌曲信息 创建表格 爬取 ...
- python爬取网易云歌单
写在前面: 我的博客已迁移至自建服务器:博客传送门,CSDN博客暂时停止,如有机器学习方面的兴趣,欢迎来看一看. 此外目前我在gitHub上准备一些李航的<统计学习方法>的实现算法,目标将 ...
- python爬取网易云歌单_详解python selenium 爬取网易云音乐歌单名
目标网站: 首先获取第一页的数据,这里关键要切换到iframe里 打印一下 获取剩下的页数,这里在点击下一页之前需要设置一个延迟,不然会报错. 结果: 一共37页,爬取完毕后关闭浏览器 完整代码: u ...
- Python爬虫实战: 爬取网易云歌单
这篇文章,我们就来讲讲怎样爬取网易云歌单,并将歌单按播放量进行排序,下面先上效果图 1.用 requests 爬取网易云歌单 打开 网易云音乐 歌单首页,不难发现这是一个静态网页,而且格式很有规律,爬 ...
- python爬网易歌单_Python爬取网易云歌单
1. 关键点 使用单线程爬取,未登录,爬取网易云歌单主要有三个关键点: url为https://music.163.com/discover/playlist/?order=hot&cat=% ...
- Python爬虫-selenium爬取网易云歌单
文章目录 (一)工欲善其事必先利其器-安装工具 Selenium 浏览器 (二)实战 (一)工欲善其事必先利其器-安装工具 Selenium Selenium是一个强大的网络数据采集工具,其最初是为网 ...
- java爬取网易云歌单_爬虫爬取网易云歌单
一.主题式网络爬虫设计方案 1.主题式网络爬虫名称:爬取网易云音乐歌单 2.主题式网络爬虫爬取的内容与数据特征分析 爬取网易云音乐歌单前十页歌单,轻音乐类型的歌单名称.歌单播放量.歌单链接.用户名称. ...
最新文章
- 大学python和vb哪个简单-vb和python哪个速度快
- Hive的安装-Hive配置
- 用Hibernate tool从实体对象生成数据库表
- matlab+text+extent,MATLAB字体及特殊符号标示方法
- SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘staff_info.depart_id‘ in ‘where clause‘
- 150万元重奖!阿里软件供应链安全大赛正式启动
- python格式化字符串4种方法
- 关于Vue vue-cli安装遇到的一些问题
- Single Image Haze Removal Using Dark Channel Prior(使用暗通道先验去除单张图像雾霾)
- vmrc安装出现:未能安装 HCmon 驱动程序 (Failed to install the HCmon driver)
- linux火狐怎么切换到ie内核,如何切换浏览器火狐 FIREFOX和IE之间切换
- HashMap底层原理与扩容机制
- oracle ogg操作日志,对一段Oracle GoldenGate (OGG) 传输过程日志(.rpt文件)的解释...
- 服务器 运行时错误怎么办,内部服务器错误怎么办
- Silverlight轻量级查询对比
- 中国SaaS驶入「2.0时代」
- 【条形码教程】如何批量识别条形码重命名图片,条形码条码识别批量识别快递单据条码并以条码重命名的方法
- java中暴力是啥方法_[蓝桥杯][历届试题]回文数字 中规中矩的暴力方法(Java代码)...
- Android:根据GPS信息在地图上定位
- Python 多线程学习