无UPS API权限时如何用Python爬取UPS动态渲染的快递配送日期
UPS动态追踪页爬取实现指南
问题根因
- 普通
requests请求拿不到<app-root>内的内容,是因为UPS新追踪站是Angular开发的单页应用,初始返回的HTML仅包含空的根节点,所有追踪字段(包括目标配送日期)都是页面加载后由前端JS异步请求接口拉取、再渲染到页面上的,静态请求不会执行JS逻辑,自然获取不到动态内容。 - 用HTTP Trace扩展没抓到核心数据接口,是因为这类轻量扩展默认只抓首屏加载的静态资源、页面跳转请求,不会捕获JS运行后发起的XHR异步请求,导致漏过真正返回追踪数据的API。
落地实现路径
路径1:直接逆向核心数据接口(性能最优)
- 打开浏览器自带的开发者工具(不要依赖第三方HTTP Trace扩展),切换到「网络」面板,开启「XHR/Fetch」请求筛选,重新加载追踪页面,就能过滤掉所有第三方统计、静态资源请求,直接定位返回追踪数据的核心接口:
- 这类接口的域名一定属于UPS自有域,排除Facebook、ATDMT这类第三方统计域名的请求即可
- 接口返回为结构化JSON内容,包含预计配送日期、物流轨迹等字段,请求参数一般携带追踪号、地区语言标识、来源标识
- 定位到接口后,直接用
requests库复刻请求即可:- 必须带上从浏览器复制的完整请求头,尤其是Cookie、User-Agent、Referer字段,UPS会对缺失基础校验字段的请求做拦截
- 按接口要求补全所有必填参数,就能直接拿到结构化的配送日期数据,不需要渲染整个页面
路径2:无头浏览器渲染方案(接入成本最低)
如果不想逆向接口的校验逻辑,可以直接用无头浏览器解决动态渲染问题,不需要申请UPS官方API权限:
- 用
selenium或playwright库写自动化脚本,打开目标追踪页面 - 等待页面内
<app-root>节点渲染完成,定位到展示预计配送日期的DOM元素,直接提取文本内容即可 - 注意要把无头浏览器的User-Agent、窗口尺寸配置成和真实浏览器一致,避免触发反爬拦截
常见踩坑提示
- 不要照搬FedEx的爬取方案:FedEx老站点是服务端渲染,直接POST表单就能拿到全量数据;但UPS新站点是纯前端渲染,和FedEx的请求逻辑完全不通用
- 之前抓到的
WebTracking/trackPOST请求只是老站点的跳转入口,请求完成后只会302重定向到新的Angular追踪站,不会返回实际的追踪数据,不要把这个入口当成数据接口 - 所有发往第三方统计域名的请求都和物流数据无关,可以直接过滤,不要在这类请求上浪费时间
内容的提问来源于stack exchange,提问作者MarinaF
相关产品推荐
相关产品推荐

