50行代码实现爬取网易云歌单
2021年1月1更新:网易云的前端逻辑好像修改了,这个代码失效了。:(
需求分析
使用网易云的歌单URL:http://music.163.com/playlist?id=3233380300
获取歌单的详细信息,如:歌单作者,歌单名称,歌单内的歌曲
效果展示
步骤如下
先去看看歌单url 的详情,用浏览器打开网址http://music.163.com/playlist?id=3233380300
内容如下
按右键点击查看网页源代码,发现html内容都是JS加载的,所以不能直接用requests请求网页解析内容
回到歌单页,右键点击检查,选择network或者网络
点击红色按钮旁边的stop按钮
再刷新一遍网页(按快捷键:F5),等网页加载出来以后再点击红色按钮
上述三步操作,我们就完成了一次对网页的请求,并对网页的请求进行了抓包,下面的表格展示的就是我们请求获取的内容
通过查看表格,我们可以找到一个文件名为playlist?id=
这个就是歌单的接口,我们点击这个文件
我们再浏览一下这个文件,看一下它的结构
发现就是这个文件,我们查看一下这个网页的请求结构
分析:
- 我们已经找到了歌单内容的URL
- 我们用requests模拟浏览器去请求这个网页,就会得到Response里的内容
- 最后解析获取到的网页内容,就可以了
准备部分:
先用pip安装requests,bs4,lxml 库
windows用户:windoows键+r输入cmd,回车
输入以下命令
pip install requests
pip install Beautifulsoup4
pip install lmxl
代码部分:
import requests
from bs4 import BeautifulSoup as bs
# 这个函数用来请求网页,并返回网页的内容
def requests_html(url):
# 我们增加一个headers,如果不加,网易云会认为我们是爬虫程序,从而拒绝我们的请求
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE',
}
# 利用requests模块请求网易云的歌单页面
demo = requests.get(url, headers=headers)
return demo.content
# 解析html的内容
def parser_html(txt):
soup = bs(txt, 'lxml')
# u1标签包含所有歌曲信息
u1 = soup.find('ul', class_="f-hide")
# song_lists_name 是歌单名称
song_lists_name = soup.find('h2', class_="f-ff2 f-brk").string
# author_name 是歌单作者名称
author_name = soup.find('a', class_="s-fc7").string
# 对歌单信息遍历,
li_list = u1.findAll('li')
# 输出歌单,歌单作者
print("歌单名称:",song_lists_name)
print("歌单作者:",author_name)
for i in li_list:
a = i.find('a')
# id是歌曲的id,保留下来我们以后有用
id = a.get('href').split('=')[-1]
# name是歌曲的名字
name = a.get_text()
string = id + ',' + name + '\n'
# 输出每首歌的内容
print("歌单内每首歌的信息:",string)
# url中的信息就是歌单链接,可以试试你自己的链接
url = 'https://music.163.com/playlist?id=3233380300'
# text里就是网页的内容了
text = requests_html(url)
# 把text里的内容交给parser_html函数解析
parser_html(text)