Python中如何应对网易云音乐的反爬机制?

最近想做大数据分析; 所以想爬取了网易云的所有用户信息;

那么重点来了,我发现,网易云有单模块防御机制; 比如个人用户主页,我爬取了大概 5W+左右,反爬机制就生效了, 不管访问哪一个用户的主页,都是返回 404,连我自己的个人中心都无法登录了;

我试过 cookie 变换,但是得出结论绝对是 IP 被黑了。 请问各位,有没有相关经验。 到底是不是黑了 IP。。。。。


Python中如何应对网易云音乐的反爬机制?
23 回复

我被 ban 过 ip,大概 ban 了 7 到 10 天左右


要搞定网易云音乐的反爬,核心是模拟真实浏览器行为。他们主要靠加密参数和动态Cookie来识别爬虫。

首先你得用requests库,但光这个不够。关键是要拿到paramsencSecKey这两个加密参数。这两个参数是前端通过固定算法生成的,我们需要在Python里复现这个加密过程。

import requests
import json
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import base64
import binascii

# 网易云音乐AES加密的固定参数
SEC_KEY = '0CoJUm6Qyw8W8jud'  # 第一次加密的密钥
IV = '0102030405060708'      # 初始向量
PUB_KEY = '010001'           # RSA公钥指数
MODULUS = ('00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7'
           'b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280'
           '104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932'
           '575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b'
           '3ece0462db0a22b8e7')

def aes_encrypt(text, key):
    """AES加密"""
    text = pad(text.encode(), AES.block_size)
    cipher = AES.new(key.encode(), AES.MODE_CBC, IV.encode())
    encrypted = cipher.encrypt(text)
    return base64.b64encode(encrypted).decode()

def rsa_encrypt(text):
    """RSA加密(简化版,实际需要完整实现)"""
    # 这里简化处理,实际需要完整的RSA加密实现
    text = text[::-1]
    rs = int(binascii.hexlify(text.encode()), 16) ** int(PUB_KEY, 16) % int(MODULUS, 16)
    return format(rs, 'x').zfill(256)

def get_enc_params(text):
    """获取加密参数"""
    # 第一次AES加密
    enc_text = aes_encrypt(text, SEC_KEY)
    # 第二次AES加密
    enc_sec_key = 'abcdefghijklmnop'  # 随机16位字符串
    enc_text = aes_encrypt(enc_text, enc_sec_key)
    # RSA加密
    enc_sec_key = rsa_encrypt(enc_sec_key)
    
    return {
        'params': enc_text,
        'encSecKey': enc_sec_key
    }

def search_song(keyword):
    """搜索歌曲示例"""
    url = 'https://music.163.com/weapi/cloudsearch/get/web?csrf_token='
    
    # 构造请求数据
    data = {
        's': keyword,
        'type': 1,
        'limit': 10,
        'offset': 0
    }
    
    # 获取加密参数
    enc_params = get_enc_params(json.dumps(data))
    
    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=enc_params, headers=headers)
    return response.json()

# 使用示例
if __name__ == '__main__':
    result = search_song('周杰伦')
    print(json.dumps(result, ensure_ascii=False, indent=2))

注意几个关键点:

  1. 加密算法要完全复现前端逻辑,包括AES-CBC模式和PKCS7填充
  2. 请求头必须包含正确的User-AgentReferer
  3. 有些接口还需要csrf_token,可以从Cookie中获取
  4. 对于登录等更复杂的操作,还需要处理验证码和Cookie管理

如果只是简单爬取,也可以考虑用selenium模拟浏览器,但效率会低很多。加密参数这块是绕不过去的坎,必须正确实现。

总结:逆向加密逻辑是核心。

不是。那么认真的么? 7-10 天?

网易云的反爬貌似是基于账号的,换 cookies 是有用的吧?

去随便一个云买个小鸡跑一下就知道了

不换 IP 又不在限制范围内当然会被封 IP 啊。。

是 IP 挂了。cookie 换过了。无效。

虽然让你爬了 5W+了,但你该不会是想用单 IP 爬全站吧?全国混拨了解一下

我上次是 for 循环无延时调的音乐接口,在服务器上,然后被 ban 了这么久

网易云有啥好爬的

目前来看。我到现在还没解封。估计是六七天才行了。

大概是我太单纯了。

这两天摸出结论:

网易云是双封,先在你的 cookies 写入封禁的字段,然后封禁 IP ;
如果你换了 IP,不清理 cookies,一样死;

所以解封的办法是,先清理 cookie,然后换 IP。然后访问就 OK 了。

现在还有写爬虫不叫代理的么。。。

我是做代理 IP 的,我们有个企业客户,成立了一个攻坚反爬部门,专门研究怎么绕过风控抓取数据。现在风控台厉害了

成功绕过了么?

搞爬虫你需要代理池

你这单 ip 单 cookie 想爬全站么?
我一个新手爬拉钩都用了十几个 cookie+代理隧道爬取,爬了 50 万+的数据,压根没毛病。
楼上有个哥们说得对,随机 cookie 列表+代理 ip+随机间隔请求时间,基本上对付中小网站没问题了,除非你想碰阿里这种怪物。



请问您这十几个 cookie,是同一个账号生成的, 还是 十几个不同账号生成的。 谢谢

我用的是一个账号生成的 cookie,但是不知道网站是不是对 cookie 有限制的。你也可以生成十几个账号对应的 cookie 来爬,那样反爬就更难处理了

我简单说下我的反反爬思路吧。
1.随机 UA
2.随机 time.sleep
3.随机 cookie
4.代理隧道动态 ip

其实网易云的反爬除了 IP 还有 cookie。如果 IP 被墙了。Cookie 也是有问题的。。就算你换 IP,不清除 cookie。依然被墙。UA 倒是没限制。

那就要仔细研究下了。

回到顶部