python获取重定向url

在尝试通过QQ机器人使用CQ码发送抖音视频时遇到发送失败的问题。问题在于抖音视频链接在访问时会自动重定向。为了解决这个问题,采用Python的requests库获取重定向后的URL。通过设置http_headers模拟浏览器行为,尝试获取实际视频链接。代码中包含了尝试请求和打印响应URL的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

序言:
本次需求发生场景如下:
我想用QQ机器人通过CQ码的形式发送抖音视频,但是当我获得抖音视频链接并发送的时候一直发送失败。
我将抖音视屏放在浏览器观看发现在按下回车的一刹那url地址栏中的地址会自动重定向,故此我得到的视频链接只是外层。这边用python获取重定向后的路径

http_headers = {
                        'Accept': '*/*',
                        'Connection': 'keep-alive',
                        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36'
                    }
 
    try:
        resp = requests.get(url=item, headers=http_headers,timeout=10)
    except Exception as e:
        continue
    print("resp", resp.url)
<think>我们正在处理用户关于“如何获取重定向后的URL”的问题。用户希望知道在HTTP重定向后如何获取最终重定向URL。根据HTTP协议,重定向是通过3xx状态码(如301、302等)实现的。当客户端(如浏览器或HTTP客户端库)遇到重定向响应时,会自动跳转到Location头指定的URL。但是,有时我们需要在程序中获取重定向后的最终URL,而不只是自动跟随重定向。在编程中,我们可以通过设置HTTP客户端不自动跟随重定向,然后手动处理重定向响应,或者使用能够提供重定向链信息的客户端库来获取最终URL。以下是一些常见编程语言的示例:1.**Python(使用requests库)**:默认情况下,requests库会自动跟随重定向。我们可以通过设置`allow_redirects=False`来禁用自动重定向,然后检查响应的状态码和Location头。但是,如果我们想要自动跟随重定向并同时获取重定向链,我们可以使用`history`属性来追踪重定向过程。```pythonimportrequestsresponse=requests.get('http://example.com',allow_redirects=True)#最终URLprint(response.url)#重定向历史forrespinresponse.history:print(resp.status_code,resp.url)```2.**JavaScript(Node.js使用axios库)**:在axios中,我们可以通过设置`maxRedirects`来限制重定向次数,并获取最终响应。但是,axios默认会跟随重定向,且不提供重定向链的详细信息。我们可以通过拦截器或者使用`follow-redirects`包来获取重定向链。```javascriptconstaxios=require('axios');axios.get('http://example.com',{maxRedirects:5}).then(response=>{console.log('FinalURL:',response.request.res.responseUrl);//注意:这个属性可能不是标准属性,实际使用中可能需要查看具体实现}).catch(console.error);```更可靠的方式是使用`follow-redirects`包:```javascriptconsthttp=require('follow-redirects').http;http.get('http://example.com',function(response){console.log('FinalURL:',response.responseUrl);//最终URL});```3.**Java(使用HttpClient)**:Java的HttpClient默认会跟随重定向。我们可以通过`HttpClient.Redirect`策略设置,并获取重定向链。```javaimportjava.net.URI;importjava.net.http.HttpClient;importjava.net.http.HttpRequest;importjava.net.http.HttpResponse;publicclassRedirectExample{publicstaticvoidmain(String[]args)throwsException{HttpClientclient=HttpClient.newBuilder().followRedirects(HttpClient.Redirect.NORMAL)//正常重定向.build();HttpRequestrequest=HttpRequest.newBuilder().uri(URI.create("http://example.com")).build();HttpResponse<String>response=client.send(request,HttpResponse.BodyHandlers.ofString());//最终URLSystem.out.println("FinalURL:"+response.uri());}}```注意:`response.uri()`返回的是最终请求的URI。4.**命令行工具(如curl)**:使用curl时,可以添加`-L`跟随重定向,同时使用`-w`选项输出最终URL。```bashcurl-Ls-o/dev/null-w%{url_effective}http://example.com```以上是几种常见场景下获取重定向URL的方法。此外,用户可能会遇到需要处理多次重定向的情况,上述方法通常能够处理多次重定向链。根据用户提供的引用,其中提到了重定向的行为和配置(如引用[1]关于URL重定向的配置,引用[2]关于过期令牌的重定向行为,引用[3]关于GitLab的HTTPS重定向)。虽然这些引用并不是直接关于如何获取重定向URL的编程方法,但它们提醒我们重定向在Web开发中的常见性,以及正确处理重定向的重要性。因此,我们可以总结:获取重定向后的URL主要依赖于所使用的HTTP客户端库或工具,通过设置不自动跟随重定向并手动处理,或者利用库提供的重定向链信息功能来获取最终URL。下面,我们将生成相关问题。</think>### 如何获取 HTTP 重定向后的最终 URL 在 HTTP 请求中获取重定向后的最终 URL 有以下几种常用方法: #### 1. 命令行工具 **cURL**(自动跟随重定向): ```bash curl -Ls -o /dev/null -w "%{url_effective}" http://example.com ``` - `-L`:跟随重定向 - `-s`:静默模式 - `-o /dev/null`:丢弃响应体 - `-w "%{url_effective}"`:输出最终 URL **wget**: ```bash wget --max-redirect=10 -SqO- http://example.com 2>&1 | grep Location | tail -n1 ``` #### 2. Python(使用 requests 库) ```python import requests response = requests.get("http://example.com", allow_redirects=True) final_url = response.url # 获取最终URL print(f"Redirected to: {final_url}") # 查看重定向链 for resp in response.history: print(f"Redirected via {resp.status_code} to {resp.url}") ``` #### 3. JavaScript(浏览器环境) ```javascript fetch('http://example.com', { redirect: 'follow' }) .then(response => { console.log("Final URL:", response.url); }); ``` #### 4. Java(使用 HttpClient) ```java import java.net.http.*; HttpClient client = HttpClient.newBuilder() .followRedirects(HttpClient.Redirect.NORMAL) .build(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("http://example.com")) .build(); client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::uri) .thenAccept(redirectedUrl -> { System.out.println("Final URL: " + redirectedUrl); }); ``` ### 关键注意事项 1. **重定向类型**: - 永久重定向(301 Moved Permanently)会被浏览器缓存 - 临时重定向(302 Found)每次都会重新检查[^1] 2. **重定向限制**: - 浏览器通常限制 20 次重定向(防止循环) - 编程实现需设置最大重定向次数(如 Python 的 `max_redirects`) 3. **安全考虑**: - 验证最终 URL 的域名和协议(防止重定向攻击) - 使用 HTTPS 避免中间人篡改重定向 4. **特殊场景**: - 单页应用(SPA)路由可能使用客户端重定向(需前端处理) - 认证过期重定向需检查响应头(如 401 Unauthorized)[^2] ### 常见问题排查 - **循环重定向**:检查服务器配置中的重定向规则 - **丢失重定向**:确保客户端允许 cookie 和 JavaScript(某些重定向依赖这些技术) - **协议升级**:HTTP→HTTPS 重定向常见于安全配置[^3] > 示例:GitLab 的自动 HTTPS 重定向 > ```bash > $ curl -I http://gitlab.example.com > HTTP/1.1 301 Moved Permanently > Location: https://gitlab.example.com/ > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值