Python requests模块详解:快速上手指南(二十九)
目录
Python快速上手(二十九)-Python requests 模块详解
Python3 requests模块详解
Python的requests模块是一个用于发送HTTP请求的流行库,它比内置的urllib库更易用且功能强大。requests模块提供了简单的API,可以处理复杂的HTTP请求,处理Cookie、会话、重定向等功能。本文将详细讲解requests模块的基本用法、发送请求、处理响应、会话管理、异常处理和实际应用案例。
1. requests模块简介
requests模块是一个用于发送HTTP请求的第三方库,支持HTTP/1.1,并且具有良好的支持和文档。要使用requests模块,首先需要安装它:
pip install requests
2. 基本用法
2.1 发送GET请求
发送GET请求是requests模块中最基本的操作,可以使用requests.get方法:
import requests
response = requests.get('https://api.github.com')
print(response.status_code) # 输出状态码
print(response.text) # 输出响应内容
2.2 发送POST请求
发送POST请求可以使用requests.post方法,并传递数据:
import requests
data = {'key': 'value'}
response = requests.post('https://httpbin.org/post', data=data)
print(response.status_code)
print(response.json()) # 输出JSON响应内容
3. 处理请求参数
3.1 URL参数
可以使用params参数来传递URL参数:
import requests
params = {'q': 'python', 'sort': 'stars'}
response = requests.get('https://api.github.com/search/repositories', params=params)
print(response.url) # 查看完整的请求URL
print(response.json())
3.2 表单数据
可以使用data参数来传递表单数据:
import requests
data = {'username': 'user', 'password': 'pass'}
response = requests.post('https://httpbin.org/post', data=data)
print(response.json())
3.3 JSON数据
可以使用json参数来传递JSON数据:
import requests
json_data = {'key': 'value'}
response = requests.post('https://httpbin.org/post', json=json_data)
print(response.json())
4. 处理响应
4.1 响应状态码
可以使用status_code属性来获取响应的状态码:
import requests
response = requests.get('https://api.github.com')
print(response.status_code)
4.2 响应内容
可以使用text属性来获取响应的文本内容,使用json方法来获取JSON格式的响应内容:
import requests
response = requests.get('https://api.github.com')
print(response.text)
print(response.json())
4.3 响应头
可以使用headers属性来获取响应头:
import requests
response = requests.get('https://api.github.com')
print(response.headers)
5. 处理请求头
可以使用headers参数来设置请求头:
import requests
headers = {'User-Agent': 'my-app/0.0.1'}
response = requests.get('https://api.github.com', headers=headers)
print(response.status_code)
6. 会话管理
requests模块提供了会话对象,可以在多个请求之间保持某些参数:
6.1 创建会话
可以使用requests.Session创建会话对象:
import requests
session = requests.Session()
response = session.get('https://httpbin.org/cookies/set/sessioncookie/123456789')
print(response.text)
6.2 共享会话参数
会话对象可以共享Cookies、头信息等参数:
import requests
session = requests.Session()
session.headers.update({'User-Agent': 'my-app/0.0.1'})
response = session.get('https://httpbin.org/headers')
print(response.json())
7. 文件上传
可以使用files参数来上传文件:
import requests
files = {'file': open('report.txt', 'rb')}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
8. 文件下载
可以使用requests.get方法并将响应内容写入文件来下载文件:
import requests
url = 'https://httpbin.org/image/png'
response = requests.get(url)
with open('image.png', 'wb') as file:
file.write(response.content)
print('File downloaded successfully')
9. 超时设置
可以使用timeout参数来设置请求超时时间:
import requests
try:
response = requests.get('https://httpbin.org/delay/10', timeout=5)
except requests.exceptions.Timeout:
print('The request timed out')
10. 重定向与历史记录
requests会自动处理重定向,可以使用history属性查看重定向历史:
import requests
response = requests.get('http://github.com')
print(response.url)
print(response.history)
11. 异常处理
requests模块定义了一系列异常类,用于处理请求过程中可能发生的错误:
import requests
try:
response = requests.get('https://httpbin.org/status/404')
response.raise_for_status() # 如果响应状态码不是200,抛出HTTPError
except requests.exceptions.HTTPError as err:
print('HTTP error occurred:', err)
except requests.exceptions.ConnectionError as err:
print('Connection error occurred:', err)
except requests.exceptions.Timeout as err:
print('Timeout error occurred:', err)
except requests.exceptions.RequestException as err:
print('An error occurred:', err)
12. 认证
12.1 基本认证
可以使用auth参数进行基本认证:
import requests
from requests.auth import HTTPBasicAuth
response = requests.get('https://httpbin.org/basic-auth/user/pass', auth=HTTPBasicAuth('user', 'pass'))
print(response.json())
12.2 其他认证方式
requests模块还支持OAuth、JWT等其他认证方式,可以使用第三方库如requests-oauthlib来实现。
13. 高级用法
13.1 代理
可以使用proxies参数来设置代理:
import requests
proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'http://10.10.1.10:1080',
}
response = requests.get('https://httpbin.org/get', proxies=proxies)
print(response.json())
13.2 流式请求
可以使用stream参数来进行流式请求,适用于下载大文件:
import requests
url = 'https://httpbin.org/stream/20'
response = requests.get(url, stream=True)
for line in response.iter_lines():
if line:
print(line)
13.3 自定义适配器
可以自定义HTTP适配器来控制底层的HTTP连接行为:
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
class MyAdapter(HTTPAdapter):
def send(self, request, **kwargs):
print('Custom send method')
return super().send(request, **kwargs)
session = requests.Session()
session.mount('https://', MyAdapter())
response = session.get('https://httpbin.org/get')
print(response.status_code)
14. 实际应用案例
14.1 API调用
以下示例展示了如何使用requests模块调用GitHub API:
import requests
url = 'https://api.github.com/repos/psf/requests'
response = requests.get(url)
data = response.json()
print(f"Repository: {data['name']}")
print(f"Description: {data['description']}")
print(f"Stars: {data['stargazers_count']}")
print(f"Forks: {data['forks_count']}")
14.2 网页抓取
以下示例展示了如何使用requests模块抓取网页内容并使用BeautifulSoup进行解析:
import requests
from bs4 import BeautifulSoup
url = 'https://www.python.org'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
print('Page title:', soup.title.string)
14.3 自动化表单提交
以下示例展示了如何使用requests模块自动化提交表单:
import requests
url = 'https://httpbin.org/forms/post'
data = {'name': 'John', 'email': 'john@example.com'}
response = requests.post(url, data=data)
print(response.json())
作者:wu_xx_xx