LLM系列:1.python入门:19.Requests(网络库)

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 请求,用于对资源进行局部修改

在实际爬虫和接口开发中,getpost 是使用最为频繁的两个方法。


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参数组合规律

    datajson绝对互斥;data是表单格式,json是JSON格式

    参数组合 能否一起用 底层 Content-Type (请求头) 常见应用场景
    data V application/x-www-form-urlencoded 纯文本表单提交、普通登录验证。
    json V application/json 现代前后端分离项目、API 接口调用。
    files V multipart/form-data 纯文件上传。
    data + json X (冲突,通常只生效 data) 不要这么写!
    data + files V multipart/form-data 图文并茂提交 (如发微博:文字+配图)。
    json + files X (协议不兼容) 需将 JSON 转为字符串后配合 datafiles 使用。

示例:

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 完全一致的核心方法(如 getpost 等),但在同一个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}")
相关推荐
情绪总是阴雨天~9 小时前
全面掌握 AI Skills:从概念理解到实战落地的完整指南
人工智能·skill
net3m339 小时前
AI人工智能思路部分总结1---20260524
人工智能·ai·qkv
呆萌很9 小时前
TP、FP、FN、TN 详解
人工智能
穗余9 小时前
什么是ERC-8004
人工智能·web3·区块链
码海浮生9 小时前
人工智能日报 每日AI新闻(2026年5月24日):Google I/O集中发布Gemini Omni,AI商业化继续走向场景落地
人工智能
数智工坊9 小时前
《普通人打造AI小团队:通用智能体与企业级智能体搭建》第4、5、6章
人工智能
我爱cope9 小时前
【Agent智能体3 | 智能体AI的优势】
人工智能·职场和发展
吃好睡好便好9 小时前
创建随机矩阵
开发语言·人工智能·线性代数·算法·matlab·矩阵
拙野9 小时前
【保姆级教程】Claude Code无缝集成DeepSeek V4 Pro
java·人工智能·deepseek·claudecode·ai coding