Python 获取重定向url

本文介绍了一段使用Python的requests库进行网络请求的实战代码,并增加了重试机制以应对网络不稳定的情况。代码中详细展示了如何设置HTTP头信息、处理异常以及在请求失败时自动重试。

实战代码 

import requests

if __name__ == '__main__':
    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)

以上代码未有重试机制,下面加上重试机制加以完善

def get_real_url(url,try_count = 1):
if try_count > 3:
    return url
try:
    rs = requests.get(url,headers=http_headers,timeout=10)
    if rs.status_code > 400:
        return get_real_url(url,try_count+1)
    return rs.url
except:
    return get_real_url(url, try_count + 1)

<think>我们参考了5个引用,这些引用主要讨论了Python中处理HTTP重定向的不同方法。用户的问题是:"我想了解Python实现网页重定向的方法"。根据引用,我们可以总结如下: 1. 引用[1]和[3]提到了使用Python内置的`http.server`模块进行简单的重定向。 2. 引用[3]还提到可以使用Web框架(如Flask或Django)来实现重定向。 3. 引用[4]和[5]讨论了在爬虫中处理重定向的问题,其中引用[5]详细说明了使用`requests`库时如何处理重定向(自动处理以及通过响应对象的属性判断)。 因此,我们可以将Python实现网页重定向的方法分为两类: - 服务器端重定向:即作为Web服务器的一部分,主动将客户端的请求重定向到另一个URL。这可以通过简单的HTTP服务器模块(如`http.server`)或者Web框架(如Flask、Django)来实现。 - 客户端重定向(主要是爬虫场景):在客户端(如爬虫)处理服务器返回的重定向响应。这里通常使用`requests`库,它可以自动处理重定向,同时也提供了手动处理的机制。 下面我们详细说明这两类方法。 ### 服务器端重定向的实现 #### 1. 使用`http.server`模块 Python内置的`http.server`模块可以用于创建简单的HTTP服务器。我们可以自定义请求处理程序来实现重定向。 示例代码: ```python from http.server import HTTPServer, BaseHTTPRequestHandler class RedirectHandler(BaseHTTPRequestHandler): def do_GET(self): # 将所有的请求重定向到新的URL self.send_response(302) # 302状态码表示临时重定向 self.send_header('Location', 'http://www.example.com/new-url') self.end_headers() # 启动服务器 server_address = ('', 8000) httpd = HTTPServer(server_address, RedirectHandler) httpd.serve_forever() ``` 在这个例子中,所有访问该服务器的请求都会被重定向到`http://www.example.com/new-url`。 #### 2. 使用Flask框架 Flask是一个轻量级的Web框架,它提供了重定向函数`redirect()`。 示例代码: ```python from flask import Flask, redirect app = Flask(__name__) @app.route('/old') def old_page(): return redirect('/new', code=302) # 重定向到/new @app.route('/new') def new_page(): return 'This is the new page!' if __name__ == '__main__': app.run() ``` 访问`/old`时,会自动重定向到`/new`。 #### 3. 使用Django框架 Django中可以使用`redirect()`函数或者`HttpResponseRedirect`类实现重定向。 示例代码: ```python from django.http import HttpResponseRedirect from django.urls import reverse def old_page(request): # 使用HttpResponseRedirect重定向 return HttpResponseRedirect(reverse('new_page')) # 假设'new_page'是新的URL的名称 def new_page(request): return HttpResponse('This is the new page!') ``` ### 客户端处理重定向(爬虫场景) #### 使用`requests`库 在爬虫中,我们经常需要处理重定向。`requests`库默认会自动处理重定向(对于GET和HEAD请求)。如果需要控制重定向行为,可以使用`allow_redirects`参数。 示例1:自动重定向(默认) ```python import requests response = requests.get('http://example.com/old-url') # 如果发生重定向,最终响应的url重定向后的url print(response.url) # 输出重定向后的URL print(response.history) # 重定向历史,是一个响应列表 ``` 示例2:禁止重定向 ```python import requests response = requests.get('http://example.com/old-url', allow_redirects=False) print(response.status_code) # 302, 301等重定向状态码 print(response.headers['Location']) # 重定向的目标URL ``` 示例3:手动处理重定向 如果需要更复杂的处理,可以禁用自动重定向,然后根据响应头中的Location字段手动请求新的URL。 ```python import requests session = requests.Session() # 使用会话以保持Cookie等信息 response = session.get('http://example.com/old-url', allow_redirects=False) if response.status_code in (301, 302, 303, 307): redirect_url = response.headers['Location'] # 确保重定向URL是绝对URL,可能需要拼接 new_response = session.get(redirect_url) # 使用new_response进行处理 ``` ### 总结 Python实现网页重定向的方法主要有: 1. **服务器端重定向**: - 使用内置`http.server`模块自定义处理程序。 - 使用Web框架(如Flask、Django)提供的重定向功能。 2. **客户端处理重定向**(爬虫场景): - 使用`requests`库,默认自动处理重定向。 - 通过设置`allow_redirects=False`禁用自动重定向,手动处理重定向逻辑。 在实际应用中,服务器端重定向是主动设置的重定向规则,而客户端处理重定向则是作为客户端(如浏览器或爬虫)对服务器返回的重定向响应进行处理。 §§相关问题§§ 1. 在Flask中如何实现永久重定向(301)? 2. 使用`requests`库时,如何获取重定向的历史记录? 3. 在Django框架中,重定向有哪些不同的方法? </think>### Python实现网页重定向的方法 在Python中,实现网页重定向主要有两类场景:**服务器端重定向**(作为服务提供方)和**客户端重定向处理**(如爬虫场景)。以下是核心实现方法: --- #### 一、服务器端重定向(Web开发场景) 1. **使用内置`http.server`模块** 创建自定义请求处理器,通过设置HTTP状态码和`Location`头部实现重定向: ```python from http.server import HTTPServer, BaseHTTPRequestHandler class RedirectHandler(BaseHTTPRequestHandler): def do_GET(self): self.send_response(302) # 302: 临时重定向 self.send_header('Location', 'https://new-url.com') # 目标URL self.end_headers() server = HTTPServer(('localhost', 8000), RedirectHandler) server.serve_forever() ``` 2. **通过Web框架实现** - **Flask框架**(使用`redirect()`函数): ```python from flask import Flask, redirect app = Flask(__name__) @app.route('/old-page') def old_page(): return redirect('https://new-url.com', code=302) # 可指定301/302 ``` - **Django框架**(使用`HttpResponseRedirect`): ```python from django.http import HttpResponseRedirect def old_page(request): return HttpResponseRedirect('/new-page/', status=301) # 永久重定向 ``` --- #### 二、客户端重定向处理(爬虫场景) 1. **自动处理重定向(默认行为)** 使用`requests`库时,默认自动跟随重定向: ```python import requests response = requests.get('http://old-url.com') print(response.url) # 打印最终URL重定向后) print(response.status_code) # 最终状态码(如200) ``` 2. **手动控制重定向** 禁用自动重定向并自行处理: ```python response = requests.get('http://old-url.com', allow_redirects=False) if response.status_code in (301, 302, 303): new_url = response.headers['Location'] print(f"重定向到: {new_url}") # 手动发起新请求 new_response = requests.get(new_url) ``` 3. **HTML元标签重定向处理** 处理`<meta http-equiv="refresh">`类型的重定向: ```python from bs4 import BeautifulSoup import requests html = requests.get('http://old-url.com').text soup = BeautifulSoup(html, 'html.parser') meta = soup.find('meta', attrs={'http-equiv': 'refresh'}) if meta: content = meta['content'] wait, new_url = content.split(';')[0], content.split('=')[1] response = requests.get(new_url.strip()) ``` --- #### 关键区别总结 | 场景 | 技术方案 | 典型状态码 | |--------------------|----------------------------|-------------| | **服务器端重定向** | `http.server`/Flask/Django | 301, 302 | | **客户端自动处理** | `requests`(默认) | 200(最终) | | **客户端手动处理** | 解析`Location`头部 | 301, 302 | | **HTML元重定向** | BeautifulSoup解析 | 无状态码 | > 注:服务器端重定向由**服务端主动触发**,客户端重定向是**对服务器响应的被动处理** [^1][^2][^3][^5]。 --- ### 相关问题 1. 如何用Python检测网页是否包含重定向? 2. 在Flask/Django中如何实现条件重定向(如用户登录检测)? 3. 处理HTTPS重定向时有哪些安全注意事项? 4. 如何模拟浏览器行为处理JavaScript重定向? [^1]: Python实现HTTP重定向处理 [^2]: Python中处理HTTP重定向 [^3]: 在Python中HTTP重定向 [^4]: python爬虫解决网页重定向问题 [^5]: python爬取重定向的网页
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨痕诉清风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值