当前位置: 首页 > news >正文

Python Requests库用法示例:从入门到实战的HTTP请求指南

在Python的网络编程领域,Requests库无疑是最受欢迎的HTTP客户端工具。它以"HTTP for Humans"为设计理念,让复杂的网络请求变得简单直观。本文将通过一系列实用示例,带你掌握Requests库的核心用法,从基础的GET/POST请求到文件上传下载,全方位覆盖日常开发需求。

一、Requests库简介与安装

Requests是一个开源的HTTP库,它构建在Python内置的urllib之上,但提供了更简洁的API和更完善的功能。相比原生库,它的优势在于:

  • 无需手动处理URL编码和解码

  • 内置JSON解析功能

  • 自动处理Cookie和会话

  • 支持文件上传下载

  • 完善的异常处理机制

安装方法

使用pip即可快速安装Requests库:

pip install requests

安装完成后,在代码中导入即可使用:

import requests

二、基础用法:发送你的第一个请求

1. 发送GET请求获取网页内容

最基础的用法是发送GET请求获取网页内容,一行代码即可完成:

import requests# 发送GET请求
response = requests.get('https://httpbin.org/get')# 响应状态码(200表示成功)
print(f"状态码: {response.status_code}")# 响应内容(字符串形式)
print(f"响应内容: {response.text[:200]}...")  # 只显示前200个字符# 响应内容(字节形式,适用于二进制数据)
print(f"字节内容长度: {len(response.content)}")# 响应头信息
print(f"内容类型: {response.headers['Content-Type']}")# 实际请求的URL(可能会有重定向)
print(f"最终URL: {response.url}")

运行这段代码,你会得到来自测试接口httpbin.org的响应信息,包含了请求的详细数据。

2. 带参数的GET请求

很多时候需要在URL中添加查询参数(如?key=value&page=1),使用params参数可以更优雅地处理:

import requests# 定义查询参数
params = {'name': '张三','age': 30,'hobbies': ['reading', 'coding']
}# 发送带参数的GET请求
response = requests.get('https://httpbin.org/get',params=params
)# 打印实际请求的URL(自动处理了中文和列表参数)
print(f"请求URL: {response.url}")# 打印响应内容(JSON格式)
print("响应内容:")
print(response.json())  # 自动解析JSON

注意到params参数会自动处理特殊字符编码(如中文"张三"被编码为%E5%BC%A0%E4%B8%89),列表参数会被转换为多个键值对(hobbies=reading&hobbies=coding)。

三、处理POST请求与数据提交

POST请求常用于提交数据,如表单提交、API数据创建等。Requests提供了灵活的方式处理不同类型的数据提交。

1. 提交表单数据(application/x-www-form-urlencoded)

使用data参数提交表单数据:

import requests# 表单数据
form_data = {'username': 'test_user','password': 'test_password','remember_me': 'true'
}# 发送POST请求提交表单
response = requests.post('https://httpbin.org/post',data=form_data
)# 打印响应内容
print("服务器收到的数据:")
print(response.json()['form'])  # 查看服务器收到的表单数据

2. 提交JSON数据(application/json)

现代API常使用JSON格式交换数据,使用json参数可以直接发送JSON数据:

import requests# JSON数据
json_data = {'title': 'Python Requests教程','content': '这是一篇关于Requests库的教程','tags': ['python', 'requests', 'http'],'status': 1
}# 发送POST请求提交JSON
response = requests.post('https://httpbin.org/post',json=json_data  # 自动设置Content-Type为application/json
)# 打印响应内容
print("服务器收到的JSON数据:")
print(response.json()['json'])

使用json参数比手动使用json.dumps()转换并设置headers更简洁,Requests会自动处理编码和Content-Type头。

四、高级功能:请求头、会话与认证

1. 自定义请求头(Headers)

很多网站和API会验证请求头信息,尤其是User-Agent(客户端标识)和Authorization(认证信息):

import requests# 自定义请求头
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','Accept': 'application/json, text/plain, */*','Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'  # 示例token
}# 发送带自定义头的请求
response = requests.get('https://httpbin.org/get',headers=headers
)# 查看服务器收到的请求头
print("服务器收到的请求头:")
print(response.json()['headers'])

设置合理的User-Agent可以避免被服务器识别为爬虫,Authorization头则用于需要身份验证的API访问。

2. 会话管理(Session)

在需要保持登录状态的场景(如连续访问需要登录的页面),Session对象可以自动处理Cookie:

import requests# 创建会话对象
with requests.Session() as session:# 1. 登录(获取Cookie)login_data = {'username': 'test_user','password': 'test_pass'}# 发送登录请求login_response = session.post('https://httpbin.org/post',data=login_data)print(f"登录状态码: {login_response.status_code}")# 2. 访问需要登录的页面(自动携带Cookie)profile_response = session.get('https://httpbin.org/get')# 查看请求中携带的Cookieprint(f"请求携带的Cookie: {profile_response.request.headers.get('Cookie')}")# 3. 所有请求完成后,会话会自动关闭

Session对象会在多个请求之间保持Cookie,模拟浏览器的会话功能,比手动处理Cookie更高效可靠。

3. 身份认证

对于需要认证的API,Requests提供了多种认证方式,最常见的是基本认证(Basic Auth):

import requests
from requests.auth import HTTPBasicAuth# 基本认证(Basic Auth)
response = requests.get('https://httpbin.org/basic-auth/user/passwd',auth=HTTPBasicAuth('user', 'passwd')  # 用户名和密码
)print(f"认证结果状态码: {response.status_code}")  # 200表示认证成功
print("响应内容:", response.json())# 简化写法(效果相同)
response = requests.get('https://httpbin.org/basic-auth/user/passwd',auth=('user', 'passwd')  # 直接传入元组
)

除了基本认证,Requests还支持摘要认证(Digest Auth)、OAuth等多种认证方式,可根据API要求选择。

五、文件处理:上传与下载

1. 文件上传

使用files参数可以轻松上传文件:

import requests# 准备要上传的文件
files = {# 'file'是表单字段名,值为元组(文件名, 文件对象, MIME类型)'file': ('example.txt', open('example.txt', 'rb'), 'text/plain'),# 可以同时上传多个文件'image': ('photo.jpg', open('photo.jpg', 'rb'), 'image/jpeg')
}# 附加其他表单数据
data = {'description': '这是一个测试文件','category': 'example'
}# 发送文件上传请求
response = requests.post('https://httpbin.org/post',files=files,data=data
)print(f"上传状态码: {response.status_code}")# 关闭文件(或使用with语句)
files['file'][1].close()
files['image'][1].close()

2. 文件下载

下载文件时,对于大文件建议使用流式下载(stream=True),避免占用过多内存:

import requestsdef download_file(url, save_path):try:# 流式下载模式with requests.get(url, stream=True, timeout=10) as response:response.raise_for_status()  # 检查请求是否成功# 打开文件并分块写入with open(save_path, 'wb') as f:# 每次读取1024字节for chunk in response.iter_content(chunk_size=1024):if chunk:  # 过滤空块f.write(chunk)print(f"文件已保存至: {save_path}")return Trueexcept Exception as e:print(f"下载失败: {str(e)}")return False# 下载示例图片
download_file(url='https://picsum.photos/800/600',save_path='downloaded_image.jpg'
)

六、错误处理与超时设置

网络请求可能遇到各种异常(超时、连接错误等),完善的错误处理能让程序更健壮:

import requests
from requests.exceptions import (HTTPError, ConnectionError, Timeout, RequestException
)def safe_request(url):try:# 设置超时时间(连接超时5秒,读取超时10秒)response = requests.get(url,timeout=(5, 10),  # (连接超时, 读取超时)headers={'User-Agent': 'MyApp/1.0'})# 检查HTTP错误状态码(4xx客户端错误,5xx服务器错误)response.raise_for_status()return f"请求成功,内容长度: {len(response.text)}"except HTTPError as e:return f"HTTP错误: {str(e)}"except ConnectionError:return "连接错误: 无法连接到服务器"except Timeout:return "超时错误: 请求超过了指定时间"except RequestException as e:return f"请求错误: {str(e)}"# 测试不同情况
print(safe_request("https://httpbin.org/get"))  # 正常请求
print(safe_request("https://httpbin.org/status/404"))  # 404错误
print(safe_request("https://invalid.url.example"))  # 连接错误

七、实战案例:获取GitHub用户信息

让我们结合前面所学的知识,编写一个获取GitHub用户信息的程序:

import requests
import jsondef get_github_user(username):"""获取GitHub用户信息"""url = f"https://api.github.com/users/{username}"# 请求头(GitHub API要求设置User-Agent)headers = {'User-Agent': 'MyGitHubApp/1.0','Accept': 'application/vnd.github.v3+json'}try:# 发送请求response = requests.get(url,headers=headers,timeout=10)response.raise_for_status()  # 检查状态码# 解析JSON数据user_data = response.json()# 提取关键信息result = {'用户名': user_data['login'],'姓名': user_data.get('name', '未设置'),'仓库数量': user_data['public_repos'],'关注者数量': user_data['followers'],'所在地': user_data.get('location', '未知'),'创建时间': user_data['created_at'],'个人主页': user_data.get('blog', '无')}return resultexcept HTTPError as e:if response.status_code == 404:return f"错误: 用户 '{username}' 不存在"return f"HTTP错误: {str(e)}"except Exception as e:return f"获取信息失败: {str(e)}"if __name__ == "__main__":# 获取GitHub官方机器人用户信息user_info = get_github_user("octocat")# 打印结果if isinstance(user_info, dict):print("GitHub用户信息:")for key, value in user_info.items():print(f"{key}: {value}")else:print(user_info)

这个案例综合运用了:

  • 构造动态URL

  • 设置自定义请求头

  • 处理JSON响应

  • 错误处理与状态码检查

  • 数据提取与格式化

八、总结与最佳实践

Requests库凭借简洁的API和强大的功能,成为Python开发者处理HTTP请求的首选工具。通过本文的示例,你应该已经掌握了从基础到进阶的核心用法。

以下是一些最佳实践建议:

  1. 始终设置超时 - 避免程序因网络问题无限期挂起

  2. 使用上下文管理器 - 对于Session和文件操作,使用with语句确保资源正确释放

  3. 合理设置请求头 - 尤其是User-Agent,避免被服务器拒绝

  4. 处理异常情况 - 网络请求不稳定,完善的错误处理能提高程序可靠性

  5. 尊重API限制 - 遵守目标服务器的速率限制,添加适当延迟

  6. 使用会话复用连接 - 多次访问同一域名时,Session能提高性能

Requests库的功能远不止本文介绍的这些,更多高级特性(如代理、SSL验证、流式响应处理等)可以参考官方文档:https://requests.readthedocs.io/

掌握Requests库,能让你在API开发、数据爬取、自动化测试等领域事半功倍,是每个Python开发者必备的技能之一。

http://www.dtcms.com/a/471564.html

相关文章:

  • 番禺建网站网站建设的流程分析
  • 婚庆设计网站模板做框架表格网站
  • 敦化建设局网站两学一做纪实评价系统登陆网站
  • 依托 <AI 原生应用架构白皮书>,看 AI 原生应用的发展与实践
  • 重庆卓光网站建设外贸网站支付系统
  • 西安制作网站需要多少钱网站图片大小多少合适
  • 网站开发后端所需要的语言南和邢台网站制作
  • SpringBoot集成:5分钟实现HTML转PDF功能
  • 深圳外贸网站推广公司学做网站书籍
  • 做直播网站视频教程大连网络运营
  • 凤岗做网站国家工商网查询企业信息
  • 个人项目开发(1):使用Spring Secruity实现用户登录
  • 建一个网站大约花多少钱网站建设的整个过程
  • SNMP Trap(告警上报)在 v1 与 v2 版本中节点(OID)或事件描述不一致的问题解决
  • 机器视觉的光纤检测应用
  • 东莞建外贸网站好济南定制网站建设
  • 【agent】AI 数字人构建7:Open-LLM-VTuber使用pycharm配置uv解释器及本地sherpa-onnx实现 tts
  • 网站设计的优点js网页特效
  • wordpress动静分离七牛徐州seo公司
  • 网站推广平台搭建软件设计开发
  • 唐山软件开发公司排名惠州搜索引擎优化
  • 河北通信网站建设google seo怎么优化
  • 推广网站的图片怎么做宁波知名seo关键词优化
  • 网站建设预算计算方法2022网页游戏排行榜前十名
  • 网站开发需要哪些知识和工具wordpress官方主题论坛
  • 湘潭企业网站建设做类似知乎网站
  • 宇宙中的“未知之门“:多维时空理论中的神秘通道
  • 系统难还是网站设计难做仙居手机网站开发
  • 算法精讲:广度优先搜索(BFS)——从原理到实战的完整指南
  • 做网站需要icp吗网站建设dede模板免费