社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python爬取网易云音乐热门评论

Python中文社区 • 7 年前 • 928 次点击  

專 欄


王雨城,Python中文社区专栏作者

博客:

http://www.jianshu.com/u/88ff70818bd1





分析api

我们首先用浏览器打开网易云音乐的网页版,随便进入一个歌单,点击进入一首歌曲的页面,可以看到下面有评论。接着F12进入开发者控制台(审查元素)。

分析api

我们在搜索框里输入comments即可找到对应的获取评论的api的url,点击它在右边选择Response就可以看到返回的json了。

那我们的思路就很清晰了,只需要分析这个api并模拟发送请求,获取json进行解析就好了。右键复制这个url下来:

从浏览器的上的地址可以发现以上url里R_SO_4_后的数字就是歌曲的id,如下图:

经测试,后面的csrf_tocken也可以用于其他歌曲。在开发者控制台里,点击headers就可以看到请求方式为post,请求头里的表单数据有两个加过密的参数(params和encSecKey)。但是不要紧,同样经测试,这两个参数也可以用于其他歌曲,直接copy就好。但只限于第一页,其他页码就不一样了,不过对于我们爬取热门评论,第一页就够了。

发送请求获取json

根据上个小节的分析,我们可以写出以下代码获取到json:

运行查看输出就可以知道是否成功获取了json。这里requests的用法,可以参考requests快速上手。

解析json进行输出

我们可以从浏览器的开发者控制台里把json复制到一个 在线json校验格式化工具,这样可以比较清晰地看到json的结构,利于我们解析。如图:

json格式

这个json里有丰富的信息,包括评论总数、用户名、热评、点赞数等。清楚了json 的结构,很容易就可以解析得到想要的信息了。json解析需要引入json包,了解json解析可以参考 使用python解析json详解。里面把json类型和python类型之间的对应关系讲得很清楚了,只需要会用dict和list。解析代码如下:

输出结果:

输出结果

爬取一个歌单所有歌的热门评论

以上已经展示了怎么爬取一首歌的热门评论,接下来我们就可以进一步把一个歌单里所有歌的热门评论都爬取出来。

思路就是,将这个歌单所有歌曲的id爬取出来,替换到之前的url中,然后进行同样的输出。

同样的方法,我们发送歌单的url访问请求,读取response的返回内容看看情况。

输出:

控制台输出

可以看到第一行的标签textarea里有一个json,我们可以用xpath定位到这个标签,获取到这个json并进行解析。在此之前,可以向之前一样先复制到在线校验工具看看结构。

json结构

确实有我们需要的数据,接下来就可以进行解析了。我们这里写成面向对象的风格,完整代码如下:

输出结果展示:

输出结果示例

这里遇到一个神坑,由于param太长,我用了几个"\"符号在末尾进行换行,如上代码那样换了两行没有问题,可是只要我在encSecKey参数这一行进行换行,就会产生bug,死活获取不到json文本。经过多次测试,确实就是"\"符号导致param没能正确地传入post导致获取不到json文本。目前不清楚什么原因,所以,这个换行还是慎用。


本文为作者原创作品,未经作者授权同意禁止转载



长按扫描关注Python中文社区,

获取更多技术干货!

    

Python 中 文 社 区

Python中文开发者的精神家园

合作、投稿请联系微信:

pythonpost

— 人生苦短,我用Python —
1MEwnaxmMz7BPTYzBdj751DPyHWikNoeFS





点击阅读原文加入Python圈


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/7Y5h0saub5
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/2682
 
928 次点击