爬虫采集百度快递逻辑

百度物流单号自动识别 + 轨迹查询 标准开发对接文档

版本说明

文档版本: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  # 物流查询核心控制器
 

二、整体业务流程(强制顺序)

  1. 接收并校验前端传入物流单号,非空校验
  2. 第一步:请求百度页面,抓取核心 Cookie(全局鉴权凭证)
  3. 第二步:携带有效 Cookie,抓取页面 TokenV2(物流详情接口校验凭证)
  4. 第三步:携带 Cookie + 单号,调用接口自动识别快递公司编码
  5. 第四步:携带 Cookie+TokenV2 + 单号 + 快递公司编码,查询完整物流轨迹
  6. 统一封装 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

处理逻辑

  1. 获取响应头 Set-Cookie 数组
  2. ; 拆分每条 Cookie,取第一段键值对
  3. 按指定核心 Cookie 白名单过滤
  4. 返回 Cookie 键值数组,供后续所有步骤使用

步骤 2:抓取 TokenV2

请求地址

与步骤 1 同一地址

请求头必须携带

plaintext
 
 
Cookie:步骤1获取的Cookie拼接字符串
User-Agent:标准浏览器UA
Host:www.baidu.com
Referer:https://www.baidu.com/
 

匹配规则

正则表达式:
plaintext
 
 
/tokenV2=(.*?)"/
 

处理逻辑

  1. 获取页面 HTML 源码
  2. 正则非贪婪匹配捕获 TokenV2 值
  3. 匹配为空直接抛出异常

步骤 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"}}
 

校验规则

  1. 校验 JSON 解析是否正常
  2. 校验 code === 0
  3. 提取 data.company 快递公司编码
  4. 无编码则抛出异常

步骤 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
 

处理逻辑

  1. 发起 GET 请求
  2. 解析 JSON,校验格式合法性
  3. 返回原始物流数据,上层统一封装返回

六、异常处理规范

  1. 所有步骤必须加入 try-catch 异常捕获
  2. 异常信息写入系统日志,记录:单号 + 错误原因
  3. 禁止直接抛出程序错误页面,统一返回 JSON 错误格式
  4. 任意步骤失败,直接终止后续流程并返回错误

七、常见问题及解决方案

表格
 
问题现象原因解决方案
Cookie 获取为空 UA 不真实、服务器无法访问百度 更换新版浏览器 UA、检查外网连通性
TokenV2 匹配不到 Cookie 失效、页面结构变更 重新抓取 Cookie、调整正则表达式
快递公司识别失败 单号错误、百度接口风控 核对单号、降低请求频率、轮换 UA
物流详情无数据 TokenV2 失效、快递公司编码错误 重新获取 TokenV2、校验识别结果

八、进阶优化方案

  1. 缓存处理:Cookie、TokenV2 设置 5 分钟缓存,减少重复抓取,降低风控
  2. 请求限流:单 IP 1 分钟限制 10 次请求,防止百度封禁
  3. 快递公司映射:编码转中文(sf→顺丰、ems→邮政 EMS、yt→圆通)
  4. 异步队列:高并发场景改用异步队列,避免接口超时
  5. 多源降级:百度接口失效,自动切换快递 100 等备用接口

九、开发核心要点总结

  1. 流程必须严格按:获取 Cookie → 获取 TokenV2 → 识别快递 → 查询轨迹,不可颠倒
  2. 百度接口无固定 Key,完全依赖动态 Cookie+TokenV2双重鉴权
  3. 必须模拟真实浏览器 UA、Referer、Host,否则极易被风控拦截
  4. 每一步都要做格式校验、JSON 异常校验、业务状态校验
  5. 统一出入参和错误码,适配前后端分离、多语言对接
posted @ 2026-05-22 15:12  钢锅  阅读(34)  评论(0)    收藏  举报