包含编程籽料、学习路线图、爬虫代码、安装包等!【点击领取】
一、前言
网易云音乐作为国内流行的音乐平台,拥有海量的音乐资源和用户数据。本教程将介绍如何使用Python爬取网易云音乐的数据,包括歌曲信息、评论、用户信息等。请注意,本教程仅用于学习交流,请遵守相关法律法规和网站的使用条款。
二、准备工作
- 所需工具和库
Python 3.x
requests库(发送HTTP请求)
BeautifulSoup4(解析HTML)
selenium(处理动态加载内容,可选)
PyExecJS(执行JavaScript代码,可选)
pip install requests beautifulsoup4 selenium pyexecjs
- 分析网易云音乐网页结构
网易云音乐采用了前后端分离的架构,大部分数据通过API接口返回JSON格式数据。我们可以通过浏览器开发者工具(F12)分析网络请求。
三、爬取歌曲基本信息
3. 通过网页版获取歌曲信息
import requests
from bs4 import BeautifulSoup
def get_song_info(song_id):
url = f'https://music.163.com/song?id={song_id}'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
# 提取歌曲名称
title = soup.find('meta', {'property': 'og:title'})['content']
# 提取歌手
artist = soup.find('meta', {'property': 'og:music:artist'})['content']
# 提取专辑
album = soup.find('meta', {'property': 'og:music:album'})['content']
return {
'title': title,
'artist': artist,
'album': album,
'song_id': song_id
}
# 示例:爬取周杰伦的"晴天"(歌曲ID:386538)
print(get_song_info(386538))
- 通过API接口获取歌曲信息
网易云音乐提供了许多未公开的API接口,我们可以通过这些接口直接获取JSON格式的数据。
def get_song_info_api(song_id):
url = 'https://music.163.com/api/song/detail/'
params = {
'ids': f'[{song_id}]'
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers, params=params)
data = response.json()
song = data['songs'][0]
return {
'name': song['name'],
'artist': '、'.join([ar['name'] for ar in song['ar']]),
'album': song['al']['name'],
'duration': song['dt'] // 1000 # 转换为秒
}
print(get_song_info_api(386538))
四、爬取歌曲评论
网易云音乐的评论数据需要通过API获取,且部分接口有加密参数。
- 获取热门评论
def get_hot_comments(song_id, limit=15):
url = 'https://music.163.com/weapi/v1/resource/comments/R_SO_4_{}'.format(song_id)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Referer': 'https://music.163.com/song?id={}'.format(song_id)
}
# 这里需要构造加密参数,实际使用时需要补充加密算法
data = {
'params': '加密参数',
'encSecKey': '加密key'
}
response = requests.post(url, headers=headers, data=data)
comments = response.json()['hotComments'] if 'hotComments' in response.json() else []
result = []
for comment in comments[:limit]:
result.append({
'user': comment['user']['nickname'],
'content': comment['content'],
'likedCount': comment['likedCount'],
'time': comment['time']
})
return result
# 注意:实际使用时需要处理加密参数
# print(get_hot_comments(386538))
- 处理加密参数(简化版)
网易云音乐使用了复杂的加密算法,这里提供一个简化版的解决方案:
import execjs
def get_encrypted_params(text):
# 需要准备网易云音乐的加密JS代码
with open('netease_encrypt.js', 'r', encoding='utf-8') as f:
js_code = f.read()
ctx = execjs.compile(js_code)
return ctx.call('encrypt', text)
# 实际使用时需要完整的加密JS文件
五、爬取用户信息
- 获取用户基本信息
def get_user_info(user_id):
url = f'https://music.163.com/api/v1/user/detail/{user_id}'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)
data = response.json()
return {
'nickname': data['profile']['nickname'],
'signature': data['profile']['signature'],
'follows': data['profile']['follows'],
'followeds': data['profile']['followeds'],
'playlistCount': data['profile']['playlistCount']
}
# print(get_user_info(123456)) # 替换为真实用户ID
六、使用Selenium处理动态内容
对于部分动态加载的内容,我们可以使用Selenium模拟浏览器操作。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def get_playlist_songs_selenium(playlist_id):
url = f'https://music.163.com/playlist?id={playlist_id}'
# 使用Chrome浏览器
options = webdriver.ChromeOptions()
options.add_argument('--headless') # 无头模式
driver = webdriver.Chrome(options=options)
driver.get(url)
# 切换到iframe
driver.switch_to.frame('g_iframe')
# 等待元素加载
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.ttc')))
# 提取歌曲信息
songs = []
song_elements = driver.find_elements(By.CSS_SELECTOR, '.ttc')
for song in song_elements:
songs.append({
'name': song.find_element(By.TAG_NAME, 'b').get_attribute('title'),
'href': song.find_element(By.TAG_NAME, 'a').get_attribute('href')
})
driver.quit()
return songs
# print(get_playlist_songs_selenium(123456)) # 替换为真实歌单ID
七、反爬虫策略与应对方法
网易云音乐有以下反爬虫措施:
请求频率限制:控制请求间隔,建议2-3秒一次
User-Agent检查:设置合理的User-Agent
加密参数:需要分析JavaScript代码
登录验证:部分内容需要登录后才能访问
应对建议:
使用代理IP池
合理设置请求间隔
模拟登录获取cookie
使用Selenium模拟人类操作
八、完整案例:爬取歌单所有歌曲及评论
import time
import random
def get_playlist_songs(playlist_id):
url = f'https://music.163.com/api/playlist/detail?id={playlist_id}'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)
data = response.json()
songs = []
for track in data['result']['tracks']:
songs.append({
'id': track['id'],
'name': track['name'],
'artists': '、'.join([ar['name'] for ar in track['artists']]),
'album': track['album']['name']
})
return songs
def crawl_playlist(playlist_id, comment_limit=5):
print(f"开始爬取歌单 {playlist_id}...")
songs = get_playlist_songs(playlist_id)
result = []
for song in songs:
print(f"处理歌曲: {song['name']} - {song['artists']}")
# 获取评论(简化版,实际需要处理加密)
# comments = get_hot_comments(song['id'], comment_limit)
result.append({
'song_info': song,
# 'comments': comments
})
# 随机延迟,避免被封
time.sleep(random.uniform(1, 3))
return result
# 示例歌单ID
# playlist_data = crawl_playlist(123456)
# print(playlist_data)
九、注意事项
法律与道德:遵守网易云音乐的使用条款,不要大规模爬取数据
版权问题:不要爬取和传播受版权保护的音乐文件
隐私保护:不要收集和传播用户隐私信息
服务器负载:控制请求频率,避免给服务器造成过大压力
十、总结
本教程介绍了如何使用Python爬取网易云音乐的数据,包括:
歌曲基本信息获取
评论数据爬取
用户信息获取
使用Selenium处理动态内容
反爬虫策略应对
完整项目还需要处理加密参数、登录验证等问题。希望本教程能帮助你理解网络爬虫的基本原理和实现方法。
最后:
希望你编程学习上不急不躁,按照计划有条不紊推进,把任何一件事做到极致,都是不容易的,加油,努力!相信自己!
文末福利
最后这里免费分享给大家一份Python全套学习资料,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以和我一起来学习交流呀。
包含编程资料、学习路线图、源代码、软件安装包等!【点击这里领取!】
① Python所有方向的学习路线图,清楚各个方向要学什么东西
② 100多节Python课程视频,涵盖必备基础、爬虫和数据分析
③ 100多个Python实战案例,学习不再是只会理论
④ 华为出品独家Python漫画教程,手机也能学习