Python3.7 爬虫(三)使用 Urllib2 与 BeautifulSoup4 爬取网易云音乐歌单

xiaoxiao2025-06-24  18

废话

在前面的的博客中我们已经能够使用 python3 配合自带的库或者第三方库抓取以及解析网页,我们今天来试试抓取网易云音乐的歌单信息

分析网页

要战胜敌人,必须要先了解敌人,然后设计对策,一招致命! 首先浏览器打开网页,按下 F12:http://music.163.com/#/discover/playlist

我们现在来分析网页

点击右侧界面中的 Network 进入网络请求分析界面,如下:

上图中我们可以看到请求还分了类型的,这里我们查看类型为 document 的条目,看着 playlist 条目比较像是包含歌单的文件,于是我们点击 playlist 条目:

点击 preview, 如上图,我们左边的歌单在右边找到了,看来就是这个请求获取到了歌单。 然后我们点击 Headers 界面,来到请求头信息界面:

可以看到,这条请求的网址是:http://music.163.com/discover/playlist ,向下翻还可以发现,host 为 music.163.com,下面我们就可以来获取网页数据了,不过现在网址变成了:http://music.163.com/discover/playlist

抓取 html

网页内容获取,按照三部曲来做 - 直接通过网址访问,看能否取到需要的 html (一般是不可能的) - 通过设置 headers,一开始就设置一个 UA,如:headers={ 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'} 不过一般来说是可以通过正确获得 html 的,但是有些网站会判断 host 是否是自己,所以有的时候我们还需要加上(这里以我们要访问的网易歌单界面来作为例子):'Host': 'music.163.com' - 一开始能获取,多次调试后不能获取了?这个是网站检测到你的 IP 访问次数过多而禁止你访问了(也就是防止)我们就需要设置代理来避免这个问题。示例代码如下:

import urllib2 enable_proxy = True proxy_handler = urllib2.ProxyHandler({"http" : 'http://some-proxy.com:8080'}) null_proxy_handler = urllib2.ProxyHandler({}) if enable_proxy: opener = urllib2.build_opener(proxy_handler) else: opener = urllib2.build_opener(null_proxy_handler) urllib2.install_opener(opener)

通过上面的分析我们就通过网址: http://music.163.com/discover/playlist 来获取歌单, 先直接获取,不设置 Headers,运行,发现就输出了:

这样我们就可以开始解析 html 了,不过我还是建议添加上 UA 与 host ,养成一个习惯,不要每次都试来浪费时间。于是我们获取 html 的代码如下:

# 爬取网易云音乐的爬虫 # -*- coding: utf-8 -*- import urllib.request import urllib def gethtml(url, headers={}): req = urllib.request.Request(url, headers=headers) response = urllib.request.urlopen(req) content = response.read().decode('utf-8') response.close() return content url = 'http://music.163.com/discover/playlist' url = gethtml(url, headers={ 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)', 'Host': 'music.163.com' }) print(url)

解析 html

这里我们使用 BeautifulSoup4 使用 css 选择器来选择元素来解析 html ,回到浏览器 F12,来分析怎么获得需要的信息:

如图,从上到下依次的信息是 - 歌单封面 - 歌单名称与链接 - 歌单播放量 - 歌单创建人以及创建人主页

那么我们现在就来以此通过css 选出包含内容的最小标签。 封面图片 img 标签

soup.select('ul#m-pl-container li div img')

歌单名称与链接 a 标签

soup.select('ul#m-pl-container li div a.msk')

歌单播放量 span 标签

soup.select('div.bottom span.nb')

歌单创建人与创建人主页

soup.select('ul#m-pl-container li p a')

然后我们通过遍历来输出这些标签中的信息,完整代码如下:

# 爬取网易云音乐的爬虫 # -*- coding: utf-8 -*- from bs4 import BeautifulSoup import urllib.request import urllib #获取网页 def gethtml(url, headers={}): req = urllib.request.Request(url, headers=headers) response = urllib.request.urlopen(req) content = response.read().decode('utf-8') response.close() return content #解析音乐列表网页 def parsehtmlMusicList(html): soup = BeautifulSoup(html, 'lxml') list_pic = soup.select('ul#m-pl-container li div img') list_nameUrl = soup.select('ul#m-pl-container li div a.msk') list_num = soup.select('div.bottom span.nb') list_author = soup.select('ul#m-pl-container li p a') n = 0 length = len(list_pic) while n < length: print('歌单图片:'+list_pic[n]['src']+'\n\n') print('歌单名称:'+list_nameUrl[n]['title']+'\n\n歌单地址:'+list_nameUrl[n]['href']+'\n\n') print('歌单播放量:'+list_num[n].text+'\n\n') print('歌单作者:'+list_author[n]['title']+'\n\n作者主页:'+list_author[n]['href']+'\n\n\n') n += 1 url = 'http://music.163.com/discover/playlist' url = gethtml(url, headers={ 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)', 'Host': 'music.163.com'}) parsehtmlMusicList(url)

最终效果如下:

转载请注明原文地址: https://www.6miu.com/read-5032389.html

最新回复(0)