网易云歌曲评论抓取

网易云歌曲评论爬取

  • 步骤
    • 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,一经查实,立即删除!

相关文章

前端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 开发软件&…

鲁棒线性模型估计(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算法首先计算它与训练集中所有样本的距…

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三种方法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢…

JavaSE:图书管理系统

目录 一、前言 二、内容需求 三、类的设计 (一)图书类 1.Book 类 2.BookList 类 (二)操作类 1.添加图书AddOperation类 2.借阅图书BorrowOperation类 3.删除图书DelOperation类 4.显示图书ShowOperation类 5.退出系统Ex…

【三十六】【算法分析与设计】综合练习(3),39. 组合总和,784. 字母大小写全排列,526. 优美的排列

目录 39. 组合总和 对每一个位置进行枚举 枚举每一个数出现的次数 784. 字母大小写全排列 526. 优美的排列 结尾 39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不…

手写Spring框架

手写Spring框架 准备工作Spring启动和扫描逻辑实现依赖注入的实现Aware回调模拟实现和初始化机制模拟实现BeanPostProcessor (Bean的后置处理器) 模拟实现Spring AOP 模拟实现Spring Bean生命周期源码分析 Spring中两种生成代理的方式题外话 Spring事务相关Spring事务传播机制S…

C++——栈和队列容器

前言:这篇文章我们将栈和队列两个容器放在一起进行分享,因为这两个要分享的知识较少,而且两者在结构上有很多相似之处,比如栈只能在栈顶操作,队列只能在队头和队尾操作。 不同于前边所分享的三种容器,这篇…

HarmonyOS 应用开发-ArkUI(ets)仿“腾讯新闻”APP

一、效果演示 1、新闻列表页 2、新闻详情页、图片展示页 3、视频页 4、动态页 二、 流程图 –本来自定义了视频的控制栏的,但是发现VideoController()控制器的bug会导致控制器失效,所以没继续做。视频页先不搞了。 三、文件组织(“我的页面…

网工内推 | 深信服、宁德时代,最高20K招安全工程师,包吃包住

01 深信服科技 招聘岗位:安全服务工程师 职责描述: 1.负责现场安全服务项目工作内容,包含渗透测试、安全扫描、基线核查、应急响应等; 2.协助用户完成安全测试漏洞整改、复测工作; 3.为用户提供网络、主机、业务系统等…