爬取网易云热门音乐歌单

需求分析

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

爬取目标

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

准备工作

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

爬取分析

打开歌单的 url:http://music.163.com/#/discover/playlist.用 Chrome 的开发者工具 (F12) 分析.
页面详情
发现歌单信息在<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.youkuaiyun.com/huilan_same/article/details/52200586 更详细的了解.

获取歌单详细信息

页面详情
通过上图我们发现歌单名和地址在<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()

获取所有页面

页面数据
通过分析我们发现每一页的地址只是 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()
### 使用 Python 爬虫抓取网易云音乐歌手歌单数据 为了实现这一目标,可以采用如下方法: #### 准备工作 确保安装必要的库来支持网络请求和解析 HTML 文档。通常会使用 `requests` 库来进行 HTTP 请求操作,并利用 `BeautifulSoup` 或者 `lxml` 来处理页面内容。 ```bash pip install requests beautifulsoup4 lxml ``` #### 获取登录状态下的网页源码 由于部分资源可能仅限于登录用户访问,因此需要模拟浏览器行为完成自动登录过程[^4]。这一步骤对于获取完整的歌曲列表至关重要,因为未登录状态下某些 API 接口返回的数据量有限制。 #### 构建 URL 和发送 GET 请求 构建用于查询特定艺术家作品集的 URL 地址模式,例如 `/artist/album?id=ARTIST_ID` ,其中 ARTIST_ID 是具体的艺人编号。接着向该链接发起 GET 请求以取得响应体中的 JSON 数据结构或其他形式的内容。 #### 解析 JSON 响应提取所需字段 当接收到服务器端传回的信息后,需对其进行分析以便定位到感兴趣的部分——即各个专辑内的曲目详情。一般情况下,这些资料会被封装在一个数组里,每个元素代表一首独立的作品,包含名称、演唱者姓名以及播放地址等属性。 #### 创建本地存储目录保存文件 按照一定规则组织好要储存的目标路径,比如依据艺人的名字建立子文件夹存放其全部录音制品;同时也要考虑到异常情况的发生,像遇到空白标题时则默认放置于“未知歌单”之下[^3]。 ```python import os import json import requests from bs4 import BeautifulSoup def get_artist_songs(artist_id): url = f"https://music.163.com/api/v1/resource/comments/R_SO_4_{artist_id}?limit=999" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', # Add more header fields as necessary to mimic a real browser request. } response = requests.get(url, headers=headers) if response.status_code != 200: raise Exception(f"Failed to fetch data from {url}") songs_data = response.json() song_list = [] for item in songs_data['hotComments']: try: content = item["content"] liked_count = item["likedCount"] formatted_item = {"comment": content, "likes": liked_count} song_list.append(formatted_item) except KeyError as e: print(f'Missing key: {e}') return song_list if __name__ == "__main__": artist_id = input("请输入想要抓取的歌手ID:") all_songs = get_artist_songs(artist_id) output_dir = './artists/' if not os.path.exists(output_dir): os.mkdir(output_dir) with open(os.path.join(output_dir,f'{artist_id}.json'), mode='w', encoding='utf8') as file_obj: json.dump(all_songs, fp=file_obj, ensure_ascii=False) print('爬取完毕') ``` 此脚本展示了如何基于给定的 Artist ID 抓取相关评论信息并将其导出为 JSON 文件存放在指定位置。实际应用中还需要进一步完善错误处理机制及优化性能表现等方面的工作。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值