最近,博主喜欢上了听歌,但是又苦于找不到好音乐,于是就打算到网易云的歌单中逛逛

本着 “用技术改变生活” 的想法,于是便想着写一个爬虫爬取网易云的歌单,并按播放量自动进行排序

这篇文章,我们就来讲讲怎样爬取网易云歌单,并将歌单按播放量进行排序,下面先上效果图

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')

这样,得到目前网易云音乐中播放量排名前十的歌单如下(哈哈,又可以愉快的听歌啦):

  1. 2018年度最热新歌TOP100
  2. 听说你也在找好听的华语歌
  3. 精选 | 网络热歌分享
  4. 隔壁老樊的孤单
  5. 温柔暴击 | 沉溺于男友音的甜蜜乡
  6. 谁说翻唱不好听
  7. 若是心怀旧梦 就别再无疾而终
  8. KTV必点:有没有一首歌,唱着唱着就泪奔
  9. 化妆拍照BGM.
  10. 会讲故事的男声 歌词唱的太像自己

注意:本项目代码仅作学习交流使用!!!

转载于:https://www.cnblogs.com/wsmrzx/p/10684680.html

爬虫实战(二) 用Python爬取网易云歌单相关推荐

  1. 爬虫python代码网易云_爬虫实战(二) 用Python爬取网易云歌单

    最近,博主喜欢上了听歌,但是又苦于找不到好音乐,于是就打算到网易云的歌单中逛逛 本着 "用技术改变生活" 的想法,于是便想着写一个爬虫爬取网易云的歌单,并按播放量自动进行排序 这篇 ...

  2. python爬虫实例网易云-爬虫实战(二) 用Python爬取网易云歌单

    最近,博主喜欢上了听歌,但是又苦于找不到好音乐,于是就打算到网易云的歌单中逛逛 本着 "用技术改变生活" 的想法,于是便想着写一个爬虫爬取网易云的歌单,并按播放量自动进行排序 这篇 ...

  3. 运用Python——爬取网易云歌单的全部歌曲热评_爬虫的简单应用

    导航 ·运用Python--爬虫_网易云音乐热评 ·运用Python--游戏_四子棋_劳拉下棋 文章目录 导航 1.展示截图 2.代码 3.分析 常量的定义.界面设计 依次爬取歌曲信息 创建表格 爬取 ...

  4. python爬取网易云歌单

    写在前面: 我的博客已迁移至自建服务器:博客传送门,CSDN博客暂时停止,如有机器学习方面的兴趣,欢迎来看一看. 此外目前我在gitHub上准备一些李航的<统计学习方法>的实现算法,目标将 ...

  5. python爬取网易云歌单_详解python selenium 爬取网易云音乐歌单名

    目标网站: 首先获取第一页的数据,这里关键要切换到iframe里 打印一下 获取剩下的页数,这里在点击下一页之前需要设置一个延迟,不然会报错. 结果: 一共37页,爬取完毕后关闭浏览器 完整代码: u ...

  6. Python爬虫实战: 爬取网易云歌单

    这篇文章,我们就来讲讲怎样爬取网易云歌单,并将歌单按播放量进行排序,下面先上效果图 1.用 requests 爬取网易云歌单 打开 网易云音乐 歌单首页,不难发现这是一个静态网页,而且格式很有规律,爬 ...

  7. python爬网易歌单_Python爬取网易云歌单

    1. 关键点 使用单线程爬取,未登录,爬取网易云歌单主要有三个关键点: url为https://music.163.com/discover/playlist/?order=hot&cat=% ...

  8. Python爬虫-selenium爬取网易云歌单

    文章目录 (一)工欲善其事必先利其器-安装工具 Selenium 浏览器 (二)实战 (一)工欲善其事必先利其器-安装工具 Selenium Selenium是一个强大的网络数据采集工具,其最初是为网 ...

  9. java爬取网易云歌单_爬虫爬取网易云歌单

    一.主题式网络爬虫设计方案 1.主题式网络爬虫名称:爬取网易云音乐歌单 2.主题式网络爬虫爬取的内容与数据特征分析 爬取网易云音乐歌单前十页歌单,轻音乐类型的歌单名称.歌单播放量.歌单链接.用户名称. ...

最新文章

  1. 大学python和vb哪个简单-vb和python哪个速度快
  2. Hive的安装-Hive配置
  3. 用Hibernate tool从实体对象生成数据库表
  4. matlab+text+extent,MATLAB字体及特殊符号标示方法
  5. SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘staff_info.depart_id‘ in ‘where clause‘
  6. 150万元重奖!阿里软件供应链安全大赛正式启动
  7. python格式化字符串4种方法
  8. 关于Vue vue-cli安装遇到的一些问题
  9. Single Image Haze Removal Using Dark Channel Prior(使用暗通道先验去除单张图像雾霾)
  10. vmrc安装出现:未能安装 HCmon 驱动程序 (Failed to install the HCmon driver)
  11. linux火狐怎么切换到ie内核,如何切换浏览器火狐 FIREFOX和IE之间切换
  12. HashMap底层原理与扩容机制
  13. oracle ogg操作日志,对一段Oracle GoldenGate (OGG) 传输过程日志(.rpt文件)的解释...
  14. 服务器 运行时错误怎么办,内部服务器错误怎么办
  15. Silverlight轻量级查询对比
  16. 中国SaaS驶入「2.0时代」
  17. 【条形码教程】如何批量识别条形码重命名图片,条形码条码识别批量识别快递单据条码并以条码重命名的方法
  18. java中暴力是啥方法_[蓝桥杯][历届试题]回文数字 中规中矩的暴力方法(Java代码)...
  19. Android:根据GPS信息在地图上定位
  20. Python 多线程学习

热门文章

  1. 自己动手理解NRV优化
  2. 高新技术企业认定条件条件 高企认定要求
  3. JBoss Rules 学习
  4. 计算机二级excel(01)
  5. Windows远程桌面端口卡巴斯基端口设置 2021-10-11
  6. 一、Spring框架概述
  7. 关于Virtual PC
  8. KEIL5与Proteus联调设置
  9. html5移动web开发简答题,HTML5移动Web开发简单知识点介绍
  10. BigData:基于python编程—根据中国各个城市地理坐标+人口、GDP大数据进行标记中国地图、热点图、动态图