Python爬取网易云音乐数据实战教程!

包含编程籽料、学习路线图、爬虫代码、安装包等!【点击领取】

一、前言
网易云音乐作为国内流行的音乐平台,拥有海量的音乐资源和用户数据。本教程将介绍如何使用Python爬取网易云音乐的数据,包括歌曲信息、评论、用户信息等。请注意,本教程仅用于学习交流,请遵守相关法律法规和网站的使用条款。

二、准备工作

  1. 所需工具和库
    Python 3.x

requests库(发送HTTP请求)

BeautifulSoup4(解析HTML)

selenium(处理动态加载内容,可选)

PyExecJS(执行JavaScript代码,可选)

pip install requests beautifulsoup4 selenium pyexecjs
  1. 分析网易云音乐网页结构
    网易云音乐采用了前后端分离的架构,大部分数据通过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))
  1. 通过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获取,且部分接口有加密参数。

  1. 获取热门评论
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))
  1. 处理加密参数(简化版)
    网易云音乐使用了复杂的加密算法,这里提供一个简化版的解决方案:
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文件

五、爬取用户信息

  1. 获取用户基本信息
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漫画教程,手机也能学习

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值