QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

查看: 2704|回复: 0

爬虫进阶之 JS 破解

[复制链接]

等级头衔

积分成就    金币 : 2861
   泡泡 : 1516
   精华 : 6
   在线时间 : 1322 小时
   最后登录 : 2025-11-29

丰功伟绩

优秀达人突出贡献荣誉管理论坛元老活跃会员

联系方式
发表于 2020-3-19 10:28:04 | 显示全部楼层 |阅读模式
       现在越来越多的网站把数据的交互过程写在 JS 代码里,也就是说如果你只单单看前端网页的源码,你是无法得到具体的数据,你只能看到一大堆调用 JS 的前端代码。所以对于这类的网站,我们需要进入到具体的 JS 源码,理清关键代码,从而进行破解获取到我们想要的数据。
% s+ W6 ~6 a! Q1 JS 基础语法学习
0 u0 o2 T( R6 `- ?& x       你只要有点编程基础,学习过一门编程语言,JS 的学习还是相对轻松,一个星期左右的时间就可以把 JS 所有的基础内容,全部学习一遍。如果你没有编程基础的话,JS 基础的内容学习起来也不是非常难,最多一个月的时间也能全部学完。
5 q$ ^* F+ W5 F/ c这里给大家推荐一个 JS 编程基础学习网站:4 t( K3 p% f- m
https://www.runoob.com/js/js-tutorial.html4 N* x" T+ }$ n6 m/ t

) B6 D9 [, p9 {6 t' n$ ^ 1.jpg
" |5 c  D" t4 P; R1 p9 M1 `8 L1 z/ s& J" n7 {; g
2 前端 JS 破解原理
2 Y) S9 }  O5 Z; A. s% ^* w& D* P       普通的网站数据的显示都是在网站的源码中就可看到,这类的网站你只要发个 requests 的请求,服务器就会把带有数据的源码返回给你,你就可以通过一些解析库进行解析了。但对于 JS 进行数据加密传输的网站,它就不同,比如下面这个网站:9 f0 c9 |0 z; J# S
2.jpg ( e$ B8 z* N2 m  A
       在控制面板可以看到获取到的数据是字母串,跟前端显示的数据完全不同,这就说明网站的数据是被加密了。新手在爬这类网站的时候,看到这里可能就会感到无奈。但大家不妨这样想,前端显示的数据是正常,所以后台一定会有某个地方对加密过的数据进行解密,而我们需要做的就是找到这个段解密的代码,按照它的逻辑进行传参就可以了。这也是我们破解 JS 代码的原理所在。6 v: T- n: g; d; O) E  y) r

: a+ U0 R0 U4 h3 工具的使用/ i1 ]' @; S) H2 \( G
       讲完了原理之后,我先给大家介绍几个常用的工具。3.1 谷歌浏览器的开发者工具# t( Q" p& D. [: R9 E
       学爬虫一定要会使用谷歌浏览器的开发者工具,按谷歌浏览器按 F12 就可以弹出具体的页面。% g6 F  a( e9 g2 w
3.jpg 7 x! k' X, ]) M+ C  I2 T1 u* r$ h
       在开发者页面中你可以看到网页的源码「Elementes」、控制台「Console」、网页源码「Sources」、网络请求面板「Network」等等。详细的教程可以去看下官方的文档:
4 g3 T! O: l2 U' B, ohttps://developers.google.com/web/tools/chrome-devtools/?hl=zh-cn" j. w2 V8 R6 h( ^2 P

1 ^6 s  w/ H" [7 A- g3.2 Nodejs 安装& W  v4 q- T5 f9 N* p! t! @7 d% O
       因为涉及 JS 的调试验证,所以除了 Python 环境外,你还需要Nodejs( JS 的运行环境)和 WebStorm(IDE)。
& h2 A7 P# d) h* |  O7 q 4.jpg
) D4 b" B( V7 A# c; V) Y       Nodejs 去官网下载安装包后直接一键安装即可,安装完毕后去控制台运行 node -- version,如果出现版本号即代表安装成功。WebStorm 安装完后需要激活,激活教程网上很多,大家自行搜索。它是 Jet Brains 的产品(和 PyCharm 是同一家公司),所以使用方式与 PyCharm 很类似。: b& V5 w) u4 x3 @6 l4 L/ i" }
+ P8 j& x% X' }+ O8 P& A
4 实战练习6 b0 M2 ~( D; G# r0 ~( ^0 |0 z  a" y
接下来就带大家进行实战练习,这次我们爬取的对象是「企名片」网站:
% [. N8 W: u* Z; yhttps://www.qimingpian.com/finosda/project/pinvestment3 u2 A: y$ [; Z4 N
+ [# [8 P1 ]7 p2 D1 d5 z
4.1 网站分析5 j* c7 d' d0 R) y; Z# S
       首先打开链接,点击 F12 查看网络请求面板。在 pinvestment 响应里可以看到是一个 JS 调用的代码,并没有我们想要的 HTML 代码,显示网页是由 JS 动态生成。
' g8 K' U. z0 V! F6 f 6.jpg % W* @/ ?$ U5 B# S5 J
       在点击 XHR,我们就可以看到一个 productListVip,这里面有个 encrypt_data 数据。参数内容像是一串 Base64 字符。既然网站对这个参数做了加密,说明它不想被爬取,所以可以做个假设:我们的目标数据就是 encrypt_data 参数里的内容。( D- G  s2 u3 |0 X
7.jpg - n+ c; ]6 Q3 `) P) V/ w
       接下来我们就要破解 encrypt_data。: s2 ~0 L+ }/ d4 }, B3 X! V
4.2 断点调试 JS 源码; E; H- x4 R! s/ ~* R
       打开开发者工具,点击 Sources 我们在 js 文件夹中就可以找到网页的 JS 代码,在右侧我们就可以进行断点调试。
1 x2 U: w# P! w+ D3 h 8.jpg 4 U7 [7 q9 d, T8 T: z
       在断点调试拦里有个 XHR/fetch Breakpoints 选择,而我们含有 encrypt_data 加密的参数正是一个 XHR 请求,所以我们点击+号,把 productlistVip 请求 url 添加进去。
, L' g4 H0 g2 m4 m" C" O  Y* @; ]- e 9.jpg
2 K# R8 u: b3 n       随后我们重新刷新网页,就可以一步步的调试找到可疑的地方。
. Q2 ^5 z; z% R小技巧:; Z1 e8 {+ b3 ]6 z3 Z
1 花括号进行美化
/ o+ z& U6 J6 ^( j+ X! s8 _$ P) K5 g! ]* a% i7 r  ~1 _) P
      点击左下角的花括号,可以把乱序的 JS 代码,变成有序的代码,看起来就非常的方便。
9 V! j& k+ }& Y% U 10.jpg + q: y6 M: a. B+ H8 f/ I
11.jpg
$ c2 j& X% M0 @: z# P( O0 Z2 控制台输出执行结果
; T3 h2 ]( v& n; j, Q       如果你找到比较可疑的点,你可以选中可疑的代码段,点击右键有个 Evaluate selected 选项,它就会在控制台输出执行的结果。
9 Z' n4 Y' X+ s8 t$ V7 l  X9 }# u9 g
$ V! @4 @# v/ {3 d3 l% Q 12.jpg / o& x# W& y9 v% K; u- M
13.jpg
5 ]0 O8 L  M- v9 I       其实上图中执行 Object(d.a)(e.encrypt_data) 返回的内容就是我们需要的数据了。进到这个函数体里边,就能找到解密函数:其实上图中执行 Object(d.a)(e.encrypt_data) 返回的内容就是我们需要的数据了。进到这个函数体里边,就能找到解密函数:5 F( n: f/ g9 p1 ~  ?* c
14.jpg
7 Z) C) V& C1 t$ ^5 ^: p  @       function o(t) 就是我们需要的解密函数,可以看到它先调用 s 函数,传入了四个参数,除了a.a.decode(t) 外其他三个都是写死的,最后用 JSON.parse 转为 json 对象。
: K9 C# E. X& t- }1 P$ S然而,找到解密函数后,我们要做的不是去分析它函数内部做了什么,虽然可以研究它的解密算法然后用 Python 重写,但这样太复杂且没必要。因为我们可以用 PyExecJS 这个库,直接用 Python 调用并执行 js 代码。
% i$ X7 j9 p( T! h7 E       这时候,WebStorm 就派上用场了。新建一个 js 文件,把 function o里涉及的代码全部抠下来。然后执行 console.log 把执行结果打印出来。篇幅问题就只贴部分代码:7 \- b* l4 F5 p) S! `0 Q

: R- s- C0 C! r/ a8 ?* t1 t' c 15.jpg
! ^0 V8 B$ g; B& N) a$ W& z) q       成功输出正确的数据,最后用 Python 去调用解密函数就行了。
2 N- {, `: z7 ^6 u# n3 a, p2 x  ` 16.jpg 2 c; l) ^- P- z8 X1 M
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|paopaomj.COM ( 渝ICP备18007172号|渝公网安备50010502503914号 )

GMT+8, 2026-1-9 09:05

Powered by paopaomj X3.5 © 2016-2025 sitemap

快速回复 返回顶部 返回列表