爬虫采集百度快递逻辑
百度物流单号自动识别 + 轨迹查询 标准开发对接文档
版本说明
文档版本:V1.0
适配语言:PHP/Java/Python/NodeJS/Go 等任意后端语言
适配框架:ThinkPHP5.x/ ThinkPHP6.x 及所有主流框架
核心特性:仅传入物流单号 → 自动获取 Cookie → 获取 TokenV2 → 识别快递公司 → 查询物流轨迹
流程固定不可乱序:获取 Cookie → 获取 TokenV2 → 识别快递公司 → 查询物流详情
一、前置环境与依赖
1. 运行环境
- PHP 7.2+(PHP 场景)
- 服务器可正常访问外网百度域名
- 支持:HTTP/HTTPS 请求、JSON 解析、Cookie 解析、正则表达式、异常捕获
2. 第三方依赖
PHP 必装 HTTP 客户端:
bash
运行
composer require guzzlehttp/guzzle:^6.0
说明:锁定 6.x 版本,避免高版本 API 兼容问题
3. 目录结构(ThinkPHP 标准)
plaintext
app/
└── admin/
└── controller/
└── Express.php # 物流查询核心控制器
二、整体业务流程(强制顺序)
- 接收并校验前端传入物流单号,非空校验
- 第一步:请求百度页面,抓取核心 Cookie(全局鉴权凭证)
- 第二步:携带有效 Cookie,抓取页面 TokenV2(物流详情接口校验凭证)
- 第三步:携带 Cookie + 单号,调用接口自动识别快递公司编码
- 第四步:携带 Cookie+TokenV2 + 单号 + 快递公司编码,查询完整物流轨迹
- 统一封装 JSON 结果返回,全局异常捕获、日志记录
三、全局基础配置
1. 核心域名
plaintext
百度搜索页面:www.baidu.com
百度物流接口:alayn.baidu.com
2. 必须保留核心 Cookie 列表
仅保留以下字段,其余丢弃:
plaintext
BAIDUID、BIDUPSID、H_PS_PSSID、BDORZ、BAIDUID_BFESS
3. 通用请求头(防爬虫风控)
plaintext
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/128.0.0.0 Safari/537.36
Timeout: 10秒
关闭SSL证书验证:verify=false
4. 固定私有参数
plaintext
query_from_srcid = 51151 (百度固定来源ID,不可修改)
TokenV2 正则规则:/tokenV2=(.*?)"/
四、对外入口接口
1. 接口信息
- 请求方式:
GET - 接口路由:
/admin/express/query - 接口描述:传入物流单号,自动识别快递公司 + 返回完整物流轨迹
2. 请求入参
表格
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| nu | 字符串 | 是 | 物流单号,数字 / 字母组合 |
3. 统一响应格式
成功响应
json
{
"code": 0,
"msg": "查询成功",
"data": {
"company": "ems",
"express_info": {
"code": 0,
"message": "success",
"data": {
"list": [
{
"time": "2025-01-01 10:00:00",
"content": "【北京市】快递已揽收"
},
{
"time": "2025-01-02 12:00:00",
"content": "【上海市】快递已派送"
}
],
"status": "已签收"
}
}
}
}
失败响应
json
{
"code": 1002,
"msg": "无法识别快递公司",
"data": null
}
4. 错误码定义
表格
| 错误码 | 含义说明 |
|---|---|
| 0 | 查询成功 |
| 1001 | 物流单号不能为空 |
| 1002 | 业务异常(Cookie 失效 / 无 TokenV2 / 识别失败 / 查询失败) |
五、分步接口详细规范(按流程执行)
步骤 1:抓取百度核心 Cookie
请求地址
plaintext
http://www.baidu.com/s?ie=utf-8&f=8&wd=快递
请求配置
- 超时:10s
- 关闭 SSL 验证
- 携带标准 UA
处理逻辑
- 获取响应头
Set-Cookie数组 - 按
;拆分每条 Cookie,取第一段键值对 - 按指定核心 Cookie 白名单过滤
- 返回 Cookie 键值数组,供后续所有步骤使用
步骤 2:抓取 TokenV2
请求地址
与步骤 1 同一地址
请求头必须携带
plaintext
Cookie:步骤1获取的Cookie拼接字符串
User-Agent:标准浏览器UA
Host:www.baidu.com
Referer:https://www.baidu.com/
匹配规则
正则表达式:
plaintext
/tokenV2=(.*?)"/
处理逻辑
- 获取页面 HTML 源码
- 正则非贪婪匹配捕获 TokenV2 值
- 匹配为空直接抛出异常
步骤 3:自动识别快递公司
请求地址
plaintext
http://alayn.baidu.com/express/appdetail/get_com?num={物流单号}
请求头
plaintext
Cookie:有效Cookie串
User-Agent:标准UA
接口返回示例
json
{"code":0,"message":"success","data":{"company":"ems"}}
校验规则
- 校验 JSON 解析是否正常
- 校验
code === 0 - 提取
data.company快递公司编码 - 无编码则抛出异常
步骤 4:查询物流详情轨迹
请求地址
plaintext
https://alayn.baidu.com/express/appdetail/get_detail
URL 请求参数
表格
| 参数 | 来源 |
|---|---|
| query_from_srcid | 固定 51151 |
| tokenV2 | 步骤 2 获取 |
| nu | 前端传入物流单号 |
| com | 步骤 3 识别的快递公司编码 |
请求头
plaintext
Cookie:有效Cookie串
User-Agent:标准UA
Referer:https://www.baidu.com
Host:alayn.baidu.com
处理逻辑
- 发起 GET 请求
- 解析 JSON,校验格式合法性
- 返回原始物流数据,上层统一封装返回
六、异常处理规范
- 所有步骤必须加入
try-catch异常捕获 - 异常信息写入系统日志,记录:单号 + 错误原因
- 禁止直接抛出程序错误页面,统一返回 JSON 错误格式
- 任意步骤失败,直接终止后续流程并返回错误
七、常见问题及解决方案
表格
| 问题现象 | 原因 | 解决方案 |
|---|---|---|
| Cookie 获取为空 | UA 不真实、服务器无法访问百度 | 更换新版浏览器 UA、检查外网连通性 |
| TokenV2 匹配不到 | Cookie 失效、页面结构变更 | 重新抓取 Cookie、调整正则表达式 |
| 快递公司识别失败 | 单号错误、百度接口风控 | 核对单号、降低请求频率、轮换 UA |
| 物流详情无数据 | TokenV2 失效、快递公司编码错误 | 重新获取 TokenV2、校验识别结果 |
八、进阶优化方案
- 缓存处理:Cookie、TokenV2 设置 5 分钟缓存,减少重复抓取,降低风控
- 请求限流:单 IP 1 分钟限制 10 次请求,防止百度封禁
- 快递公司映射:编码转中文(sf→顺丰、ems→邮政 EMS、yt→圆通)
- 异步队列:高并发场景改用异步队列,避免接口超时
- 多源降级:百度接口失效,自动切换快递 100 等备用接口
九、开发核心要点总结
- 流程必须严格按:获取 Cookie → 获取 TokenV2 → 识别快递 → 查询轨迹,不可颠倒
- 百度接口无固定 Key,完全依赖动态 Cookie+TokenV2双重鉴权
- 必须模拟真实浏览器 UA、Referer、Host,否则极易被风控拦截
- 每一步都要做格式校验、JSON 异常校验、业务状态校验
- 统一出入参和错误码,适配前后端分离、多语言对接

浙公网安备 33010602011771号