网易云音乐评论抓取实验(1)接口获取

(后续文章已更新:网易云音乐评论抓取实验(2)朴素贝叶斯入门:通过概率对评论情绪分类

上篇文章Python实现电影排行榜自动网盘下载(4)Cookies免登录+抓包下载提到抓包的方式获取指定的信息,有两个关键字出现在包里:bdstokenlogid,一开始以为这两个也是需要的,就试着获取了一下,然而在Fiddle中查找,发现并没有Response返回这两个参数,至此学习到了这种通过JS返回参数的方式。下面介绍一下我这只小菜鸟获取网易云评论接口的过程。学习参考:

先来看看最终效果吧,这是《十年》里抓到的评论:


最终效果

后续拿来做词云什么的,不是很炫酷吗。

抓包

从Response入手开始找


在Response中找评论

好了,就是这个包了。再看看它需要的参数,查看Request, 主要是params,encSecKey两个参数

关键参数

它们从哪来?Network-Initiator里面查出来是core.js

参数来源

替换JS文件

然而core.js的排版比较反人类,美化排版之后再调试又变丑了- - 我也不知道为什么,大概人丑天注定吧,所以为了方便调试,把core.js下载下来修改掉。搜索关键字params或者encSecKey定位到下图,这里参考他人的做法,加上一些输出并保存

输出关键信息

接下来需要使用Fiddle替换JS,在Fiddle中找到这个包,切换到右侧的AutoResponder并添加规则。

添加规则

如果Request符合这个规则,就拿设定的JS替换网络的Response,我看原来的RuleEditor里面似乎有参数,可能影响替换,就干脆改成下图了

去掉表示完全匹配的Exact

重新抓包

这里需要注意之前JS已经被下载下来了,所以需要先把缓存给清空,让网页重新获得JS文件,只不过这次是我们的JS文件。这下查看控制台就可以方便的获得我们想要的信息了。还记得在控制台里面输出的啥吗?

6个参数

后2个是最后返回的参数,前4个用来生成后2个。

第一首歌中的6个参数

换一首歌查看6个参数的变化

可以看出2,3,4号输出都是不变的,而最终结果5,6跟1,2,3,4相关,那就只能是1的变化引起的了。
呃,一次F5输出了这么多次,哪个是评论的1号参数呢?拿最终的params来找吧。

评论的1号参数Object应该是这种样子

经过换到刷新、下一页评论、换歌等测试,发现


Offset代表从第几个评论开始

rid代表歌曲ID rid从哪来?看看歌曲URL! http://music.163.com/#/song?id=461932144

JS关键语句分析

本文章到这里就结束了,因为我并不会JS,大家再见。


呃啊啊别揍我啊,虽然不会,我们还可以搜嘛。

var bIm9d = window.asrsea(JSON.stringify(j2x), baU0x(["流泪", "强"]), baU0x(OR6L.md), baU0x(["爱心", "女孩", "惊恐", "大笑"]));

先搜asrsea,然后就碰到了文章开头的参考资料了哦。
JSON.stringify用于从一个对象解析出字符串。
然后分析这个asrsea,向上找来到了这里

asrsea就是这个d

到了这里感觉很好,哇,很开心的样子呢。然而又马上陷入了沉默。具体的语句我丫还是看不懂啊。
好在大大们给了别的解决方案——第一篇参考中提到的直接在Python里面运行JS或者把JS代码通过js2py库转为Python代码,这个第二篇的wuhtt大大成功做过了哦。参考学习各篇文章之后,了解到这是个加密的算法;再看看加密函数b,出现了的字眼有AES Mode:CBC iv 都拿去搜了一下,其逻辑是这样的:

AES-CBC

最后看到路人甲大大的实现代码之后,我又瞄了一眼这个WINDOW.ASRSEA,卧榻马惊呆了!这尼玛倒过来不就是AES RSA,真会玩!!!!所以最后终于搞懂了这个加密逻辑:(第12345个参数在文末代码中表示为p1 p2…)

  • 1 4 AES生成5
  • 5和随机数i (注:16位随机数经参考文章的提示直接设定为"aaaaaaaaaaaaaaaa")AES得到encText(params)
  • i 2 3 RSA得到encSecKey

Python实现

又有部分实现函数,又搞懂了逻辑,然而我还是一脸蒙蔽,函数怎么用啊,参数怎么给进去啊,还是不知道。没办法,查吧。搜 Python AES

找到的参考代码

刚好JS文件里面也出现了parse这个字眼,还以为输入的参数需要这么一下处理,各种报错。哇,心态就蹦了。大家再见。
不知怎么回光返照了,又看到一篇代码。

参考代码2

呀!原来并不需要parse,直接扔进去就行了呀!至此,再解决掉一些编码问题,终于完chao成hao了Python代码的编写,衷心感谢各位大牛们的分享。

from Crypto.Cipher import AES
import Crypto
import base64
import math
import os
import codecs
import binascii
from urllib.request import *
import urllib.parse
import json

#这里并不需要JS中的parse
#这两个函数都是参考知乎大大 路人甲 的!https://www.zhihu.com/question/21471960
def aesEncrypt(text, secKey):
    pad = 16 - len(text) % 16
    text = text + pad * chr(pad)
    encryptor = AES.new(secKey, 2, '0102030405060708')
    ciphertext = encryptor.encrypt(text)
    ciphertext = base64.b64encode(ciphertext)
    return ciphertext
def rsaEncrypt(text, pubKey, modulus):
    text = text[::-1]
    text=binascii.hexlify(text)
    rs = int( text,16)**int(pubKey, 16) % int(modulus, 16)
    return format(rs, 'x').zfill(256)


p1='{"rid":"R_SO_4_66842","offset":"0","total":"true","limit":"20","csrf_token":""}'
p2=b"010001"
p3='00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7'
p4='0CoJUm6Qyw8W8jud'
i=b'aaaaaaaaaaaaaaaa'
p5=aesEncrypt(p1,p4)
p5=str(p5,'ascii')
params=aesEncrypt(p5,i)
params=str(params,'ascii')
encSecKey=rsaEncrypt(i,p2,p3)
url='http://music.163.com/weapi/v1/resource/comments/R_SO_4_66842'
#这里经过 wuhtt的文章(http://www.jianshu.com/p/2146469bb29c)提醒加上两个字段
myheaders = {
    'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
    'Origin':'http://music.163.com',
    'Content-Type':'application/x-www-form-urlencoded',
}#浏览器请求头

data={
    'params':params,
    'encSecKey':encSecKey
}
request=Request(url,headers=myheaders,data=urllib.parse.urlencode(data).encode(encoding='UTF8'))
response=urlopen(request)
restext=json.load(response)
hotcomments=restext['hotComments']
for i in hotcomments:
    print(i['content'])

往期实验文章,欢迎大家骚扰^_^
Python自动生成简书过往文章链接Markdown格式文本
Python实现电影排行榜自动网盘下载(4)Cookies免登录+抓包下载
Python实现电影排行榜自动网盘下载(3)Selenium离线下载
Python实现电影排行榜自动网盘下载(2)Scrapy深入 “打包员”“快递员”
Python实现电影排行榜自动网盘下载(1)Scrapy爬虫框架
Python实现电影排行榜自动网盘下载(0)简介

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容