JavaScript逆向爬取实战——使用Python实现列表页内容爬取(二)

简介: JavaScript逆向爬取实战——使用Python实现列表页内容爬取(二)

接上文 JavaScript逆向爬取实战——使用Python实现列表页内容爬取(一)

3. 寻找列表页面的加密逻辑
根据上面的回溯查找,已经找到了token的位置了,可以观察这个token对应的变量,它叫做_0x263439,所以关键就是看看这个变量哪里来的。怎么找呢?添加断点就好了。

取消上面设置的断点,看一下这个变量是哪里生成的,如下图所示:

image.png

设置了新断点,刷新网页,发现网页停在新的断点上面,如下图所示:

image.png

这时我们就可以观察正在运行的一些变量了,比如把鼠标放在各个变量上,可以看到变量的值和类型;把鼠标放在变量_0x2fa7bd上,会有一个浮窗显示,如下图所示:
image.png

另外,还可以在右侧的Watch面板中添加想要查看的变量,如这行代码的内容为:

, _0x263439 =Object(_0x2fa7bd['a'])(this['$store']['state']['url']['index']);

我们比较感兴趣的可能就是_0x51c425,还有this里的$store属性。展开Watch面板,然后点击+号,把想看的变量添加到Watch面板里面,如下图所示:

image.png

可以发现,_0x2fa7bd是一个对象,它具有属性a,其值是一个方法。this[‘$store’][‘state’][‘url’][‘index’]的值其实就是/api/movie,即Ajax请求URL的Path。_0x263439就是调用前者的方法传入/api/movie得到的。如下图所示:

image.png

下一步就是去寻找这个方法。我们可以把Watch面板的_0x2fa7bd展开,这里会显示的FunctionLocation就是这个函数的代码位置,如下图所示:
image.png

点击进入,这时我们就进入一个新的名字为_0x456254的方法里,在这个方法中,应该就有token的生成逻辑了。添加断点,然后点击面板右上角蓝色箭头状的Resume script execution按钮,如下图所示:

image.png

接下来,不断进行单步调试,观察这里的执行逻辑和每一步调试的结果都有啥变化,如下图所示:
image.png

根据上面的单步调试,在Watch面板下看到每步具体结果,总结出这个token的构造逻辑,如下:

  1. 传入的/api/movie会构造一个初始化列表,将变量命名_0x31a891
  2. 获取当前的时间戳,命名为_0x5da681,调用push方法将其添加到_0x31a891变量代表的列表中
  3. 将_0x31a891变量用,拼接,然后进行SHA1编码,命名为_0xf7c3c7
  4. 将_0xf7c3c7(SHA1编码的结果)和_0x5da681(时间戳)用逗号拼接,命名为_0x3c8435
  5. 将_0x3c8435进行Base64编码,命名为_0x104b5b,得到最后的token

4. 使用Python实现列表页的爬取
实现这个逻辑,需要借助两个库:一个是hashlib,它提供了sha1方法;另外一个是base64库,它提供了b64encode方法对结果进行Base64编码。实现代码如下:

import hashlib
import time
import base64
from typing import List, Any
import requests

INDEX_URL = 'https://spa6.scrape.center/api/movie?limit={limit}&offset={offset}&token={token}'
LIMIT = 10
OFFSET = 0

def get_token(args: List[Any]):
    timestamp = str(int(time.time()))
    args.append(timestamp)
    sign = hashlib.sha1(','.join(args).encode('utf-8')).hexdigest()
    return base64.b64encode(','.join([sign, timestamp]).encode('utf-8')).decode('utf-8')

args = ['/api/movie']
token = get_token(args=args)
index_url = INDEX_URL.format(limit=LIMIT, offset=OFFSET, token=token)
response = requests.get(index_url)
print('response', response.json())

根据上面的逻辑加密流程实现出来了,这里先模拟爬取了第一页的内容,最后运行一下,可以得到最终的输出结果了。如下所示:

/usr/bin/python3 /Users/bruce_liu/PycharmProjects/崔庆才--爬虫/11章JavaScript逆向爬虫/python爬取列表页.py
response {
   'count': 102, 'results': [{
   'id': 1, 'name': '霸王别姬', 'alias': 'Farewell My Concubine', 'cover': 'https://p0.meituan.net/movie/ce4da3e03e655b5b88ed31b5cd7896cf62472.jpg@464w_644h_1e_1c', 'categories': ['剧情', '爱情'], 'published_at': '1993-07-26', 'minute': 171, 'score': 9.5, 'regions': ['中国内地', '中国香港']}, {
   'id': 2, 'name': '这个杀手不太冷', 'alias': 'Léon', 'cover': 'https://p1.meituan.net/movie/6bea9af4524dfbd0b668eaa7e187c3df767253.jpg@464w_644h_1e_1c', 'categories': ['剧情', '动作', '犯罪'], 'published_at': '1994-09-14', 'minute': 110, 'score': 9.5, 'regions': ['法国']}, {
   'id': 3, 'name': '肖申克的救赎', 'alias': 'The Shawshank Redemption', 'cover': 'https://p0.meituan.net/movie/283292171619cdfd5b240c8fd093f1eb255670.jpg@464w_644h_1e_1c', 'categories': ['剧情', '犯罪'], 'published_at': '1994-09-10', 'minute': 142, 'score': 9.5, 'regions': ['美国']}, {
   'id': 4, 'name': '泰坦尼克号', 'alias': 'Titanic', 
.....
.....
相关文章
|
26天前
|
数据采集 数据可视化 数据挖掘
Python数据分析实战:Pandas处理结构化数据的核心技巧
在数据驱动时代,结构化数据是分析决策的基础。Python的Pandas库凭借其高效的数据结构和丰富的功能,成为处理结构化数据的利器。本文通过真实场景和代码示例,讲解Pandas的核心操作,包括数据加载、清洗、转换、分析与性能优化,帮助你从数据中提取有价值的洞察,提升数据处理效率。
101 3
|
26天前
|
数据可视化 Linux iOS开发
Python脚本转EXE文件实战指南:从原理到操作全解析
本教程详解如何将Python脚本打包为EXE文件,涵盖PyInstaller、auto-py-to-exe和cx_Freeze三种工具,包含实战案例与常见问题解决方案,助你轻松发布独立运行的Python程序。
327 2
|
26天前
|
存储 监控 API
Python实战:跨平台电商数据聚合系统的技术实现
本文介绍如何通过标准化API调用协议,实现淘宝、京东、拼多多等电商平台的商品数据自动化采集、清洗与存储。内容涵盖技术架构设计、Python代码示例及高阶应用(如价格监控系统),提供可直接落地的技术方案,帮助开发者解决多平台数据同步难题。
|
2月前
|
机器学习/深度学习 算法 文件存储
神经架构搜索NAS详解:三种核心算法原理与Python实战代码
神经架构搜索(NAS)正被广泛应用于大模型及语言/视觉模型设计,如LangVision-LoRA-NAS、Jet-Nemotron等。本文回顾NAS核心技术,解析其自动化设计原理,探讨强化学习、进化算法与梯度方法的应用与差异,揭示NAS在大模型时代的潜力与挑战。
285 6
神经架构搜索NAS详解:三种核心算法原理与Python实战代码
|
13天前
|
机器学习/深度学习 文字识别 Java
Python实现PDF图片OCR识别:从原理到实战的全流程解析
本文详解2025年Python实现扫描PDF文本提取的四大OCR方案(Tesseract、EasyOCR、PaddleOCR、OCRmyPDF),涵盖环境配置、图像预处理、核心识别与性能优化,结合财务票据、古籍数字化等实战场景,助力高效构建自动化文档处理系统。
212 0
|
11天前
|
小程序 PHP 图形学
热门小游戏源码(Python+PHP)下载-微信小程序游戏源码Unity发实战指南​
本文详解如何结合Python、PHP与Unity开发并部署小游戏至微信小程序。涵盖技术选型、Pygame实战、PHP后端对接、Unity转换适配及性能优化,提供从原型到发布的完整指南,助力开发者快速上手并发布游戏。
|
2月前
|
数据采集 消息中间件 并行计算
Python多线程与多进程性能对比:从原理到实战的深度解析
在Python编程中,多线程与多进程是提升并发性能的关键手段。本文通过实验数据、代码示例和通俗比喻,深入解析两者在不同任务类型下的性能表现,帮助开发者科学选择并发策略,优化程序效率。
116 1
|
13天前
|
JavaScript 前端开发 安全
【逆向】Python 调用 JS 代码实战:使用 pyexecjs 与 Node.js 无缝衔接
本文介绍了如何使用 Python 的轻量级库 `pyexecjs` 调用 JavaScript 代码,并结合 Node.js 实现完整的执行流程。内容涵盖环境搭建、基本使用、常见问题解决方案及爬虫逆向分析中的实战技巧,帮助开发者在 Python 中高效处理 JS 逻辑。
|
19天前
|
开发工具 Android开发 开发者
用Flet打造跨平台文本编辑器:从零到一的Python实战指南
本文介绍如何使用Flet框架开发一个跨平台、自动保存的文本编辑器,代码不足200行,兼具现代化UI与高效开发体验。
152 0
|
21天前
|
算法 安全 数据安全/隐私保护
Python随机数函数全解析:5个核心工具的实战指南
Python的random模块不仅包含基础的随机数生成函数,还提供了如randint()、choice()、shuffle()和sample()等实用工具,适用于游戏开发、密码学、统计模拟等多个领域。本文深入解析这些函数的用法、底层原理及最佳实践,帮助开发者高效利用随机数,提升代码质量与安全性。
110 0

推荐镜像

更多