在法国用 La Poste 的 Colissimo 批量查件,别一上来就硬爬

上个月帮朋友的小仓库对账,有 200 多个 Colissimo 单号要核对签收状态。一开始想直接写个 Python 脚本循环请求官网查询页,结果跑了十几单就返回 429,后面直接 403。换 IP 也没用,Colissimo 的查询接口对未登录请求有频率限制,而且返回的是 HTML 片段,解析起来全是坑。

后来改成用他们提供的开放接口(需注册开发者账号),流程简单很多。先拿 API key 换 token,再批量提交单号,每次最多 50 个,间隔 2 秒。核心代码片段如下:

import requests, time

API_KEY = "your_key"
AUTH_URL = "https://api.laposte.fr/oauth2/token"
TRACK_URL = "https://api.laposte.fr/suivi/v2/idships"

token = requests.post(AUTH_URL, data={
    "grant_type": "client_credentials"
}, headers={
    "Authorization": f"Basic {API_KEY}"
}).json()["access_token"]

headers = {"X-Okapi-Key": API_KEY, "Authorization": f"Bearer {token}"}
ids = ["6A12345678901", "6A12345678902"]  # 你的单号列表

for i in range(0, len(ids), 50):
    batch = ids[i:i+50]
    resp = requests.get(TRACK_URL, params={"idships": ",".join(batch)}, headers=headers)
    if resp.status_code == 200:
        for item in resp.json():
            print(item["idShip"], item["status"]["label"])
    time.sleep(2)

这样做的好处是稳定,返回 JSON 直接解析,不用再处理网页里的动态加载。代价是得先注册开发者账号,审核大概一两天,而且免费额度每月 5000 次调用,小批量够用。另外,接口只返回最近 30 天的轨迹,超过的得走历史查询(需要额外申请权限)。

要留意的是,Colissimo 的 API 对单号格式校验很严,比如常见的 6A 开头 13 位,少一位直接 400。还有,如果单号还没被系统扫描,返回的 status 可能是 “UNKNOWN”,别当成错误重试,等几个小时再查就行。我自己踩过的坑:一开始没加 sleep,连续请求 200 个单号,token 被临时吊销,得重新申请。

最后留个问题:你们批量查件时,有没有遇到过单号状态一直卡在 “IN_TRANSIT” 不更新的情况?我这边有一单卡了 5 天,最后是收件人自己去网点问才解决的,不确定是不是普遍现象。

0
赞同度 100% · 0 条评论 · 7 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。