您好,登录后才能下订单哦!
# Python怎么爬取网易云音乐
## 前言
在当今大数据时代,网络爬虫技术成为了获取互联网数据的重要手段之一。作为国内最受欢迎的音乐平台之一,网易云音乐拥有海量的音乐资源和用户数据,这些数据对于音乐推荐、市场分析等场景具有重要价值。本文将详细介绍如何使用Python爬取网易云音乐的数据,包括歌曲信息、评论数据等。
## 准备工作
### 1. 环境配置
首先需要确保你的Python环境已经安装好,推荐使用Python 3.6及以上版本。此外,还需要安装以下必要的库:
```bash
pip install requests
pip install beautifulsoup4
pip install selenium
pip install pycryptodome
在开始爬取之前,我们需要先分析网易云音乐网站的结构和反爬机制:
网易云音乐的歌曲信息可以通过公开API获取,以下是获取歌曲基本信息的方法:
import requests
def get_song_info(song_id):
url = f'https://music.163.com/api/song/detail/?ids=[{song_id}]'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.json()
return None
# 示例:获取周杰伦《晴天》的信息(歌曲ID: 186721)
song_info = get_song_info(186721)
print(song_info)
类似地,我们可以获取歌手的基本信息:
def get_artist_info(artist_id):
url = f'https://music.163.com/api/artist/{artist_id}'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.json()
return None
# 示例:获取周杰伦的信息(歌手ID: 6452)
artist_info = get_artist_info(6452)
print(artist_info)
网易云音乐的核心API都采用了加密参数,我们需要破解这些加密才能获取更多数据。
网易云音乐主要使用了以下加密方式: - 参数加密:使用AES加密 - 签名生成:使用MD5和自定义算法
我们需要实现网易云音乐的加密算法:
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import base64
import hashlib
import random
import json
def aes_encrypt(text, key):
iv = '0102030405060708'
cipher = AES.new(key.encode(), AES.MODE_CBC, iv.encode())
padded_text = pad(text.encode(), AES.block_size)
encrypted = cipher.encrypt(padded_text)
return base64.b64encode(encrypted).decode()
def generate_params(data):
text = json.dumps(data)
key = '0CoJUm6Qyw8W8jud'
params = aes_encrypt(text, key)
params = aes_encrypt(params, 'a' * 16)
return params
def generate_encSecKey():
return '257348aecb5e556c066de214e531faadd1c55d814f9be95fd06d6bff9f4c7a41f831f6394d5a3fd2e3881736d94a02ca919d952872e7d0a50ebfa1769a7a62d512f5f1ca21aec60bc3819a9c3ffca5eca9a0dba6d6f7249b06f5965ecfff3695b54e1c28f3f624750ed39e7de08fc8493242e26dbc4484a01c76f739e135637c'
使用加密参数获取歌曲评论:
def get_song_comments(song_id, limit=20, offset=0):
url = 'https://music.163.com/weapi/v1/resource/comments/R_SO_4_{}?csrf_token='.format(song_id)
data = {
'rid': 'R_SO_4_' + str(song_id),
'offset': offset,
'total': 'true',
'limit': limit,
'csrf_token': ''
}
params = generate_params(data)
encSecKey = generate_encSecKey()
payload = {
'params': params,
'encSecKey': encSecKey
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': 'https://music.163.com/'
}
response = requests.post(url, data=payload, headers=headers)
if response.status_code == 200:
return response.json()
return None
# 示例:获取《晴天》的前20条评论
comments = get_song_comments(186721)
print(comments)
要获取用户私人数据或突破某些限制,需要模拟登录:
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 login_163(email, password):
driver = webdriver.Chrome()
driver.get('https://music.163.com/')
# 点击登录按钮
login_btn = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.LINK_TEXT, "登录"))
)
login_btn.click()
# 切换到iframe
WebDriverWait(driver, 10).until(
EC.frame_to_be_available_and_switch_to_it((By.ID, "g_iframe"))
)
# 选择邮箱登录
email_login = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.LINK_TEXT, "选择其他登录模式"))
)
email_login.click()
# 输入邮箱和密码
email_input = driver.find_element(By.NAME, 'email')
email_input.send_keys(email)
password_input = driver.find_element(By.NAME, 'password')
password_input.send_keys(password)
# 点击登录
submit_btn = driver.find_element(By.ID, 'dologin')
submit_btn.click()
# 等待登录完成
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "user-avatar"))
)
# 获取cookies
cookies = driver.get_cookies()
driver.quit()
return cookies
网易云音乐在频繁请求时会要求验证码,可以尝试以下方法:
获取到的数据可以存储到文件或数据库中:
import csv
def save_comments_to_csv(comments, filename):
with open(filename, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['用户ID', '昵称', '评论内容', '点赞数', '时间'])
for comment in comments['comments']:
writer.writerow([
comment['user']['userId'],
comment['user']['nickname'],
comment['content'],
comment['likedCount'],
comment['time']
])
# 示例:保存评论到CSV
comments = get_song_comments(186721, limit=100)
if comments:
save_comments_to_csv(comments, 'comments.csv')
本文详细介绍了如何使用Python爬取网易云音乐的数据,包括基础信息获取、加密API破解、模拟登录等高级技巧。需要注意的是,网络爬虫技术应当合理合法使用,尊重网站的数据权益和用户隐私。
在实际应用中,你可能还需要处理更多复杂情况,如IP封禁、验证码识别等。建议在开发过程中逐步完善你的爬虫程序,并始终遵循合法合规的原则。
希望本文对你学习网络爬虫技术有所帮助!如果你有任何问题或建议,欢迎留言讨论。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。