Python之手把手教你用JS逆向爬取网易云40万+评论并用stylecloud炫酷词云进行情感分析

本文借鉴了@平胸小仙女的知乎回复 https://www.zhihu.com/question/36081767


写在前面:

文章有点长,操作有点复杂,需要代码的直接去文末即可。想要学习的需要有点耐心。当我理清所有逻辑后,我抑郁的(震惊的)发现,只需要改下歌曲ID就可以爬取其他任意歌曲的评论了!生成的TXT文件在程序同一目录。

有基础的可能觉得我比较啰嗦,因为我写博客一是为了记录下知识点,在遗忘的时候可以查看回顾下。二是因为我学编程的时候,搜到的很多帖子都是半残的,有些人是为了引流到自己的公众号,有些人干脆是骗流量,有的帖子质量很好,但是对小白不太友好,没有相关基础很难复现。这样就在搜索上浪费了很多时间。我写博客尽量把每一步操作都记录下来,这样别人能复现我的成果,对着一个可以运行的程序,才会有学习的欲望。先学会操作,再去弄懂原理,然后就可以写出自己的程序了!至于技术原理,网上的大牛太多了,想学的话很容易学到。我希望看到我的博客的小白,不至于在操作上浪费太多时间,能有时间用到学习技术原理上。

当然也有一部分是猎奇的,希望直接复制就能运行,这样的呢,给我点个赞就行啦!毕竟谁不是从白嫖怪一步一步成长起来的呢,好奇心是最好的老师。


可能遇到的麻烦:

ModuleNotFoundError: No module named ‘Crypto‘ 踩坑

用到的工具:

手把手教你下载安装配置Fiddler 和 Fiddler Everywhere

PyCharm中文指南2.0

词云清洗用到的stopwords.txt:

Python文本分析之常用最全停用词表(stopwords)

词云清洗的分析参见:

Python爬取你好李焕英豆瓣短评并利用stylecloud制作更酷炫的词云图


F12大法开启:

打开网易云网页版,找到一首喜爱的音乐,我选择的是柏松的《世间美好与你环环相扣》,然后开启F12大法!
在这里插入图片描述

现在开始作法:按F12,选中network(也可以右键–>检查–>network),然后F5刷新页面,就可以看到network的活动:

在这里插入图片描述
点击评论的下一页,发现只有评论会刷新成下一页的评论,网页的URL没有变,说明向服务器发送的请求是XHR(XMLHttpRequest)对象。所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject)。XMLHttpRequest 用于在后台与服务器交换数据。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

完全不懂的小白可以学这个入下门:

https://www.w3cschool.cn/ajax/ajax-xmlhttprequest-create.html

在这里插入图片描述
这样就缩小了排查范围,选中XHR,会发现少了很多,但是还有十多条,这就没办法了,可以自己瞎猜,我是一个一个点进去,然后选中Response,这样一个个的找到包含评论的数据包的。当然你操作的时候页面跟我的不太一样,因为这些框框都是可以拖动的,需要看哪一部分的时候可以拖动使得需要的部分变大,突出的显示出来。

在这里插入图片描述
对比上图,就是这个了:
在这里插入图片描述

点进去,选中Headers,就可以看到Request Headers
在这里插入图片描述
以及两个参数params和encSecKey
在这里插入图片描述
在Response里可以看到当前页的所有评论,但也只是当前页的,其他页的评论如何获取呢?

点击下一页的时候只刷新评论,而不会重新加载页面。那么既然这个进程是向服务器发起获取评论的请求,我们点击下一页看看这个进程会有什么变化。

第一页:
在这里插入图片描述
第二页:
在这里插入图片描述
第三页:
在这里插入图片描述

可以发现只有这两个参数 params和encSecKey会随之改变,进而Response也刷新成了下一页的评论。由此得出结论:这是通过不同页面的params以及encSecKey参数的不同来向服务器发起获取相应评论的请求。

js线上调试:

因此,下一步就是弄清楚不同页面的params以及encSecKey参数是如何改变的,这样我们就能在爬虫程序中通过生成随页面变化的这两个参数,发送至服务器获取相应的Response。

这两个参数一看就是js加密的,而这个进程的initiator是core_68ac1b3aadf40a20caba599a0ab2365d.js
在这里插入图片描述
一般这样的js都是没法看的,因此就点进去并save as将core_68ac1b3aadf40a20caba599a0ab2365d.js下载到本地查看。以下简称core.js。

切记切记!!!一定要先点这个美化按钮!!!然后再保存!!!没有一个教程帖子告诉我这点,然后我就傻不拉叽的直接保存了!!!!当然你也可以不点不美化,毕竟我第一次没有美化也做出来了。
在这里插入图片描述
右键,Save as 就可以保存了,选个自己知道的路径,等下有用!
在这里插入图片描述
打开core.js,我用的是Sublime Text。

这就是你不点美化的后果!!!找不同吧!!!
在这里插入图片描述
这是美化后的:
在这里插入图片描述
搜索params和encSecKey,查找这两个参数:
在这里插入图片描述
可以看到这两个参数都是bWv4z函数中的变量,(PS:细心的读者会注意到后面的截图不再是bWv4z,其他参数也有微小变化,是因为我出去吃了个饭,回来后core.js已经失效,网易云更新了这个,所以我重新下载编辑了,不影响学习。)而这个函数也就是window.asrea这个函数。暂且不管window.asrea这个函数是如何实现的,可以看到它有四个参数,先不管这四个参数是哪来的,可以先把它们输出到console看一下,这时候就需要线上调试js。首先将本地的core.js文件添加几行代码,以便使这四个参数显示出来:
在这里插入图片描述
把第2、3、4个参数先注释掉,因为要一个一个的获取。

接着要用到Fiddle Everywhere了,下载安置配置见本文开头链接。

点击打开AutoResponder,然后点Add New Rule
在这里插入图片描述
弹出
在这里插入图片描述
先看MATCH:

回到这里,这次点Open in new tab

在弹出的页面复制URL,注意不是美化后的,是美化前的。可以点叉把美化后的关了,再右键Open in new tab
在这里插入图片描述
复制URL
在这里插入图片描述

注意不是这个:
在这里插入图片描述

把复制的URL粘贴到MATCH
在这里插入图片描述
然后看ACTION
在这里插入图片描述

选中之前保存的core.js,就是core_68ac1b3aadf40a20caba599a0ab2365d.js
在这里插入图片描述
最后点Add to Queue
在这里插入图片描述
这样就完成了:
在这里插入图片描述
这步实际就是用本地修改过得core.js文件替换服务器的core.js对请求作出响应。

这些设置完之后,清除浏览器缓存,刷新页面,就可以在console里面看到输出的参数了。

什么?没看到?清除浏览器缓存啊,重启浏览器啊,重启Fiddle Everywhere啊,还看不到?

看不到就对了,因为在Sublime Text 中编辑完后没有保存啊!
在这里插入图片描述
保存下,再刷新:

如图,分别是第一页和第二页的第一个参数值

第一页:
在这里插入图片描述
第二页:
在这里插入图片描述
在这里,我遇到了最大的难题,至今未解决。

这是我试了N久得到的一些数据,至今没有找到规律用数学公式写出来。可能是网抑云的新的反爬方法吧。有人要试的话,记得每次都要F5刷新,有时候刷新一次还不行,比如在获取2万多页后的数据时,每次显示还不一样,我又清空浏览器缓存刷新几次,数据不变了才记录下来。因为页码是不能选的,只能这么一下下点击。
在这里插入图片描述
数据:
在这里插入图片描述
都做到这了,总不能半途而废吧,我就参考了其他人的数据:

在这里插入图片描述
我发现网上所有的教程截图全是这样的数据,偏偏我的不一样?????应该是网易云反爬的措施吧。

这样的数据好处理:rid就是R_SO_4_加上歌曲的id,offset就是(评论页数-1) * 20,total在第一页是true,其余是false。

百思不得其解怪来了!!!后面的代码用的就是这几个以前的参数,程序竟然跑起来了!!!

不管了,继续学原理!

按这样的方式可以得到其余三个参数:

这样,别忘了保存,然后清空浏览器缓存,再刷新:

第二个参数值:
在这里插入图片描述
010001
在这里插入图片描述
第三个参数值:

00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7
在这里插入图片描述
第四个参数值:

0CoJUm6Qyw8W8jud
在这里插入图片描述


再次警告:

下载到本地的core.js文件要赶快使用,我中午出去吃了个饭,回来接着写的时候发现已经失效了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
你看,参数已经发生了变化,快使用!噢应该着急的是我,我应该快截图,不然前面的步骤又要再演示一次了。


分析加密函数:

可以发现,只有第一个参数随页面变化,其余三个参数都是不变的常量。至此 ,这四个参数我们都能够在程序中通过代码生成了。

那么,现在我们只要知道函数window.asrsea如何处理的就可以了,定位到这个函数:

我是在Sublime Text这么find来定位的,console中也可以,但是我用不太好,就在这find了:

在这里插入图片描述

这是结果:

在这里插入图片描述
纳尼?d? 什么鬼?函数?
再find:
在这里插入图片描述
然后搜到了好多好多的d,比找对象还难找!这谁受得了啊!

去隔壁控制台搜下:
在这里插入图片描述
回车!啪!应声而出&

  • 19
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BugMiaowu2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值