一、Python requests模块
requests
是一个用 Python 语言编写的,用于发送 HTTP 请求的库。它使得发送 HTTP 请求变得简单,无需手动添加查询字符串到你的 URL 中,或者手动处理表单的编码。requests
会自动为你处理这些事情。
以下是一些使用 requests
发送 HTTP 请求的基本示例:
1. 安装 requests
首先,你需要安装 requests
库。如果你还没有安装,可以使用 pip
来安装:
pip install requests
2. 发送 GET 请求
import requests
response = requests.get('https://api.example.com/data')
print(response.text)
3. 发送 POST 请求
import requests
data = {
'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://api.example.com/data', data=data)
print(response.text)
4. 设置请求头
在 Python 的 requests
库中,你可以通过传递一个字典给 headers
参数来自定义请求头。这个字典应该包含你想要设置的 HTTP 头部的名称和值。下面是一个如何自定义请求头的示例:
import requests
headers = {
'User-Agent': 'my-app/0.0.1',
'Accept': 'application/json',
'Authorization': 'Bearer your-token-here',
'Custom-Header': 'CustomValue'
}
response = requests.get('http://example.org', headers=headers)
print(response.text)
在这个例子中,我们创建了一个名为 headers
的字典,其中包含四个自定义的 HTTP 头部:
User-Agent
: 用来标识发送请求的客户端应用程序。Accept
: 告诉服务器客户端希望接收的响应内容的类型。Authorization
: 用于身份验证,这里是一个常见的使用 Bearer token 的例子。Custom-Header
: 一个自定义的头部,你可以根据需要添加任意数量和类型的自定义头部。
然后,我们将这个 headers
字典作为参数传递给 requests.get()
方法的 headers
参数。这样,requests
就会使用这些自定义的头部来发送 HTTP 请求。
同样的方法也适用于 requests.post()
, requests.put()
, requests.delete()
等其他 HTTP 方法。
如果你需要频繁地发送带有相同头部的请求,可以考虑使用 requests.Session
对象来创建一个会话,并在会话级别设置头部:
import requests
s = requests.Session()
headers = {
'User-Agent': 'my-app/0.0.1',
'Accept': 'application/json',
'Authorization': 'Bearer your-token-here'
}
s.headers.update(headers)
response = s.get('http://example.org')
print(response.text)
在这个例子中,我们创建了一个 requests.Session
对象,并使用 s.headers.update(headers)
方法来更新会话的默认头部。这样,在该会话中发送的所有请求都会自动包含这些头部。
5. 处理 JSON 数据
import requests
response = requests.get('https://api.example.com/data')
data = response.json() # 自动将 JSON 响应内容解析为 Python 对象
print(data)
6. 错误处理
import requests
from requests.exceptions import RequestException
try:
response = requests.get('https://api.example.com/data', timeout=1)
print(response.text)
except RequestException as e:
print(f"An error occurred: {e}")
在 Python 的 requests
库中,可以通过多种方式设置代理、添加 cookies 和进行 SSL 证书验证。下面是如何执行这些操作的示例:
7. 设置代理
要设置代理,你可以使用 proxies
参数。这个参数接收一个字典,其中包含协议类型(如 'http' 或 'https')和代理服务器的 URL。
import requests
proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'http://10.10.1.10:1080',
}
response = requests.get('http://example.org', proxies=proxies)
如果你需要为所有请求设置代理,可以在 requests
会话(Session
)中设置:
import requests
proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'http://10.10.1.10:1080',
}
s = requests.Session()
s.proxies = proxies
response = s.get('http://example.org')
8. 添加 Cookies
要向请求中添加 cookies,你可以使用 cookies
参数。这个参数接收一个字典,其中包含要设置的 cookie 名称和值。
import requests
cookies = {
'cookie_name': 'cookie_value',
}
response = requests.get('http://example.org', cookies=cookies)
同样,你也可以在 requests
会话中设置 cookies:
import requests
cookies = {
'cookie_name': 'cookie_value',
}
s = requests.Session()
s.cookies.update(cookies)
response = s.get('http://example.org')
9. SSL 证书验证
默认情况下,requests
会对 SSL 证书进行验证。如果你需要禁用 SSL 证书验证(例如,在测试环境中),你可以将 verify
参数设置为 False
。
import requests
response = requests.get('https://example.org', verify=False)
如果你有一个自定义的 CA 证书束,你可以将证书路径传递给 verify
参数。
import requests
response = requests.get('https://example.org', verify='/path/to/certfile')
请注意,禁用 SSL 证书验证会降低安全性,因为它允许你连接到不受信任的服务器。在生产环境中,你应该总是启用 SSL 证书验证。
在 Python 的 requests
库中,你可以通过不同的参数和方法来设置超时、流式传输响应内容以及进行身份验证。以下是一些示例和说明:
10. 设置超时
如果你不希望你的 HTTP 请求花费太多时间,你可以设置超时。requests
允许你通过 timeout
参数来指定一个超时时间(以秒为单位)。
import requests
try:
response = requests.get('http://example.org', timeout=5) # 设置超时为 5 秒
print(response.text)
except requests.Timeout:
print("请求超时")
在这个例子中,如果请求没有在 5 秒内完成,requests
将引发一个 requests.Timeout
异常。
11. 流式传输响应内容
默认情况下,requests
会一次性下载整个响应内容。对于大文件或流式数据,你可能希望边下载边处理数据,而不是等待整个文件下载完成。你可以通过设置 stream
参数为 True
来实现这一点。
import requests
response = requests.get('http://example.org/large-file', stream=True)
with open('large-file', 'wb') as fd:
for chunk in response.iter_content(chunk_size=1024): # 每次读取 1024 字节
if chunk: # 过滤掉空字节块
fd.write(chunk)
在这个例子中,response.iter_content()
方法用于分块读取响应内容,chunk_size
参数定义了每个块的大小。
12. 身份验证
requests
支持基本身份验证(Basic Authentication),你可以通过 auth
参数来提供用户名和密码。
import requests
from requests.auth import HTTPBasicAuth
response = requests.get('http://example.org/protected-resource', auth=HTTPBasicAuth('username', 'password'))
print(response.text)
在这个例子中,HTTPBasicAuth
用于创建一个包含用户名和密码的身份验证对象,该对象被传递给 auth
参数。
此外,requests
还支持其他类型的身份验证,如摘要式身份验证(Digest Authentication)和 OAuth。对于更复杂的身份验证需求,你可能需要使用第三方库,如 requests-oauthlib
。
二、requests属性/方法
属性/方法 | 说明 |
---|---|
apparent_encoding |编码方式
close() |关闭与服务器的连接
content |返回响应的内容,以字节为单位
cookies |返回一个 CookieJar 对象,包含了从服务器发回的 cookie
elapsed |返回一个 timedelta 对象,包含了从发送请求到响应到达之间经过的时间量,可以用于测试响应速度。比如 r.elapsed.microseconds 表示响应到达需要多少微秒。
encoding| 解码 r.text 的编码方式
headers |返回响应头,字典格式
history |返回包含请求历史的响应对象列表(url)
is_permanent_redirect| 如果响应是永久重定向的 url,则返回 True,否则返回 False
is_redirect |如果响应被重定向,则返回 True,否则返回 False
iter_content()| 迭代响应
iter_lines() |迭代响应的行
json() |返回结果的 JSON 对象 (结果需要以 JSON 格式编写的,否则会引发错误)
links |返回响应的解析头链接
next |返回重定向链中下一个请求的 PreparedRequest 对象
ok |检查 "status_code" 的值,如果小于400,则返回 True,如果不小于 400,则返回 False
raise_for_status() |如果发生错误,方法返回一个 HTTPError 对象
reason |响应状态的描述,比如 "Not Found" 或 "OK"
request |返回请求此响应的请求对象
status_code |返回 http 的状态码,比如 404 和 200(200 是 OK,404 是 Not Found)
text |返回响应的内容,unicode 类型数据
url |返回响应的 URL
三、requests方法
方法 | 描述 |
---|---|
delete(url, args) |发送 DELETE 请求到指定 url
get(url, params, args) |发送 GET 请求到指定 url
head(url, args) |发送 HEAD 请求到指定 url
patch(url, data, args) |发送 PATCH 请求到指定 url
post(url, data, json, args)| 发送 POST 请求到指定 url
put(url, data, args) |发送 PUT 请求到指定 url
request(method, url, args) |向指定的 url 发送指定的请求方法