初探 requests 库:轻松搞定网络请求
在 Python 中,requests 库是处理网络请求的利器,能轻松实现获取网页、调用 API 等操作,新手也能快速上手。
工作原理简介
requests 库的核心是封装 HTTP 协议的交互过程。当我们用它发送请求时,本质是按照 HTTP 规则向目标服务器传递信息,再接收服务器返回的响应。
简单来说,流程是这样的:
-
我们通过代码调用 requests 的方法(如 get、post),传入 URL 和参数;
-
库内部将这些信息打包成符合 HTTP 标准的请求格式,包括请求行、请求头、请求体等部分;
-
借助底层的网络模块建立 TCP 连接,把构建好的请求发送到目标服务器的指定端口(通常是 80 或 443);
-
服务器接收到请求后进行处理,生成响应数据并返回,requests 会将这些原始数据解析成包含状态码、响应头、响应内容等信息的 response 对象,方便我们提取和使用。
安装与基础使用
安装很简单,命令行输入pip install requests
即可。如果是在虚拟环境中,确保已激活环境再执行安装命令,这样库会被安装到当前环境中,避免与其他项目产生冲突。
获取网页内容最常用的是get
方法,它适用于从服务器获取数据的场景:
import requests
response = requests.get('https://www.baidu.com')
print(response.text) # 以字符串形式返回网页的HTML文本内容
print(response.status\_code) # 响应状态码,200表示请求成功,404表示页面不存在,500多为服务器内部错误
post
方法则主要用于向服务器提交数据,比如登录时提交账号密码、表单提交等场景:
response = requests.post('https://httpbin.org/post', data={'user': 'test'})
print(response.json()) # 若服务器返回JSON格式数据,用json()方法可直接转换成Python字典,方便提取数据
实用功能
- 模拟浏览器:很多网站会通过检查请求头中的 User-Agent 信息来判断访问者是浏览器还是程序,若识别为程序可能会拒绝提供服务。因此,添加浏览器的 User-Agent 标识能模拟真实浏览器访问,避免被拦截:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'} # 常见的Chrome浏览器标识
response = requests.get('https://example.com', headers=headers)
- 带参数请求:很多 URL 会带有查询参数,比如搜索内容、分页信息等。用
params
参数可以自动帮我们拼接这些参数,无需手动在 URL 后拼接字符串,既方便又能避免格式错误:
response = requests.get('https://www.baidu.com/s', params={'wd': 'Python', 'pn': '10'}) # 这里wd是搜索关键词,pn是分页参数,相当于访问https://www.baidu.com/s?wd=Python\&pn=10
- 获取二进制文件:对于图片、音频、视频等二进制文件,
text
属性无法正确处理,而content
属性会以字节流形式返回内容,正好适用于保存这些文件:
response = requests.get('https://example.com/image.jpg')
with open('img.jpg', 'wb') as f: # 以二进制写入模式打开文件
f.write(response.content) # 将字节流写入文件,完成图片保存
- 超时设置:网络请求可能因网络状况不佳或服务器响应慢而长时间无结果,设置
timeout
参数可以指定最长等待时间(单位为秒),超过这个时间就会抛出超时异常,避免程序一直卡在请求环节:
try:
requests.get('https://example.com', timeout=5) # 设置5秒超时,5秒内未收到响应则触发异常
except requests.exceptions.Timeout:
print('请求超时,请检查网络或稍后再试')
- 保持会话:在一些场景中,如登录后查看个人信息、购物时添加商品到购物车再结算等,需要在多个请求之间保持登录状态。
Session
对象能在多次请求中保持 cookies 信息,就像浏览器中打开一个标签页进行一系列操作一样:
session = requests.Session()
# 模拟登录,登录信息会被保存在session中
session.post('https://example.com/login', data={'user': 'u', 'pwd': 'p'})
# 登录后访问需要登录才能查看的页面,此时会携带登录时的cookies信息
response = session.get('https://example.com/userinfo')
print(response.text)
- 文件上传:当需要实现上传图片、文档等文件的功能时,
files
参数可以轻松实现。只需将文件以二进制读模式打开,作为值传入 files 字典即可:
files = {'file': open('test.txt', 'rb')} # 字典的键通常对应服务器端接收文件的字段名
requests.post('https://httpbin.org/post', files=files) # 发送文件到服务器
requests 库把复杂的 HTTP 交互简化,让我们不用深入底层细节,就能轻松完成网络请求。掌握这些基础,应对日常场景足够了。