URL去短链时添加自定义请求头导致无法正常解析的问题
短链还原失效问题排查方案
核心原因分析
添加自定义User-Agent后短链无法正常跳转,本质是目标短链服务的反爬机制对请求的UA特征或请求头完整性做了校验,拒绝了不符合要求的请求。
具体排查方向与解决办法
UA格式/内容触发拦截
部分短链平台会拉黑老旧UA(如你使用的MSIE 9.0),或对fake_useragent生成的批量UA做了标记。
解决:复用requests默认UA(不带自定义头时的UA),或使用当前主流浏览器的UA。先打印默认UA:print(requests.session().headers['User-Agent'])然后将该值替换到自定义headers中,而非使用老旧或随机生成的UA。
请求头缺失必要字段
仅设置UA和Accept-Language会导致请求头不完整,被判定为异常请求。正常浏览器请求会携带Accept、Connection等字段。
解决:在默认headers基础上修改UA,而非覆盖整个headers:session = requests.session() # 保留默认headers,仅替换UA session.headers.update({ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Accept-Language': 'en-US, en;q=0.5' })代理与UA组合触发反爬
免费代理本身可能已被短链服务标记,加上自定义UA后,双重异常特征被拦截;而默认UA可能被视为低风险请求通过。
解决:更换代理IP测试,或给不同代理搭配不同主流UA循环使用。同时,部分代理不支持HEAD请求,可改用GET并开启stream=True:def unshorten_url(url): try: r = session.get(url, allow_redirects=True, timeout=10, stream=True) return r.url except Exception as e: return 'Error'Cookie缺失导致跳转失败
不带UA时,服务可能返回了必要Cookie,自定义UA后初始请求未获取Cookie,无法触发跳转。
解决:先发送无跳转请求获取Cookie,再发起跳转请求:def unshorten_url(url): try: # 先获取Cookie,禁止跳转 session.get(url, allow_redirects=False, timeout=10) # 再发起带跳转的请求 r = session.head(url, allow_redirects=True, timeout=10) return r.url except Exception as e: return 'Error'
内容的提问来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

