零基础15行python代码搞定网易云热门歌单

健身、吃饭、敲代码;等车、撸猫、下午茶……若能佐以合适的音乐当“配餐”,总是惬意非常。本文就将带你爬一爬网易云的那些热门歌单!

心情好或心情坏,点一首歌抚慰你受伤或躁动的心灵——下面教你用 15 行代码搞定热门歌单!

本文使用的是 Selenium 模块,它是一个自动化测试工具,利用它我们可以驱动浏览器执行特定的动作,如点击、下拉等操作,对于一些 JavaScript 渲染的页面来说,此种抓取方式非常有效。

采用了 Chrome 浏览器配合 Selenium 工作,本文的 Python 版本是 3.7.2。

准备工作

  1. 若你的环境中没有 Selenium 模块,直接使用 pip 安装即可:
1
pip install selenium
  1. 打开谷歌浏览器,检查Chrome的版本:在浏览器地址中输入 chrome://settings/help 回车即可看到:

    02.png

  2. 打开 ChromeDriver 的官方网站(https://sites.google.com/a/chromium.org/chromedriver/downloads),寻找与你当前浏览器版本相对应的 ChromeDriver 下载:

    03.png

  3. 选择你自己的操作系统类型进行下载即可:

    04.png

  4. 以 Windows 为例,下载结束后,将 ChromeDriver 放置在 Python 安装目录下的 Scripts 文件夹即可:

    05.png

准备工作完成,代码写起来吧~

迷你爬虫的实现

我们这次的目标是爬取热门歌单,比如网易云音乐中播放量大于 1000万 的歌单信息(歌单名称、链接)。

  1. 先来打开网易云的歌单第一页:

    https://music.163.com/#/discover/playlist/

  2. 使用 Chrome 的开发者工具 进行分析:

    02-2.png

我们想要拿的信息全在这里:

msk,封面 [mask]:有歌单的名称及链接

nb,播放数 [number broadcast]:135万

  1. 我们还需要遍历所有的页,使用工具继续分析,找到“下一页”的 URL:

    02-3.png

  2. 切换至最后一页,拿到最后一页的 URL:

    02-4.png

  3. 等我们爬取完所有符合的歌单信息后,将其保存在本地;

  4. 全部工作结束,最后再通过下面的伪代码回顾下整体思路:

    02-6.png

  5. 爬取的效果如下:

    02-7.png

另附源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from selenium import webdriver

# 网易云音乐歌单列表第一页地址
url = 'https://music.163.com/#/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=0'
# 用Chrome接口创建一个Selenium的WebDriver
browser = webdriver.Chrome()

# 逐页解析,直至歌单列表的最后一页
while url != 'javacript:void(0)':
# 用WebDriver加载页面
browser.get(url)
# 切换至内容的iframe
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)):
# 获取歌单的播放量
num = data[i].find_element_by_class_name("nb").text
if '万' in num and int(num.split('万')[0]) > 1000:
# 获取播放量大于1000万的歌单封面
msk = data[i].find_element_by_css_selector("a.msk")
# 把歌单封面中的标题、链接以及播放量,存储在TXT文件中
with open("163playlist.txt", 'a', encoding='utf-8') as f:
f.write(' '.join([msk.get_attribute('title'), num, msk.get_attribute("href")]) + '\n' + '=' * 50 + '\n')
# 定位'下一页'的URL
url = browser.find_element_by_css_selector("a.zbtn.znxt").get_attribute("href")

# 结束调用
browser.close()
LLQ wechat
扫一扫上面的二维码可以关注我哦
坚持技术分享,您的支持将鼓励我继续创作!