王雨城
,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圈