url: http://mmpz.ttzhuijuba.com/?r=/l&cids=1&site=classify&sort=0
分析过程
-
抓取流量包。
主要关注图中框起来这条流量包,因为这条流量包返回的是当前页面数据。
该流量包的url地址有个加密的参数sign
,目的就是找到sign
参数的加密过程。 -
按照常规思路会去搜索url中的关键词,但找到对应的地方不能很好的定位到
sign
参数,所以需要换一种思路。
-
我们直接搜索
sign
关键字,有很多条记录,需要稍微筛选一下。
-
只有两条数据符合我们的要求。先试
sign: n("7bc9")
,打断点。
输出一下n("7bc9")
。
发现输出是个原生代码,所以此处不是我们要的,可以排除。 -
找到另一条符合要求的记录,打断点。
-
刷新界面,触发该断点,查看每一个处的值。
makeSign
是个函数。
s
和this.config.appSecret
都是变量。
-
先搞清楚两个变量的来源。
s = p(p({}, {
version: this.config.version,
appKey: this.config.appKey
}), r)
s
也涉及到了this.config
变量,那就先确定this.config
变量是什么。在该文件中搜索this.config
,定义处如下。
this.config
的初始化涉及到传参e
,看哪里调用的该函数(看call stack找)。
e
是个固定值,Object.assign
函数是一个用于复制的函数,故this.config
也是一个定值,this.config.appSecret
的值就显而易见了。
再回去看s
变量的定义。p
函数定义如下。
都是一些原生代码,看不懂也没关系,直接运行一下即可。
相当于就是给version
和appKey
赋值。
makeSign
函数的定义如下。
看到有md5摘要算法了,那么只要搞清楚要加密的数据就可以了。
n
的值如下。
e
就是传过来的this.config.appSecret
,接下来就简单了,将两个值进行拼接即可。
整个解析步骤结束了。那么可以通过直接编写python代码来爬取数据了。
import requests
import hashlib
md_hash = hashlib.md5()
data = "appKey=612bcfe884763&version=v1.0.2&key=5dd20b08158402032845b45f5b67a349"
md_hash.update(data.encode("utf-8"))
sign = md_hash.hexdigest()
pageId = input("请输入你要查第几页:")
url = "https://openapi.dataoke.com/api/goods/get-goods-list?version=v1.2.4&appKey=612bcfe884763&pageId={}" \
"&pageSize=100&sort=0&cids=1&tmall=1&commissionRateLowerLimit=3&hasCoupon=1&keyWords=&sign={}".format(pageId, sign)
resp = requests.get(url, headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, "
"like Gecko) Chrome/123.0.0.0 Safari/537.36"})
print(resp.text)
运行结果如下: