
1. 引言在 Python 的众多第三方库中requests模块无疑是处理 HTTP 请求的“瑞士军刀”。它以其简洁、优雅的 API 设计极大地简化了与 Web 服务交互的复杂性让开发者能够用更少的代码完成更多的工作。无论是爬虫开发、API 调用、自动化测试还是构建微服务客户端requests都是不可或缺的核心工具。本文将带你从零开始全面掌握requests模块的使用涵盖安装、基础请求、高级特性、错误处理以及最佳实践。2. 安装 requests在开始之前你需要确保已经安装了requests库。如果你使用的是 Python 3通常可以通过pip进行安装pipinstallrequests对于使用 Conda 环境的用户可以使用以下命令condainstallrequests安装完成后你可以在 Python 交互式环境中验证安装是否成功importrequestsprint(requests.__version__)# 输出类似 2.31.0 的版本号3. 发起你的第一个请求requests最核心的功能是发起 HTTP 请求。它支持所有常见的 HTTP 方法GET, POST, PUT, DELETE, HEAD, OPTIONS 等。3.1 GET 请求GET 请求用于从指定的资源请求数据。这是最常用的方法。importrequests# 向示例 API 发起一个简单的 GET 请求responserequests.get(https://api.github.com)# 打印响应状态码print(f状态码:{response.status_code})# 输出: 200# 打印响应内容 (文本格式)print(response.text[:500])# 打印前500个字符# 如果响应是 JSON可以直接解析为 Python 字典# json_response response.json()# print(json_response)3.2 POST 请求POST 请求用于向指定的资源提交要被处理的数据例如提交表单或上传文件。importrequests# 定义要发送的数据payload{key1:value1,key2:value2}# 向测试服务器发送 POST 请求urlhttps://httpbin.org/postresponserequests.post(url,datapayload)print(f状态码:{response.status_code})print(响应 JSON:)print(response.json())4. 探索响应对象requests发起请求后返回的是一个Response对象它包含了服务器返回的所有信息。importrequests responserequests.get(https://api.github.com)# 1. 状态码print(f状态码:{response.status_code})# 常见状态码200 (成功), 404 (未找到), 500 (服务器错误)# 2. 响应头 (字典形式)print(响应头:)forkey,valueinresponse.headers.items():print(f{key}:{value})# 3. 响应内容# 文本内容text_contentresponse.text# 二进制内容 (如图片)binary_contentresponse.content# 自动解析的 JSON 内容 (如果响应头 Content-Type 是 application/json)json_contentresponse.json()# 注意如果响应不是 JSON会抛出异常# 4. 编码print(f编码:{response.encoding})# 可以手动设置编码response.encodingutf-8# 5. 请求历史 (对于重定向)print(f请求历史:{response.history})# 6. 消耗时间print(f请求耗时:{response.elapsed})5. 传递参数与定制请求在实际应用中我们经常需要定制请求。5.1 URL 参数对于 GET 请求参数通常以查询字符串的形式附加在 URL 后。requests可以帮你安全地构建它们。importrequests# 手动构建 URL (不推荐容易出错)# url https://httpbin.org/get?key1value1key2value2# 使用 params 参数自动编码 (推荐)params{search:python,page:2}responserequests.get(https://httpbin.org/get,paramsparams)print(f最终请求 URL:{response.url})# 输出: https://httpbin.org/get?searchpythonpage2print(response.json()[args])# 查看服务器收到的参数5.2 请求头你可以自定义请求头例如设置 User-Agent、Content-Type 或授权令牌。importrequests urlhttps://api.github.com/userheaders{User-Agent:MyApp/1.0,# 好的实践是设置一个自定义 User-AgentAuthorization:token YOUR_GITHUB_TOKEN,# GitHub API 认证Accept:application/vnd.github.v3json}responserequests.get(url,headersheaders)print(response.status_code)5.3 发送 JSON 数据当与 RESTful API 交互时经常需要发送 JSON 格式的数据。importrequestsimportjson urlhttps://httpbin.org/postdata{name:Alice,age:30,city:Shanghai}# 方法1使用 json 参数 (自动序列化并设置 Content-Type)responserequests.post(url,jsondata)print(方法1 - 使用 json 参数:)print(response.json()[json])# 方法2手动序列化并设置 headersheaders{Content-Type:application/json}response2requests.post(url,datajson.dumps(data),headersheaders)print(方法2 - 手动序列化:)print(response2.json()[json])推荐使用方法1它更简洁且不易出错。5.4 超时设置永远为你的请求设置超时避免程序无限期等待。importrequeststry:# 设置连接超时和读取超时 (单位秒)responserequests.get(https://httpbin.org/delay/5,timeout(3.05,10))print(请求成功)exceptrequests.exceptions.Timeout:print(请求超时)exceptrequests.exceptions.RequestExceptionase:print(f请求发生错误:{e})6. 处理会话与 Cookiesrequests.Session()对象允许你跨请求保持某些参数如 Cookies 和 Headers并复用底层的 TCP 连接从而提高性能。importrequests# 创建一个会话srequests.Session()# 为会话的所有请求设置公共头部和认证s.headers.update({User-Agent:MySessionBot/1.0})# s.auth (username, password) # 基础认证# 第一次请求服务器可能会设置 Cookies.get(https://httpbin.org/cookies/set/sessioncookie/123456789)# 第二次请求会话会自动携带上一步设置的 Cookieresponses.get(https://httpbin.org/cookies)print(当前会话的 Cookies:)print(response.json())# 关闭会话 (虽然不是严格必须但是好习惯)s.close()7. 错误与异常处理健壮的程序需要妥善处理网络请求中可能出现的各种异常。importrequestsfromrequests.exceptionsimportTimeout,ConnectionError,HTTPError,RequestException urlhttps://api.example.com/datatry:responserequests.get(url,timeout5)# 如果响应状态码不是 2xx抛出 HTTPErrorresponse.raise_for_status()# 处理成功的响应dataresponse.json()print(数据获取成功)exceptTimeout:print(请求超时请检查网络或稍后重试。)exceptConnectionError:print(网络连接错误请检查你的网络设置。)exceptHTTPErrorashttp_err:print(fHTTP 错误发生:{http_err})exceptRequestExceptionasreq_err:print(f请求过程中发生未知错误:{req_err})exceptValueError:print(响应内容不是有效的 JSON。)else:print(所有操作成功完成。)finally:print(请求尝试结束。)8. 高级应用示例8.1 文件上传importrequests urlhttps://httpbin.org/postfiles{file:open(report.pdf,rb)}# 以二进制模式打开文件responserequests.post(url,filesfiles)print(response.json()[files])# 查看上传的文件信息8.2 流式下载大文件对于大文件不建议一次性加载到内存可以使用流式模式。importrequests urlhttps://example.com/large-video.mp4local_filenamedownloaded_video.mp4# streamTrue 启用流式模式withrequests.get(url,streamTrue)asr:r.raise_for_status()withopen(local_filename,wb)asf:# 以 8192 字节的块写入文件forchunkinr.iter_content(chunk_size8192):f.write(chunk)print(f文件已下载:{local_filename})8.3 使用代理importrequests proxies{http:http://10.10.1.10:3128,https:http://10.10.1.10:1080,}# 你也可以设置环境变量 HTTP_PROXY 和 HTTPS_PROXYresponserequests.get(https://httpbin.org/ip,proxiesproxies)print(response.json())9. 最佳实践与总结总是设置超时防止程序挂起。检查响应状态码使用response.raise_for_status()或在关键逻辑中手动检查。使用 Session 对象进行多次请求时使用 Session 可以提升性能并保持状态。处理异常用try...except包裹网络请求优雅地处理错误。尊重目标网站设置合理的User-Agent遵守robots.txt避免过快请求考虑使用time.sleep。对于 API使用专门的 SDK如果目标服务提供了官方 Python SDK通常比直接使用requests更稳定、功能更全。requests模块的强大之处在于它将复杂的 HTTP 协议抽象成了简单直观的方法。掌握它你就拥有了与整个互联网对话的能力。10. 进一步学习官方文档Requests: HTTP for Humans 是最权威的学习资源。进阶库requests-html用于解析 HTML。requests-cache为 requests 添加缓存支持。requests-toolbelt提供了一些高级工具。异步请求对于高性能应用可以学习aiohttp或httpx库。希望这篇指南能帮助你高效地使用 Pythonrequests模块