🌈个人主页:https://blog.csdn.net/2401_86688088?type=blog
🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html
前言
requests
是一个用于发送 HTTP 请求的 Python 库,设计简单且功能强大,能够轻松实现与 Web 服务器的交互。相比于 Python 内置的 urllib
模块,requests
更加简洁且易于使用,允许开发者快速构建 HTTP 请求,处理响应数据,并支持复杂的功能,如会话处理、文件上传、参数传递等。
一、主要功能和特点
requests
库的主要特点包括:
-
易于使用:通过简单的 API 来实现常见的 HTTP 操作,如
GET
、POST
、PUT
、DELETE
等。 -
自动处理编码和解码:自动检测和解码响应的字符编码。
-
支持会话:可以在多次请求中保持会话状态,如处理 cookies。
-
简单的 JSON 处理:轻松解析和生成 JSON 数据。
-
文件上传与下载:支持文件流的上传与下载操作。
-
支持 SSL、代理和超时:方便配置 SSL 证书、代理服务器,以及设置请求的超时时间。
二、安装requests库
安装 requests
库非常简单,可以通过 pip
来安装。
(一)使用 pip 安装
打开命令行或终端,输入以下命令即可安装 requests
:
pip install requests
(二)检查安装是否成功
安装完成后,可以在 Python 环境中导入 requests
模块,检查是否成功安装:
import requests
print(requests.__version__) # 输出 requests 的版本号
如果没有报错且成功输出版本号,说明 requests
库已成功安装并可以使用。
(三)版本管理
在安装时,如果想指定安装某个版本,可以通过以下命令:
pip install requests==2.25.1 # 安装特定版本
如果想更新到最新版本,可以使用以下命令:
pip install --upgrade requests
三、发起网络请求
在 Python 中使用 requests
模块可以轻松发送网络请求,并通过丰富的属性来处理请求和响应。
(一)发送 GET 请求
GET
请求用于从服务器获取数据,是最常见的 HTTP 请求方法。使用 requests.get()
发送请求非常简单:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.text) # 输出响应内容
(二)发送 POST 请求
POST
请求用于向服务器提交数据,如表单或 JSON 数据。你可以通过 requests.post()
发送 POST 请求:
import requests
url = 'https://jsonplaceholder.typicode.com/posts'
data = {'title': 'foo', 'body': 'bar', 'userId': 1}
response = requests.post(url, json=data)
print(response.json()) # 输出 JSON 格式的响应内容
(三)发送带参数的 GET 请求
在 URL 中添加查询参数时,可以通过 params
参数传递:
params = {'userId': 1}
response = requests.get('https://jsonplaceholder.typicode.com/posts', params=params)
print(response.url) # 输出构造好的请求URL
(四)发送带请求头的请求
如果需要定制请求头(如模拟浏览器请求),可以通过 headers
参数来设置:
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get('https://jsonplaceholder.typicode.com/posts/1', headers=headers)
print(response.text)
四、requests库常用属性
requests
的响应对象包含了许多有用的属性,帮助开发者处理和分析 HTTP 响应。
(一)response.status_code
该属性返回 HTTP 状态码,表示请求的结果。例如,200
表示请求成功,404
表示页面未找到。
print(response.status_code) # 输出状态码,如200
(二)response.text
返回服务器响应的文本内容。通常用于处理 HTML、纯文本格式的响应。
print(response.text) # 输出响应的文本内容
(三)response.json()
如果服务器响应的数据是 JSON 格式,response.json()
可以将其解析为 Python 字典或列表。
print(response.json()) # 解析并输出 JSON 数据
(四)response.content
返回响应的二进制数据。适合用于下载图片、视频等非文本数据。
response = requests.get('https://example.com/image.png')
with open('image.png', 'wb') as f:
f.write(response.content) # 下载并保存图片
(五)response.headers
返回响应的头部信息,类型为字典,可以用来获取服务器返回的元数据。
print(response.headers) # 输出响应头
(六)response.url
返回发送请求时的完整 URL,适合用于调试请求路径是否正确。
print(response.url) # 输出请求的 URL
(七)response.cookies
返回服务器在响应中设置的 cookies。通常用于会话管理或模拟浏览器行为。
print(response.cookies) # 输出响应中的 cookies
(八)response.history
如果请求被重定向(如 301、302),response.history
会保存重定向前的响应信息,类型为列表。
print(response.history) # 如果有重定向,会输出重定向的历史
(九)response.encoding
用于获取或设置响应的编码方式。如果响应的文本编码不正确,可以手动设置:
response.encoding = 'utf-8'
print(response.text)
五、text与content方法的区别
requests
库中的 text
和 content
方法都是用于获取 HTTP 响应内容的属性,但它们之间存在一些关键区别。了解这些差异可以帮助你根据不同的需求选择合适的方式来处理响应内容。
(一)response.text
-
返回值:
text
属性返回的是一个 字符串(str) 类型,它会根据响应内容的编码自动解码为文本。 -
编码处理:
requests
库会根据Content-Type
头中的字符集(如utf-8
、ISO-8859-1
等)自动进行编码解析。如果服务器未明确指定编码,requests
会尝试根据响应内容进行推断,但这可能不总是准确。 -
适用场景:
text
属性适用于处理已经是文本数据的内容,例如 HTML、JSON、XML 或纯文本。
示例:
import requests
response = requests.get('https://example.com')
print(response.text) # 返回的内容是经过解码的字符串
如果编码推断不正确,你可以手动设置编码:
response.encoding = 'utf-8'
print(response.text)
(二)response.content
-
返回值:
content
属性返回的是 原始的二进制数据(bytes),它不会对数据进行解码。无论响应的编码是什么,content
都会以字节流的方式原样返回。 -
适用场景:
content
适合用于处理 非文本数据,如图片、视频、音频、PDF 文件等,或需要以二进制方式处理的内容。它确保你能获取到响应的原始数据而不被编码影响。
示例:
import requests
response = requests.get('https://example.com/image.jpg')
with open('image.jpg', 'wb') as f:
f.write(response.content) # 将二进制数据写入文件
(三)区别总结
-
text
返回的是经过解码的字符串,它依赖于响应的编码,因此适用于需要处理文本内容的场景(如 HTML、JSON、XML)。 -
content
返回的是原始的二进制数据,不会自动进行编码转换,适合处理二进制文件或需要保存原始响应内容的场景。
举例:
假设我们有一个请求,它返回的是一个带有 utf-8
编码的 HTML 页面:
import requests
response = requests.get('https://example.com')
# 通过 .text 获取解码后的文本
print(response.text) # 这是一个已解码的字符串
# 通过 .content 获取原始的字节数据
print(response.content) # 这是一个字节流
使用 text
时,返回的内容是解码后的文本字符串,而 content
返回的则是页面的原始字节数据。如果你打算处理图像、音频或其他二进制数据,应使用 content
;而如果你处理的是网页文本或 JSON 数据,应使用 text
。