如何让requests的get方法跟随所有重定向?disq.us短链接解析失败求助
解决disq.us短链接无法用requests解析的问题
嘿,我之前也碰到过一模一样的问题!disq.us这类短链接服务的跳转逻辑和bit.ly不一样,requests默认配置搞不定它,主要是这两个原因:
- User-Agent检测:disq.us会验证请求的UA标识,requests默认的
python-requests/x.y.z很容易被识别为非浏览器请求,直接返回原链接不触发重定向。 - JavaScript动态跳转:有些disq.us链接不是靠HTTP 3xx状态码跳转,而是页面加载后用JS脚本完成跳转——requests本身不执行JavaScript,自然抓不到最终地址。
下面给你两个可行的解决方案:
方案1:模拟浏览器UA发送请求
先试试最简单的,给请求加个浏览器的UA头,大部分情况下就能解决问题:
import requests def get_final_short_url(short_url): # 模拟Chrome浏览器的UA headers = { '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' } # 允许自动跟随重定向 response = requests.get(short_url, headers=headers, allow_redirects=True, timeout=10) return response.url # 测试disq.us链接(替换成你的目标短链接) print(get_final_short_url('https://disq.us/xxxxxx'))
方案2:用支持JS渲染的工具模拟真实浏览器
如果加UA还不行,那肯定是需要执行JS才能跳转了。这时候可以用Playwright这类自动化工具,完全模拟浏览器行为:
from playwright.sync_api import sync_playwright def get_final_url_with_js(short_url): with sync_playwright() as p: # 启动无头模式的Chrome(不显示浏览器窗口) browser = p.chromium.launch(headless=True) page = browser.new_page( 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' ) # 等待网络空闲,确保跳转完全完成 page.goto(short_url, wait_until='networkidle') final_url = page.url browser.close() return final_url # 测试 print(get_final_url_with_js('https://disq.us/xxxxxx'))
⚠️ 注意:使用Playwright需要先安装依赖:
pip install playwright playwright install
批量处理小提示
- 可以把两个方案结合:先用方案1尝试解析,若返回的URL和原短链接一致,再用方案2处理,既能保证效率又能覆盖所有情况。
- 批量请求时记得控制频率,比如加个
time.sleep(1),避免被disq.us封禁IP。
内容的提问来源于stack exchange,提问作者bjarkemoensted
相关产品推荐
相关产品推荐

