博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
骚年,还在为歌荒发愁吗?python教你爬取网易云热门歌单
阅读量:6590 次
发布时间:2019-06-24

本文共 3122 字,大约阅读时间需要 10 分钟。

需求分析

每当歌荒时,总想找那些播放量比较高的歌单听,毕竟这么多人选择的歌单歌曲质量总会有保证.

爬取目标

本文将提取网易云音乐 播放量在1000万 以上的歌单名称,播放量和链接地址.

准备工作

保证电脑安装了 python3.6 和已经安装好了 selenium 库.没安装的可通过 在终端输入 pip install selenium 进行安装.

爬取分析

打开歌单的 url:http://music.163.com/#/discover/playlist.用 Chrome 的开发者工具 (F12) 分析.

骚年,还在为歌荒发愁吗?python教你爬取网易云热门歌单

页面详情

发现歌单信息在<ul class='m-cvrlst f-cb' id='m-pl-container'>下的 <li>标签中.

因此我们可以通过以下代码获取歌单信息:from selenium import webdrive url = http://music.163.com/#/discover/playlist browser = webdrive.Chrome() brows.get(url) data = browser.find_element_by_id('m-pl-container').find_elements_by_tag_name('li')

但是我们会发现无法获取歌单信息,原因是注意看图片最前面发现有个 <iframe>标签,因此导致我们无法定位,故需要在获取数据前加一行代码定位browser.switch_to.frame('contentFrame'),这样我们就可以获取数据了.关于selenium定位的问题可以访问https://blog.csdn.net/huilan_same/article/details/52200586 更详细的了解.

获取歌单详细信息

骚年,还在为歌荒发愁吗?python教你爬取网易云热门歌单

页面详情

通过上图我们发现歌单名和地址在<a title="| 粤语 | 宇宙粒子与每个人的爱情" href="/playlist?id=2220301639" class="msk"></a>中,播放量在<span class="nb">14万</span>中.接下来我们来获取首页的歌单信息.抓取首页

from selenium import webdriver import csv browser = webdr.Chrome() csv_file = open('playlist.csv', 'w', newline='', encoding='utf-8') #注意此处必须得加 encoding='utf-8,不然遇到歌单名包含特殊字符会报错 writer = csv.writer(csv_file) writer.writerow(['标题', '播放数', '链接']) url = 'http://music.163.com/#/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=0' browser.get(url) browser.switch_to.frame('contentFrame') data = browser.find_element_by_id('m-pl-container').find_elements_by_tag_name('li') for i in range(len(data)):  nb = data[i].find_element_by_class_name('nb').text  if '万' in nb and int(nb.split('万')[0]) > 1000:  msk = data[i].find_element_by_css_selector('a.msk')  writer.writerow([msk.get_attribute('title'), nb, msk.get_attribute('href')]) csv_file.close()

获取所有页面

骚年,还在为歌荒发愁吗?python教你爬取网易云热门歌单

页面数据

通过分析我们发现每一页的地址只是 offset 发生了偏移,即每一页加 35,有人可能会想到用改变 offset 的方法来获得所有页面数据,我试过,会报错,无法找到页面,不知道是我方法不对还是怎么滴,有兴趣的可以试一下这里我们采取另一种方法来获取所有页面数据.

观察最后一行有个文本是下一页,而且 class='zbtn znxt',前面显示页面数据的class='zpgi'.一次我们可以通过class='zbtn znxt'来获取所有数据信息.

注意:使用webdrive.Chrome()会打开浏览器,每跳一个页面就会打开浏览器一次.我们可以将其换成chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') browser = webdriver.Chrome(chrome_options=chrome_options),它把网站加载到内存并执行页面上的JavaScript,但是它不会向用户展示网页的图形界面.

完整代码

from selenium import webdriver import csv chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') browser = webdriver.Chrome(chrome_options=chrome_options) csv_file = open('playlist.csv', 'w', newline='', encoding='utf-8') writer = csv.writer(csv_file) writer.writerow(['标题', '播放数', '链接']) url = 'http://music.163.com/#/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=0' while url != 'javascript:void(0)':  browser.get(url)  browser.switch_to.frame('contentFrame')  data = browser.find_element_by_id('m-pl-container').find_elements_by_tag_name('li')  for i in range(len(data)):  nb = data[i].find_element_by_class_name('nb').text  if '万' in nb and int(nb.split('万')[0]) > 1000:  msk = data[i].find_element_by_css_selector('a.msk')  writer.writerow([msk.get_attribute('title'), nb, msk.get_attribute('href')])  url = browser.find_element_by_css_selector('a.zbtn.znxt').get_attribute('href') csv_file.close()
你可能感兴趣的文章
iOS下JS与OC互相调用(七)--Cordova 基础
查看>>
Three.js 关于立方体贴图产生边缘锯齿问题
查看>>
Nacos v0.7.0:对接CMDB,实现基于标签的服务发现能力
查看>>
【开发问题记录①】关于滑动CollectionView时ContentSize变化的问题
查看>>
java中GC的基本概念
查看>>
building xxx gradle project info的解决办法
查看>>
Vagrant (一) - 基本知识
查看>>
在 CentOS 7 上搭建 Jenkins + Maven + Git 持续集成环境
查看>>
数据结构与算法 | Leetcode 19. Remove Nth Node From End of List
查看>>
一起来读you don't know javascript(一)
查看>>
[LeetCode] 862. Shortest Subarray with Sum at Least K
查看>>
【分享】终端命令工具 自动生成vue组件文件以及修改router.js
查看>>
[LeetCode] Student Attendance Record I
查看>>
PHP回顾之多进程编程
查看>>
spring boot + redis
查看>>
Ajax技术细节
查看>>
nuxt.js部署vue应用到服务端过程
查看>>
删除数组中的指定元素 | JavaScript
查看>>
CSS3+JS实现静态圆形进度条【清晰、易懂】
查看>>
关于树形插件展示中数据结构转换的算法
查看>>