一、Ajax接口分析与逆向工程
1.1 接口识别与分析
大众点评网站采用前后端分离架构,通过Ajax接口动态加载数据。我们可以通过浏览器开发者工具来识别这些接口:
- 打开大众点评网站,进入任意商户页面
- 按F12打开开发者工具,切换到***work(网络)面板
- 刷新页面,筛选XHR或Fetch请求
- 查看请求响应,寻找包含评论数据的JSON接口
通过分析,我们发现大众点评评论数据主要通过以下接口获取:
text
https://www.dianping.***/ajax/json/shopDynamic/allReview?shopId={shopId}&cityId={cityId}&shopType={shopType}&page={page}&pageSize={pageSize}
1.2 接口参数分析
对接口进行深入分析后,我们识别出以下关键参数:
| 参数名 | 含义 | 示例 |
|---|---|---|
| shopId | 商户ID | H9dNInbVZA9jJ5qH |
| cityId | 城市ID | 1(上海) |
| shopType | 商户类型 | 10(美食) |
| page | 页码 | 1 |
| pageSize | 每页数量 | 20 |
| _token | 加密令牌 | 动态生成 |
其中,<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">_token</font>参数是大众点评的反爬机制核心,需要特别处理。
1.3 加密参数逆向分析
大众点评使用JavaScript生成加密参数,我们可以通过以下方式分析:
// 大众点评token生成逻辑(简化版)
function generateToken() {
var e = Math.floor((new Date).getTime() / 1e3);
return md5("".concat(e).concat("some_secret_key"));
}
实际环境中,我们需要使用Python重现这一加密逻辑。
二、环境准备与依赖安装
2.1 JavaScript环境配置
由于大众点评使用JavaScript生成加密参数,我们需要在Python中执行JS代码:
# 安装Node.js(用于执行JavaScript代码)
# 访问 https://nodejs.org/ 下载并安装
# 安装PyExecJS
pip install pyexecjs
三、核心代码实现
3.1 加密参数生成器
import execjs
import time
import hashlib
class DianpingTokenGenerator:
def __init__(self):
# 加载JavaScript加密代码
with open('dianping_encrypt.js', 'r', encoding='utf-8') as f:
js_code = f.read()
self.ctx = execjs.***pile(js_code)
def generate_token(self):
"""生成大众点评接口所需的_token参数"""
timestamp = int(time.time())
# 调用JavaScript代码生成token
token = self.ctx.call('generateToken', timestamp)
return token
def generate_signature(self, params):
"""生成请求签名"""
# 对参数进行排序并拼接
sorted_params = sorted(params.items(), key=lambd