网易云歌曲评论抓取

网易云歌曲评论爬取

  • 步骤
    • 1.找到一首歌曲
    • 2.按下F12键打开开发者模式,对其进行抓包
    • 3.查找获得评论数据的接口
    • 4.对获得评论数据接口进行分析
    • 5.构建加密函数
        • 方法一
        • 方法二
  • 运行结果
  • 全部代码
    • 使用Js文件
    • 只使用python
  • 新的代码
  • 小结与展望

这次的任务是获取网易云音乐下面的评论,涉及的知识比上次更多,包括Js逆向的知识。
使用的python包:

execjs(运行Js文件,通过pip install PyExecJS安装)
requests(发起请求)
json(json数据转换)

步骤

https://music.163.com/#

1.找到一首歌曲

https://music.163.com/#/song?id=404465743
在这里插入图片描述

2.按下F12键打开开发者模式,对其进行抓包

刷新网页进行抓包,结果如下:
在这里插入图片描述

3.查找获得评论数据的接口

方法一
点击这些接口,然后点击预览,预览里面是接口的返回数据,我们看下是否有评论数据。
在这里插入图片描述

方法二
在搜索栏搜索评论信息,找到接口,这个比上面一个一个接口分析要快。但注意如果页面加密了就不行了。
在这里插入图片描述
由此我们得到网易云评论数据的接口是:
https://music.163.com/weapi/comment/resource/comments/get?csrf_token=
这里csrf_token是登录后才会有信息的。

4.对获得评论数据接口进行分析

(1)点击负载,可以看到接口的参数是进行了加密的,那我们需要找到它是如何进行加密的。
在这里插入图片描述

(2)为了找到加密过程,我们点击发起程序部分。
在这里插入图片描述

这是一个调用堆栈,它的执行顺序是从下往上执行。
(3)我们点击第一个程序,也是最后才执行的,出现如下结果:
在这里插入图片描述

这里的send函数是发送信息给服务器的作用,我们需要的加密数据也通过这个函数发送,我们对它进行进一步分析。
(4)给send函数位置打一个断点,找到目标接口调用这个函数的位置。
https://music.163.com/weapi/comment/resource/comments/get?csrf_token=

如下图所示,我们需要的是url应该是get?csrf_token=,而不是下图所示的内容。
在这里插入图片描述

继续进行debug,直到看到我们需要的接口。
在这里插入图片描述

(5)对目标接口位置进行分析。
通过该函数后参数被加密了,我们需要找到它没加密前是在哪个位置。
在这里插入图片描述

第(4)步调试结束的位置,下面有一个调用堆栈,就是该接口调用的一些文件,也是从下往上依次执行,我们对其进行分析,找到没有加密的数据最后存在的地方。
在这里插入图片描述

我们从上往下依次寻找,最后找到这个位置,点击该堆栈:
在这里插入图片描述

因此数据的形式为:

{"rid": "R_SO_4_404465743","threadId": "R_SO_4_404465743","pageNo": "1","pageSize": "20","cursor": "-1","offset": "0","orderType": "1","csrf_token": ""
}

(6)找到数据后,分析它是如何进行加密的。
打开第(5)步找到的文件并打上断点,如图所示:
在这里插入图片描述
在这里插入图片描述

然后刷新界面进行调试,注意接口需要是get才行:
在这里插入图片描述

然后继续运行后面的语句,发现数据加密了。
在这里插入图片描述
在这里插入图片描述

由此我们基本可以得到加密的语句为:
var bKL0x = window.asrsea(JSON.stringify(i1x), bvj1x([“流泪”, “强”]), bvj1x(Rj3x.md), bvj1x([“爱心”, “女孩”, “惊恐”, “大笑”]));

那我们之后需要做的就是实现跟这个函数类似的功能。

5.构建加密函数

找到第4步的window.asrsea函数,通过在文件里面按下Ctrl+F键,然后进行搜索。
在这里插入图片描述

由此可以得到加密函数的整体框架

!function() {function a(a) {var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";for (d = 0; a > d; d += 1)e = Math.random() * b.length,e = Math.floor(e),c += b.charAt(e);return c}function b(a, b) {var c = CryptoJS.enc.Utf8.parse(b), d = CryptoJS.enc.Utf8.parse("0102030405060708"), e = CryptoJS.enc.Utf8.parse(a), f = CryptoJS.AES.encrypt(e, c, {iv: d,mode: CryptoJS.mode.CBC});return f.toString()}function c(a, b, c) {var d, e;return setMaxDigits(131),d = new RSAKeyPair(b,"",c),e = encryptedString(d, a)}function d(d, e, f, g) {var h = {}, i = a(16);return h.encText = b(d, g),h.encText = b(h.encText, i),h.encSecKey = c(i, e, f),h}function e(a, b, d, e) {var f = {};return f.encText = c(a + e, b, d),f}window.asrsea = d,window.ecnonasr = e
}();

对于上述加密函数的实现,有两种方式:

使用js实现,通过该文件中的函数实现加密功能,遇到缺少的函数继续在该文件中查找。补齐后通过python的库函数调用js文件实现加密功能。
使用python实现,通过分析加密函数的逻辑,实现相同的功能。
在说明下面内容之前,先看下d函数ÿ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/803094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

List接口(1) | ArrayList

参考阅读:ArrayList 源码分析 一、特点 ArrayList 继承于 AbstractList ,实现了 List, RandomAccess, Cloneable, java.io.Serializable 这些接口,具有以下特点: 支持添加,删除和查找操作支持随机快速访问&#xff…

前端ocr技术:electron+vue3中使用tesseract插件识别图片中字符

同学们可以私信我加入学习群! 正文开始 前言一、electron各种csp问题二、试用插件总结 前言 项目需要ocr技术识别图片中的中文字符,本来这部分是后端的工作,但是因为各种原因,决定前端也做一个版本。 在ai时代之前,o…

基于spring boot的漫画之家系统

基于spring boot的漫画之家系统设计与实现 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件&…

pta L1-012 计算指数

L1-012 计算指数 分数 5 全屏浏览 切换布局 作者 陈越 单位 浙江大学 真的没骗你,这道才是简单题 —— 对任意给定的不超过 10 的正整数 n,要求你输出 2n。不难吧? 输入格式: 输入在一行中给出一个不超过 10 的正整数 n。 …

Java排序算法

冒泡排序 相邻两个元素比较,每次排序获得一个当前排序区间的最大值 // 冒泡排序 // 外层循环每次最后一个元素已经是最大的了,所以每次循环都减少一个元素 for (int i arr.length - 1; i >0; i--) {// 内层循环每次都是从第一个元素开始,…

鲁棒线性模型估计(Robust linear model estimation)

鲁棒线性模型估计 1.RANSAC算法1.1 算法的基本原理1.2 迭代次数N的计算1.3 参考代码 参考文献 当数据中出现较多异常点时,常用的线性回归OLS会因为这些异常点的存在无法正确估计线性模型的参数: W ( X T X ) − 1 X T Y \qquad \qquad W(X^TX)^{-1}X^T…

力扣热题100_链表_19_删除链表的倒数第 N 个结点

文章目录 题目链接解题思路解题代码 题目链接 19. 删除链表的倒数第 N 个结点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5] 示例 2&am…

数据结构—图

图的基本概念 图就是由顶点的有穷非空集合和顶点之间的边组成的集合。通常表示为:G(V,E),其中,G 表示一个图,V 表示顶点的集合,E 表示边的集合。 顶点 图中的数据元素,我们称之为顶点,图至少有…

2024年3月电子学会青少年软件编程 中小学生Python编程等级考试一级真题解析(判断题)

2024年3月Python编程等级考试一级真题解析 判断题(共10题,每题2分,共20分) 26、turtle 画布的坐标系原点是在画布的左上角 答案:错 考点分析:考查turtle相关知识,turtle画布坐标系是在画布的…

KNN分类算法的MATLAB实现以及可视化

一、KNN简介 KNN算法,即K-Nearest Neighbors,是一种常用的监督学习算法,可以用于分类问题,并且在实际应用中取得了广泛的成功。 二、KNN算法的基本原理 对于给定的测试样本,KNN算法首先计算它与训练集中所有样本的距…

服务器硬件基础知识解析

导言 在当今信息化时代,服务器扮演着至关重要的角色,它们是存储、处理和传输数据的关键设备。本文将介绍服务器硬件的基础知识,包括服务器的组成部分、硬件选型和性能评估等内容,旨在帮助读者更好地理解和应用服务器技术。 服务…

【数据库】规划与分析

目录 1.规划与分析 的步骤(3步)? 2.系统规划与定义 的步骤(4步)? 3.可行性分析 的步骤(4步)?(-表示包括 、和/表示并列) 4.项目规划 的步…

Vue - 你知道Vue2中对象动态新增属性,视图无法更新的原因吗

难度级别:中高级及以上 提问概率:55% 这道题面试官会这样描述,比如有这样一个场景,一个对象里有name属性,可以正常显示在页面中。但后续动态添加了一个age属性,通过调试打印发现对象里的age属性已经添加了上了,但试图中却没有展示出来,…

Axure案例分享—垂直手风琴(附下载地址)

今天分享的案例是Axure8(兼容9和10)制作的垂直手风琴 一、功能介绍 折叠或展开多个面板内容,默认为展开一项内容,点击任一收起的选项,展开面板,其他面板收起二、制作过程 原型是由矩形组件以及动态面板构成, 拖入一…

Collection与数据结构 二叉树(一):二叉树的性质与基本操作

1. 树形结构 1.1 概念1 (了解) 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点&#…

C语言单链表

1. 单链表的概念和结构 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表 中的指针链接次序实现的 。 链表与顺序表都属于线性表,顺序表在物理存储结构上是线性的,但是链表在物理存储结构上…

基于springboot+vue+Mysql的学习平台

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

Centos 下载地址

下载镜像地址: 1、官网地址:The CentOS Project 2、阿里镜像站:centos安装包下载_开源镜像站-阿里云 3、清华镜像源:Index of /centos/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 3.、CentOS搜狐镜像&#xff1…

Spark-Scala语言实战(13)

在之前的文章中,我们学习了如何在spark中使用键值对中的keys和values,reduceByKey,groupByKey三种方法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢…

c++类静态成员变量

C中的静态成员变量是属于类的成员变量&#xff0c;而不是属于类的具体实例的。静态成员变量提供了一种方便的机制&#xff0c;可以在类的所有实例之间共享数据&#xff0c;并且可以用于跟踪类的实例数量、存储全局信息以及实现全局性质的函数或数据。 #include <iostream&g…