Requests(网络库)
一.认识Requests
Requests是Python生态中最流行、也是最基础的第三方HTTP客户端库。它的核心理念是"HTTP for Humans"(让HTTP服务于人类),相比Python内置的urllib库,Requests的API设计更加直观、简洁,能够极其高效地处理各种HTTP请求与响应。
导入 Requests 时,通常直接使用 import requests。
在使用Requests库发送请求时,所有的核心方法几乎都包含在 requests. 命名空间下。
二.Response响应对象
Requests的核心返回对象是Response,当你发起一个HTTP请求后,服务器返回的所有信息都会被封装在这个对象中。
- Response对象不仅包含响应内容,还包含状态码、响应头、Cookie等元数据。
- 可以根据需要将响应内容转化为字符串(text)、字节流(content)或字典(json)。
1. Response对象的常用属性与方法
调用属性时不加括号,调用方法时需加括号:
(1). status_code - 获取响应状态码
作用:获取服务器返回的HTTP响应状态码(如200表示成功,404表示未找到)。
python
Response.status_code
参数:
- 无参数: 这是一个属性(Attribute),而不是方法,调用时无需加括号。
返回值:
- 成功: 返回一个表示HTTP响应状态的整数(int)。
示例:
python
import requests
res = requests.get('https://httpbin.org/get')
res.status_code # 结果为 200
(2). text - 获取文本响应内容
作用:获取以Unicode格式解码后的字符串形式的响应内容。(Requests会自动推测文本编码,但也可能推测错误)。
python
Response.text
参数:
- 无参数: 这是一个属性(Attribute),调用时无需加括号。
返回值:
- 成功: 返回网页的HTML源代码或文本数据的字符串(str)。
示例:
python
import requests
res = requests.get('https://www.baidu.com')
res.text # 结果为网页的HTML源代码字符串
(3). content - 获取二进制响应内容
作用:获取字节流(二进制)形式的响应内容。常用于下载图片、视频、音频或其他非文本文件。
python
Response.content
参数:
- 无参数: 这是一个属性(Attribute),调用时无需加括号。
返回值:
- 成功: 返回二进制的字节流数据(bytes)。
示例:
python
import requests
res = requests.get('https://httpbin.org/image/jpeg')
res.content # 结果为 b'\xff\xd8\xff\xe0\x00\x10JFIF...'
(4). encoding & apparent_encoding - 获取/设置响应编码
作用:encoding 用于获取或手动设置 text 属性所使用的编码方式;apparent_encoding 则是通过备用分析库(chardet/charset_normalizer)分析文本内容推测出的真实编码,准确率很高。
python
Response.encoding
Response.apparent_encoding
参数:
- 无参数: 二者均为属性(Attribute)。但
encoding属性允许被重新赋值,以手动修正中文乱码等问题。
返回值:
- 成功: 返回表示当前所使用或推测出的编码类型的字符串(str)。
示例:
python
import requests
res = requests.get('https://www.baidu.com')
# 如果发现 res.text 出现中文乱码,可以利用推测出的真实编码来手动修正:
res.encoding = res.apparent_encoding
# 如果res.apparent_encoding出错可以手动设置
res.encoding = 'utf-8'
(5). headers & cookies - 获取响应头与Cookie
作用:headers 用于返回服务器响应的HTTP头信息;cookies 用于返回服务器发回的Cookie数据。
python
Response.headers
Response.cookies
参数:
- 无参数: 二者均为属性(Attribute),调用时无需加括号。
返回值:
- 成功 (headers): 返回一个大小写不敏感的字典(CaseInsensitiveDict)。
- 成功 (cookies): 返回服务器发回的Cookie数据对象(RequestsCookieJar,可像字典一样操作)。
示例:
python
import requests
res = requests.get('https://www.baidu.com')
# 获取响应头中的特定字段
server_type = res.headers.get('Server')
# 将返回的CookieJar对象转化为普通字典
cookie_dict = requests.utils.dict_from_cookiejar(res.cookies)
(6). json() - 解析JSON响应数据
作用:如果服务器返回的是JSON格式的数据,调用此方法会自动将其解析为Python内置的字典或列表对象。
python
Response.json(**kwargs)
参数:
- 可选参数 (kwargs):支持传入底层的
json.loads()相关的可选控制参数,但在日常开发中绝大多数情况下留空即可。
返回值:
- 成功: 返回解析后的Python字典或列表对象(dict 或 list)。
- 失败: 如果响应内容不是合法的JSON格式,会抛出
requests.exceptions.JSONDecodeError异常。
示例:
python
import requests
res = requests.get('https://httpbin.org/json')
data = res.json() # 自动转化为字典形式
print(data['slideshow']['author'])
三.核心请求方法
| 方法名称 | 描述 |
|---|---|
| requests.get() | 发送 GET 请求,通常用于从服务器获取数据。 |
| requests.post() | 发送 POST 请求,通常用于向服务器提交新数据。 |
| requests.put() | 发送 PUT 请求,通常用于更新服务器上的已有数据。 |
| requests.delete() | 发送 DELETE 请求,通常用于删除服务器上的数据。 |
| requests.head() | 发送 HEAD 请求,仅获取响应头,不获取响应体。 |
| requests.patch() | 发送 PATCH 请求,用于对资源进行局部修改。 |
在实际爬虫和接口开发中,get 和 post 是使用最为频繁的两个方法。
1. get - 发送GET请求
作用:向指定的URL发起HTTP GET请求,常用于获取或查询数据。GET请求的参数通常直接拼接在URL的末尾。
python
requests.get(url, params=None, **kwargs)
参数:
-
链接 (url): 需要请求的目标网站地址(str)。
-
查询参数 (params): 可选,追加在URL末尾的查询字符串参数,Requests会自动将字典转化为
?key1=value1&key2=value2的形式(dict 或 bytes)。以百度搜索为例,网址为:
https://www.baidu.com/s?wd=Python,?是一个分水岭:-
?前面的https://www.baidu.com/s是目标地址。 -
?后面的wd=Python就是查询参数(也就是你提交给百度的搜索词)。 -
如果有多个参数则用
&符号连起来。比如:?name=admin&age=20,意思就是"名字叫admin,年龄是20"。
-
-
控制参数 (kwargs): 其他可选参数,如请求头(headers)、超时(timeout)、代理(proxies)等。(具体见四.关键控制参数(kwargs))
返回值:
- 成功: 返回一个包含了服务器响应数据的Response对象(Response)。
示例:
python
import requests
# 不带参数的GET请求
r1 = requests.get('https://httpbin.org/get')
# 带参数的GET请求 (会自动拼接为: https://httpbin.org/get?name=admin&age=20)
# 1. 你先定义了一个 Python 字典,把你要发送的数据装进去
params = {'name': 'admin', 'age': 20}
# 2. 你把这个字典交给了requests.get的params 参数
r2 = requests.get('https://httpbin.org/get', params=params)
2. post - 发送POST请求
作用:向指定的URL发起HTTP POST请求,常用于向服务器提交表单、登录验证、提交JSON接口数据或上传本地文件。
python
requests.post(url, data=None, json=None, files=None, **kwargs)
参数:
- 链接 (url): 需要请求的目标网站地址(str)。
- 表单数据 (data): 可选,通常以字典形式传入,自动以
application/x-www-form-urlencoded格式发送给服务器(dict 或 str)。 - JSON数据 (json): 可选,如果你需要提交JSON格式的数据(如
application/json),直接将字典传给此参数,Requests会自动序列化(dict)。 - 文件数据 (files): 可选,用于向服务器上传本地文件(模拟
<input type="file">表单)。通常以字典形式传入,字典的键(key)为网页表单中定义的name字段;字典的值(value)为通过open()函数打开的本地文件对象(强烈建议以'rb'二进制模式读取,避免编码损坏)(dict)。 - 控制参数 (kwargs): 其他可选参数,如请求头(headers)、超时(timeout)、代理(proxies)等。(具体见四.关键控制参数(kwargs))
返回值:
- 成功: 返回一个包含了服务器响应数据的Response对象(Response)。
注意:
-
data, json, files参数组合规律
data和json绝对互斥;data是表单格式,json是JSON格式参数组合 能否一起用 底层 Content-Type (请求头) 常见应用场景 仅 dataV application/x-www-form-urlencoded纯文本表单提交、普通登录验证。 仅 jsonV application/json现代前后端分离项目、API 接口调用。 仅 filesV multipart/form-data纯文件上传。 data+jsonX (冲突,通常只生效 data)不要这么写! data+filesV multipart/form-data图文并茂提交 (如发微博:文字+配图)。 json+filesX (协议不兼容) 需将 JSON 转为字符串后配合 data和files使用。
示例:
python
import requests
# 1. 提交普通表单数据 (使用 data 参数)
form_data = {'user': 'test', 'pwd': '123'}
res_form = requests.post('https://httpbin.org/post', data=form_data)
# 2. 提交JSON数据 (使用 json 参数)
json_data = {'title': 'foo', 'body': 'bar'}
res_json = requests.post('https://httpbin.org/post', json=json_data)
# 3. 上传本地文件 (使用 files 参数)
# 推荐使用 'rb' (read binary) 二进制模式打开文件
files = {'file': open('report.xls', 'rb')}
res_file = requests.post('https://httpbin.org/post', files=files)
四.关键控制参数(kwargs)
几乎所有的请求方法(get, post等)都支持以下常用关键字参数,用于高度定制你的HTTP请求。
1. headers - 自定义请求头
作用:伪装或修改客户端的HTTP请求头信息。如果不设置这个参数,requests会老老实实地告诉服务器自己是python-requests/x.x.x,很容易被网站的反爬虫机制拦截。最常见的用法是修改 User-Agent,把自己伪装成一个正常的浏览器。
类型: 字典 (dict)
示例:
python
import requests
url = 'https://www.zhihu.com'
# 伪装成 Windows 平台下的 Chrome 浏览器
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}
res = requests.get(url, headers=headers)
2. timeout - 设置超时时间
作用: 设定等待服务器响应的最大时间(单位为秒)。设置后,如果超过时间没拿到数据,程序会抛出 Timeout 异常。如果不设置,一旦服务器卡死或网络极差,你的程序就会永远阻塞在那里死等。
类型: 浮点数 (float) 或 元组 (tuple)
示例:
python
# 要求服务器必须在 3.5 秒内响应,否则主动放弃并报错
res = requests.get('https://github.com', timeout=3.5)
# 进阶用法:传入元组 (连接超时时间, 读取数据超时时间)
res_advanced = requests.get('https://github.com', timeout=(3.0, 10.0))
3. proxies - 设置代理服务器
作用: 通过指定的代理服务器IP去转发你的请求,用于隐藏本机真实IP或突破区域网络限制。
类型: 字典 (dict)
示例:
python
# 告诉 requests,遇到 http 协议走哪个 IP,遇到 https 协议走哪个 IP
proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'http://10.10.1.10:1080',
}
res = requests.get('https://example.com', proxies=proxies)
4. cookies - 携带身份凭证
作用: 在请求时附带 Cookie 数据,通常用于保持登录状态。如果你已经在浏览器里登录了某个网站,把浏览器里的 Cookie 复制过来传给这个参数,你的爬虫就也是登录状态了。
类型: 字典 (dict) 或 RequestsCookieJar 对象
示例:
python
cookies = {'session_id': 'abc123456789xyz'}
res = requests.get('https://httpbin.org/cookies', cookies=cookies)
5. verify - SSL证书验证开关
作用: 控制是否验证目标网站的 TLS/SSL 证书(也就是网址开头 HTTPS 旁边的那个小锁头)。当遇到内网系统、测试环境或者证书过期的网站时,正常请求会直接报错。将此参数设为 False 可以强行忽略证书错误。
类型: 布尔值 (bool),默认值为 True
示例:
python
# 跳过 HTTPS 证书验证(强制请求头铁访问,控制台会输出一个 InsecureRequestWarning 警告)
res = requests.get('https://192.168.1.1', verify=False)
6. allow_redirects - 控制重定向跳转
作用: 决定当服务器告诉你"网页搬家了,请去新地址"(HTTP状态码 301/302)时,你的请求要不要自动跟过去。对于 GET 请求,requests 默认是十分体贴地自动帮你跳转的。
类型: 布尔值 (bool),GET 请求默认为 True
示例:
python
# 比如访问 http://github.com,正常会自动跳转到 https://github.com
# 如果设为 False,请求会停在第一步,你可以通过 res.status_code 拿到 301
res = requests.get('http://github.com', allow_redirects=False)
五.Session会话对象
Session是Requests中用于跨网络请求保持状态(特别是Cookie)的核心高级对象。
- 使用Session发起的请求,其底层的TCP连接也会被重用(连接池化),能显著提升多次请求时的网络效率!
- 它拥有和原生
requests完全一致的核心方法(如get、post等),但在同一个Session下发出的请求都会共享同一个状态环境。
1. Session对象的实例化
调用类的实例化方法时需加括号:
(1). Session() - 创建会话对象
作用:实例化一个独立的会话对象,建立一个状态共享的环境。如果在浏览器里登录了某个网站,再打开该网站的其他页面仍是登录状态;Session的作用就等同于此。
python
requests.Session()
参数:
- 无参数: 这是一个类的实例化方法,基础调用时无需传入参数。
返回值:
- 成功: 返回一个独立的会话对象 (Session 对象)。通过该对象发出的所有请求,都会自动维持 Cookie 等状态参数。
示例:
python
import requests
# 1. 实例化一个Session对象
s = requests.Session()
# 2. 模拟登录请求,服务器返回的Cookie会自动保存在 s 对象的内部
s.post('https://httpbin.org/cookies/set/sessioncookie/123456')
# 3. 再次使用 s 发起请求时,即使不写 cookies 参数,也会自动携带上一步获得的Cookie
res = s.get('https://httpbin.org/cookies')
print(res.text) # 结果中将包含 "sessioncookie": "123456"
六.常见异常处理
在使用Requests进行网络通信时,常常会遇到网络不通、连接超时等不可控问题。所有Requests引发的异常都包含在requests.exceptions 模块中。
| 异常类型 | 描述 |
|---|---|
| RequestException | 所有 requests 异常的基类(兜底异常)。 |
| ConnectionError | 无法连接到服务器(如DNS查询失败、拒绝连接、断网)。 |
| Timeout | 请求耗时超过了 timeout 参数设定的时间。 |
| TooManyRedirects | 请求超过了设定的最大重定向次数(死循环跳转)。 |
| HTTPError | 返回了不成功的HTTP状态码(需配合 res.raise_for_status() 使用)。 |
1. 异常捕获示例
作用:为了让程序具备健壮性,通常需要捕获异常,防止网络波动导致脚本崩溃。
python
import requests
from requests.exceptions import RequestException, Timeout, ConnectionError
url = 'https://httpbin.org/delay/5'
try:
# 设置超时时间为 3 秒
res = requests.get(url, timeout=3.0)
# 如果状态码是 4xx 或 5xx,主动抛出 HTTPError 异常
res.raise_for_status()
print(res.text)
except Timeout:
print("错误:请求超时了!")
except ConnectionError:
print("错误:网络连接失败!")
except RequestException as e:
print(f"错误:发生了其他未知网络请求异常: {e}")