Python怎么爬取网易云音乐

发布时间:2021-11-25 09:23:09 作者:iii
来源:亿速云 阅读:296
# Python怎么爬取网易云音乐

## 前言

在当今大数据时代,网络爬虫技术成为了获取互联网数据的重要手段之一。作为国内最受欢迎的音乐平台之一,网易云音乐拥有海量的音乐资源和用户数据,这些数据对于音乐推荐、市场分析等场景具有重要价值。本文将详细介绍如何使用Python爬取网易云音乐的数据,包括歌曲信息、评论数据等。

## 准备工作

### 1. 环境配置

首先需要确保你的Python环境已经安装好,推荐使用Python 3.6及以上版本。此外,还需要安装以下必要的库:

```bash
pip install requests
pip install beautifulsoup4
pip install selenium
pip install pycryptodome

2. 分析目标网站

在开始爬取之前,我们需要先分析网易云音乐网站的结构和反爬机制:

  1. 网易云音乐主要采用JavaScript渲染页面
  2. 对未登录用户有访问频率限制
  3. 关键API接口有加密参数保护
  4. 部分数据需要模拟登录才能获取

爬取基础数据

1. 获取歌曲信息

网易云音乐的歌曲信息可以通过公开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)

2. 获取歌手信息

类似地,我们可以获取歌手的基本信息:

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

网易云音乐的核心API都采用了加密参数,我们需要破解这些加密才能获取更多数据。

1. 加密算法分析

网易云音乐主要使用了以下加密方式: - 参数加密:使用AES加密 - 签名生成:使用MD5和自定义算法

2. 实现加密函数

我们需要实现网易云音乐的加密算法:

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'

3. 获取歌曲评论

使用加密参数获取歌曲评论:

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)

高级爬取技巧

1. 使用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 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

2. 处理验证码

网易云音乐在频繁请求时会要求验证码,可以尝试以下方法:

  1. 降低请求频率
  2. 使用代理IP
  3. 人工识别验证码(复杂情况下)

3. 数据存储

获取到的数据可以存储到文件或数据库中:

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')

注意事项

  1. 遵守robots协议:网易云音乐的robots.txt禁止爬取部分内容,请尊重网站规定
  2. 控制请求频率:避免给服务器造成过大压力,建议添加延时
  3. 版权问题:音乐资源受版权保护,不要用于商业用途
  4. 个人隐私:用户评论等数据可能包含个人信息,使用时需谨慎

结语

本文详细介绍了如何使用Python爬取网易云音乐的数据,包括基础信息获取、加密API破解、模拟登录等高级技巧。需要注意的是,网络爬虫技术应当合理合法使用,尊重网站的数据权益和用户隐私。

在实际应用中,你可能还需要处理更多复杂情况,如IP封禁、验证码识别等。建议在开发过程中逐步完善你的爬虫程序,并始终遵循合法合规的原则。

希望本文对你学习网络爬虫技术有所帮助!如果你有任何问题或建议,欢迎留言讨论。 “`

推荐阅读:
  1. python如何爬取图片
  2. python如何爬取ajax

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python

上一篇:iOS中如何在内存中绘图

下一篇:python怎么实现购物车

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》