让小白能看懂的爬虫代码,让小白能学到的爬虫思路
目标网站:https://www.mashangpa.com/
一、抓包分析
右击检查

出现debugger,右击不在此处暂停绕过后翻页查看是否有加密参数

一个page当前页码、一个加密参数m、一个时间戳_ts,查看堆栈调用方法

这两个随便点进去一个就可以,接下来进入调试逆向还原
二、逆向分析
在当前位置打上断点并翻页

加密位置就在上面,我们直接打上断点调试,发现m是由f得来的,我们再继续分析f

这是进行了轻度混淆,我们把这些拆开打印出来或者把鼠标放在相应的字符或变量上就能看到,框起来的就是还原后的代码,d[O(0x92, 'PtOP')]传入三个参数,我们直接把鼠标放在上面出现改函数位置点击进去看逻辑

传入i、j、k三个参数,返回的是i(j, k),也就是说把i作为新的函数传入j和k两个参数得来的,通过前面的堆栈分析就是把callEncryptFunction作为函数嘛,传入c(就是当前page)和e(时间戳_ts),接下来直接进入callEncryptFunction看逻辑

该函数传入两个参数,先定义了一个F,这个b缺少了,要去分析也可以,但是与本题无关,我们只需要把m得到就行,其他的还原方法之类的完全是浪费时间,更何况我们函数是传入了参数的,节奏要跟着参数走,所以只需要看下面的try….catch异常语句,会点基础的都知道try是运行语句的结果的,catch是用来报错返回另一个结果(自定义报错信息或者其他),看见console就知道大概率是返回error打印一句话,这个就不用分析了,直接看const g = xxxx这部分

鼠标放上去发现这又是另一个文件,看来我们想要的加密逻辑就在这里面了,点进去看逻辑

这便是本题的重点,wasm

简单了解一下,后续自行搜索深入学习
对于作者这种小菜鸟来说,直接看懂加还原其中逻辑算法是不行的,现在ai工具发达,我们可以直接把wasm代码复制发给ai让其还原成js代码

还原后的逻辑很清晰了,大概意思是当前页码page加上时间戳整除3得到的数字再加上16358(数字加减乘除法),把代码复制到本地运行检查是否能正确得到相似的值

很像了,这样就得到了加密参数m,接下来再自定义时间戳,把page和时间戳作为参数动态传入这个方法就能得到每一页的值了,思路清晰,开始写代码。
三、编写代码
js代码
function encrypt(page, timestamp) {
// Math.trunc 用于模拟 WASM 的 i32.div_s (整数除法,舍弃小数)
return (page + Math.trunc(timestamp / 3)) + 16358;
}
console.log(encrypt(2, 1773125224))
运行代码
"""
-*- coding: utf-8 -*-
@author : @编程小白学py
@Time : 2026/3/10
"""
# 导包
import time
import execjs
import requests
from urllib3.exceptions import InsecureRequestWarning
# 禁用ssl警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
# 总和数
count = 0
# 请求地址
url = 'https://www.mashangpa.com/api/problem-detail/11/data/'
# 请求头(一般需要cookie、user-agent、referer)
headers = {
'origin': 'https://www.mashangpa.com',
'referer': 'https://www.mashangpa.com/problem-detail/11/',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0',
'cookie': 'sessionid=o2eboo131ghp8b9tvokamg8lwwhpy1m4; Hm_lvt_0d2227abf9548feda3b9cb6fddee26c0=1772782763,1773049797; HMACCOUNT=BA1CF7DE2E33BFE0; Hm_lpvt_0d2227abf9548feda3b9cb6fddee26c0=1773125014',
}
# 因为有20页,所以循环20次
for page in range(1, 21):
timestamp = int(time.time())
# 打开本地js文件
with open('test.js', 'r', encoding='utf-8')as f:
ctx = execjs.compile(f.read())
data_m = ctx.call('encrypt', page, timestamp)
params = {
'page': page,
'm': data_m,
'_ts': timestamp
}
# 响应结果
response = requests.get(url, params=params, headers=headers, verify=False).json()['current_array']
# 每页数字和
number = sum(response)
count += number
print(f'第{page}页数字和:', number)
print(f'总和:', count)
四、运行结果


我们将这个答案填上去,发现正确(每个人答案不一样,需要自己去试一下)




