首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
1.1 HTTP基本原理
1.2 Web 网页基础
1.3 爬虫的基本原理
1.4 Session和Cookie
1.5 代理的基本原理
1.6 多线程和多进程的基本原理
2.1 urllib的使用
2.2 requests的使用
2.3 正则表达式
2.4 httpx的使用
2.5 基础爬虫案例实战
3.1 XPath的使用
3.2 Beautiful Soup的使用
3.3 pyquery的使用
3.4 parsel 的使用
4.1 TXT 文本文件存储
4.2 JSON 文件存储
4.3 CSV 文件存储
4.4 MySQL 存储
4.5 MongoDB 文档存储
4.6 Redis缓存存储
4.7 Elasticsearch 搜索引擎存储
4.8 RabbitMQ 的使用
5.1 什么是 Ajax
5.2 Ajax分析方法
5.3 Ajax 分析与爬取实战
6.1 协程的基本原理
6.2 aiohttp的使用
6.3 aiohttp 异步爬取实战
7.1 Selenium 的使用
7.2 Splash 的使用
7.3 Pyppeteer 的使用
7.4 Playwright 的使用
7.5 Selenium 爬取实战
7.6 Pyppeteer 爬取实战
7.7 CSS 位置偏移反爬案例分析与爬取实战
7.8 字体反爬案例分析与爬取实战
8.1 使用 OCR 技术识别图形验证码
8.2 使用 OpenCV 识别滑动验证码的缺口
8.3 使用深度学习识别图形验证码
8.4 使用深度学习识别滑动验证码的缺口
8.5 使用打码平台识别验证码
8.6 手机验证码的自动化处理
9.1 代理的设置
9.2 代理池的维护
9.3 付费代理的使用
9.4 ADSL 拨号代理的搭建方法
9.5 代理反爬案例爬取实战
10.1 模拟登录的基本原理
10.2 基于Session和Cookie的模拟登录爬取实战
10.3 基于JWT的模拟登录爬取实战
10.4 大规模账号池的搭建
11.1 网站加密和混淆技术简介
11.2 浏览器调试常用技巧
11.3 JavaScript Hook 的使用
11.4 无限 debugger 的原理与绕过
11.5 使用 Python 模拟执行 JavaScript
11.6 使用 Node.js 模拟执行 JavaScript
11.7 浏览器环境下 JavaScript 的模拟执行
11.8 AST 技术简介
11.9 使用 AST 技术还原混淆代码
11.10 特殊混淆案例的还原
11.11 WebAssembly 案例分析和爬取实战
11.12 JavaScript 逆向技巧总结
11.13 JavaScript 逆向爬取实战
当前位置:
首页>>
技术小册>>
Python3网络爬虫开发实战(上)
小册名称:Python3网络爬虫开发实战(上)
### 11.9 使用 AST 技术还原混淆代码 在Python网络爬虫的开发过程中,经常会遇到需要处理经过混淆的代码的情况。代码混淆是一种通过将代码转换成难以阅读和理解的形式来保护源代码的技术。虽然它增强了代码的安全性,但对于爬虫开发者而言,这可能成为分析网页行为、解析数据结构的障碍。幸运的是,Python提供了丰富的工具和库,特别是抽象语法树(AST)技术,可以帮助我们解析和还原这些混淆的代码。 #### 11.9.1 理解代码混淆与AST **代码混淆**:通常包括变量名替换为无意义的字符、控制流变换、字符串加密或拆分、以及删除不必要的注释和空格等手段。这些措施使得代码对于人类阅读者来说几乎不可读,但对机器执行而言依然有效。 **抽象语法树(AST)**:是源代码的抽象语法结构的树状表示形式。Python的`ast`模块允许Python程序处理Python源代码的AST,从而可以分析、修改或生成新的源代码。AST的每一个节点都代表了源代码中的一种结构,如函数定义、条件语句、循环等。 #### 11.9.2 为什么要使用AST还原混淆代码 - **提高可读性**:将混淆的代码转换成更易于理解的格式,便于开发者分析逻辑。 - **便于调试**:在爬虫开发过程中,如果目标网站代码被混淆,直接调试可能非常困难,AST还原可以部分解决这个问题。 - **数据分析**:对于需要解析网页动态生成内容的情况,了解混淆代码背后的逻辑是提取所需数据的关键。 #### 11.9.3 准备工作 在开始之前,确保你的Python环境已经安装并配置好。接下来,我们将使用Python的`ast`模块来操作AST,可能还需要使用`dis`模块来查看字节码,以及`exec`或`eval`函数来执行修改后的代码(注意:执行未知代码存在安全风险,应谨慎使用)。 #### 11.9.4 使用AST遍历和修改混淆代码 1. **解析源代码到AST**: 使用`ast.parse()`函数将源代码字符串解析成AST。 ```python import ast source_code = """ def obfuscated_function(): a = 1 b = 2 c = a + b return c """ tree = ast.parse(source_code) ``` 2. **遍历AST**: 使用`ast.NodeVisitor`或`ast.NodeTransformer`来遍历和修改AST。`NodeVisitor`用于简单的遍历,而`NodeTransformer`提供了修改节点的方法。 ```python class RenameVariables(ast.NodeTransformer): def visit_Name(self, node): if isinstance(node.ctx, ast.Store): # 如果是赋值操作 new_name = f"var_{id(node)}" # 生成新的变量名 node.id = new_name # 修改变量名 return node modified_tree = RenameVariables().visit(tree) ``` 注意:这里只是简单地重命名了所有变量,实际中混淆代码的处理会更复杂。 3. **将修改后的AST转换回源代码**: 使用`ast.unparse()`(需要第三方库如`astpretty`或`astor`,因为标准库`ast`没有直接提供此功能)或自己编写代码来遍历AST并生成新的源代码字符串。 ```bash pip install astor ``` ```python import astor modified_source_code = astor.to_source(modified_tree) print(modified_source_code) ``` #### 11.9.5 处理复杂混淆技术 对于更复杂的混淆技术,如控制流平坦化、字符串加密等,单纯通过AST修改可能不够。这时,可能需要结合其他技术,如: - **动态分析**:使用调试器或执行跟踪工具来观察代码运行时的行为。 - **逆向工程**:如果混淆代码是JavaScript等前端代码,可以通过浏览器的开发者工具进行调试和分析。 - **模式识别**:通过识别常见的混淆模式(如长变量名、大量条件判断等)来手动或自动地简化代码。 #### 11.9.6 注意事项 - **安全性**:执行未知或可能不安全的代码时要格外小心,最好在一个隔离的环境中执行。 - **性能**:AST的修改和重新生成可能会引入额外的性能开销,特别是在处理大型代码库时。 - **法律与道德**:在尝试解密或分析他人代码时,确保你的行为符合当地法律法规和道德标准。 #### 11.9.7 结论 使用AST技术还原混淆代码是网络爬虫开发中一项重要的技能。虽然它可能涉及复杂的操作和深入的理解,但通过合理的方法和工具,我们可以有效地提高代码的可读性和可维护性,从而更高效地开发和调试网络爬虫。希望本章的内容能为你的Python网络爬虫开发之旅提供有益的帮助。
上一篇:
11.8 AST 技术简介
下一篇:
11.10 特殊混淆案例的还原
该分类下的相关小册推荐:
剑指Python(万变不离其宗)
Python编程轻松进阶(一)
Python编程轻松进阶(五)
Python机器学习基础教程(上)
Python高并发编程与实战
Python合辑12-面向对象
机器学习算法原理与实战
Python合辑11-闭包函数
Python合辑9-判断和循环
Python合辑13-面向对象编程案例(上)
Python高性能编程与实战
Python甚础Django与爬虫