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', 
.....
.....
相关文章
|
5天前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
34 6
|
20天前
|
自然语言处理 JavaScript 前端开发
深入理解JavaScript中的闭包:原理与实战
【10月更文挑战第12天】深入理解JavaScript中的闭包:原理与实战
|
5天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
76 44
|
1天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
7 1
|
1天前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
6 1
|
6天前
|
数据可视化 开发者 Python
Python GUI开发:Tkinter与PyQt的实战应用与对比分析
【10月更文挑战第26天】本文介绍了Python中两种常用的GUI工具包——Tkinter和PyQt。Tkinter内置于Python标准库,适合初学者快速上手,提供基本的GUI组件和方法。PyQt基于Qt库,功能强大且灵活,适用于创建复杂的GUI应用程序。通过实战示例和对比分析,帮助开发者选择合适的工具包以满足项目需求。
34 7
|
6天前
|
数据采集 Web App开发 前端开发
Python爬虫进阶:Selenium在动态网页抓取中的实战
【10月更文挑战第26天】动态网页抓取是网络爬虫的难点,因为数据通常通过JavaScript异步加载。Selenium通过模拟浏览器行为,可以加载和执行JavaScript,从而获取动态网页的完整内容。本文通过实战案例,介绍如何使用Selenium在Python中抓取动态网页。首先安装Selenium库和浏览器驱动,然后通过示例代码展示如何抓取英国国家美术馆的图片信息。
26 6
|
4天前
|
Linux 开发者 iOS开发
Python系统调用实战:如何在不同操作系统间游刃有余🐟
本文介绍了 Python 在跨平台开发中的强大能力,通过实际例子展示了如何使用 `os` 和 `pathlib` 模块处理文件系统操作,`subprocess` 模块执行外部命令,以及 `tkinter` 创建跨平台的图形用户界面。这些工具和模块帮助开发者轻松应对不同操作系统间的差异,专注于业务逻辑。
16 2
|
6天前
|
数据采集 前端开发 中间件
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第26天】Python是一种强大的编程语言,在数据抓取和网络爬虫领域应用广泛。Scrapy作为高效灵活的爬虫框架,为开发者提供了强大的工具集。本文通过实战案例,详细解析Scrapy框架的应用与技巧,并附上示例代码。文章介绍了Scrapy的基本概念、创建项目、编写简单爬虫、高级特性和技巧等内容。
25 4
|
6天前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
23 2