Python requests库轻松发送HTTP请求的终极指南
作者:Python_trys
前言
在现代网络编程中,HTTP请求是与Web服务交互的基础。Python中的requests库以其简洁优雅的API设计,成为开发者发送HTTP请求的首选工具。本文将全面介绍requests库的使用方法,从基础请求到高级技巧,帮助你掌握网络数据交互的核心技能。
一、requests库简介
requests是一个基于Python开发的HTTP库,比Python标准库中的urllib更加简单易用。它具有以下特点:
人性化的API设计
支持连接保持和连接池
支持文件上传
自动内容解码
国际化域名和URL
自动实现持久连接
安装requests
pip install requests
二、发送基本HTTP请求
1.GET请求
GET是最常用的HTTP方法,用于从服务器获取资源。
import requests # 基本GET请求 response = requests.get('https://www.example.com') # 打印响应状态码 print(response.status_code) # 打印响应内容 print(response.text)
2.带参数的GET请求
# 通过params参数传递查询字符串 params = {'key1': 'value1', 'key2': 'value2'} response = requests.get('https://httpbin.org/get', params=params) # 实际请求的URL print(response.url) # 输出: https://httpbin.org/get?key1=value1&key2=value2
3.POST请求
POST通常用于向服务器提交数据。
# 基本POST请求 data = {'key': 'value'} response = requests.post('https://httpbin.org/post', data=data) # 查看服务器返回的数据 print(response.json())
三、请求与响应处理
1.响应内容解析
requests提供了多种方式访问响应内容:
response = requests.get('https://www.example.com') # 文本内容 print(response.text) # 二进制内容 print(response.content) # JSON响应(自动解析) print(response.json()) # 原始响应(用于流式传输) print(response.raw)
2.响应状态码
response = requests.get('https://www.example.com') # 状态码 print(response.status_code) # 状态码是否成功(200-400范围内) print(response.ok) # 抛出HTTP错误(如果请求失败) response.raise_for_status()
3.请求头与响应头
# 自定义请求头 headers = { 'User-Agent': 'Mozilla/5.0', 'Accept': 'application/json' } response = requests.get('https://www.example.com', headers=headers) # 查看响应头 print(response.headers) # 获取特定响应头 print(response.headers['Content-Type'])
四、高级请求技巧
超时设置
# 设置超时时间(秒) try: response = requests.get('https://www.example.com', timeout=3) except requests.exceptions.Timeout: print("请求超时")
会话对象(Session)
使用Session可以保持某些参数跨请求,并重用TCP连接,提高性能。
# 创建会话 session = requests.Session() # 设置公共参数 session.headers.update({'User-Agent': 'MyApp/1.0'}) # 使用会话发送请求 response1 = session.get('https://httpbin.org/cookies/set/sessioncookie/123456789') response2 = session.get('https://httpbin.org/cookies') print(response2.json()) # 会显示之前设置的cookie
代理设置
proxies = { 'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080', } response = requests.get('https://www.example.com', proxies=proxies)
文件上传
files = {'file': open('report.xls', 'rb')} response = requests.post('https://httpbin.org/post', files=files) print(response.text)
流式请求
对于大文件下载,可以使用流式请求:
response = requests.get('https://www.example.com/bigfile', stream=True) with open('bigfile', 'wb') as fd: for chunk in response.iter_content(chunk_size=128): fd.write(chunk)
五、错误处理
requests提供了完善的异常处理机制:
from requests.exceptions import RequestException try: response = requests.get('https://www.example.com', timeout=5) response.raise_for_status() # 检查请求是否成功 except RequestException as e: print(f"请求发生错误: {e}")
主要异常类型包括:
- ConnectionError:网络连接错误
- Timeout:请求超时
- TooManyRedirects:重定向过多
- HTTPError:HTTP错误响应
- RequestException:所有requests异常的基类
六、实际应用案例
调用REST API
# 获取GitHub用户信息 response = requests.get('https://api.github.com/users/octocat') if response.status_code == 200: user_data = response.json() print(f"用户名: {user_data['login']}") print(f"仓库数: {user_data['public_repos']}") else: print(f"请求失败,状态码: {response.status_code}")
网页内容抓取
from bs4 import BeautifulSoup response = requests.get('https://www.example.com') soup = BeautifulSoup(response.text, 'html.parser') # 提取所有链接 for link in soup.find_all('a'): print(link.get('href'))
下载文件
url = 'https://www.example.com/sample.pdf' response = requests.get(url) with open('sample.pdf', 'wb') as f: f.write(response.content)
七、性能优化建议
使用Session对象:对于需要发送多个请求到同一主机的场景,使用Session可以显著提高性能。
启用连接池:requests默认使用连接池,确保在创建Session时保持默认设置。
设置合理的超时:避免请求长时间挂起,影响程序性能。
流式处理大响应:对于大文件下载,使用stream=True可以避免内存问题。
合理设置请求头:特别是Accept-Encoding可以启用压缩传输。
八、常见问题解答
Q1: 如何处理HTTPS证书验证?
# 禁用证书验证(不推荐生产环境使用) response = requests.get('https://example.com', verify=False) # 使用自定义CA证书 response = requests.get('https://example.com', verify='/path/to/cert.pem')
Q2: 如何处理重定向?
# 禁用重定向 response = requests.get('http://example.com', allow_redirects=False) # 获取重定向历史 print(response.history)
Q3: 如何调试请求?
# 启用详细日志 import logging import http.client http.client.HTTPConnection.debuglevel = 1 logging.basicConfig() logging.getLogger().setLevel(logging.DEBUG) requests_log = logging.getLogger("requests.packages.urllib3") requests_log.setLevel(logging.DEBUG) requests_log.propagate = True
结语
requests库以其简洁的API和强大的功能,成为Python开发者处理HTTP请求的首选工具。通过本文的介绍,相信你已经掌握了从基础到高级的各种用法。在实际开发中,合理运用这些技巧可以大大提高开发效率和程序稳定性。
到此这篇关于Python requests库轻松发送HTTP请求的终极指南的文章就介绍到这了,更多相关Python requests发送HTTP请求内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!