【python】requests库发起HTTP请求
requests是Python中一个非常流行的用于发送HTTP请求的第三方库。它提供了简洁的API,使得发送各种HTTP请求(如GET、POST、PUT、DELETE等)变得非常容易。
以下是一些基本的用法示例:
安装
首先,你需要安装requests库。如果你还没有安装,可以使用pip进行安装:
> pip install requests
发送GET请求
import requests
# mock data url: https://jsonplaceholder.typicode.com/
resp = requests.get("http://jsonplaceholder.typicode.com/posts/3")
if resp.status_code == 200:
# 获取响应内容(JSON格式)
data = resp.json()
print(data)
else:
print(f"请求失败,状态码:{resp.status_code}")
发送GET请求带参数
import requests
# mock data url: https://jsonplaceholder.typicode.com/
param = {
"userId": 2
}
resp = requests.get("http://jsonplaceholder.typicode.com/posts", params=param)
if resp.status_code == 200:
# 获取响应内容(JSON格式)
data = resp.json()
print(data)
else:
print(f"请求失败,状态码:{resp.status_code}")
发送POST请求
import requests
data = {
"userId": 11,
"title": "requests post demo",
"body": "requests post body"
}
resp = requests.post("http://jsonplaceholder.typicode.com/posts", data=data)
if resp.status_code == 200 or resp.status_code == 201:
# 获取响应内容(JSON格式)
data = resp.json()
print(data)
else:
print(f"请求失败,状态码:{resp.status_code}")
设置请求头
import requests
import json
# mock data url: https://jsonplaceholder.typicode.com/
data = {
"userId": 11,
"title": "requests post demo",
"body": "requests post body"
}
header = {
'Content-Type': 'application/json_demo'
}
resp = requests.post("http://jsonplaceholder.typicode.com/posts", data=json.dumps(data), headers=header)
if resp.status_code == 200 or resp.status_code == 201:
# 获取响应内容(JSON格式)
data = resp.json()
print(data)
else:
print(f"请求失败,状态码:{resp.status_code}")
设置Cookie和获取Cookie
import requests
# mock data url: https://jsonplaceholder.typicode.com/
cookies = {
'session_id': '12345',
'user_token': 'abcdef'
}
# 发送请求,并带上 cookies
resp = requests.get("http://jsonplaceholder.typicode.com/posts/1", cookies=cookies)
# 从响应中获取 cookies
cookies = resp.cookies.get_dict()
print(cookies)
使用Session管理Cookies
当你需要跨多个请求保持cookies时,requests.Session对象特别有用。它允许你在会话期间自动存储和发送cookies。
import requests
# 创建一个会话对象
session = requests.Session()
# 发送第一个请求,服务器可能会设置一些 cookies
response = session.get('https://example.com/login')
# 发送第二个请求,这次请求会自动带上之前设置的 cookies
response = session.get('https://example.com/profile')
# 你可以检查响应中的 cookies
print(session.cookies.get_dict())
处理响应
response.status_code:HTTP状态码
response.text:响应内容的字符串形式
response.content:响应内容的二进制形式
response.json():将响应内容解析为JSON对象(前提是响应内容是JSON格式)
异常处理
在发送请求时,你可能会遇到各种异常,如网络问题、无效的URL等。
可以使用try-except块来捕获这些异常:
import requests
try:
response = requests.get('https://api.example.com/data')
response.raise_for_status() # 如果响应状态码不是 200,则引发 HTTPError 异常
data = response.json()
print(data)
except requests.exceptions.HTTPError as errh:
print(f"HTTP 错误:{errh}")
except requests.exceptions.ConnectionError as errc:
print(f"连接错误:{errc}")
except requests.exceptions.Timeout as errt:
print(f"请求超时:{errt}")
except requests.exceptions.RequestException as err:
print(f"请求错误:{err}")
打印完整的请求和响应报文包含头
import http
import logging
import requests
# 配置logging
logging.basicConfig(level=logging.DEBUG)
logging.getLogger('requests').setLevel(logging.DEBUG)
http.client.HTTPConnection.debuglevel = 1
# mock data url: https://jsonplaceholder.typicode.com/
resp = requests.get("http://jsonplaceholder.typicode.com/posts/3")
if resp.status_code == 200:
# 获取响应内容(JSON格式)
data = resp.json()
print(data)
else:
print(f"请求失败,状态码:{resp.status_code}")