Requests 简介:简化 HTTP 请求的 Python 库

2025-01-22 08:30:10

Requests Logo

引言

在现代 Web 开发中,HTTP 请求是与外部服务进行交互的核心方式之一。无论是调用 RESTful API 还是从远程服务器获取数据,都需要一个高效且易于使用的 HTTP 请求库。Requests 是由 Python 软件基金会(Python Software Foundation, PSF)维护的一个流行的 HTTP 请求库,它旨在简化 HTTP 请求的处理过程,使得开发者可以更加专注于业务逻辑的实现。

本文将详细介绍 Requests 的安装、配置和使用方法,帮助开发者快速上手并掌握这一强大的 HTTP 请求库。

一、Requests 简介

1.1 什么是 Requests?

Requests 是一个用于发送 HTTP 请求的 Python 库,由 Kenneth Reitz 创建并由 Python 软件基金会维护。它提供了简洁而直观的 API 接口,使得开发者可以通过几行代码完成复杂的 HTTP 请求操作。相比内置的 urllib 模块,Requests 更加易用,并且支持更多高级功能,如会话管理、身份验证、SSL 验证等。

1.2 Requests 的特点

  • 简洁易用:提供了简单明了的 API 接口,用户可以通过几行代码完成复杂的 HTTP 请求。
  • 丰富的功能:支持多种 HTTP 方法(GET、POST、PUT、DELETE 等),以及文件上传、表单提交等功能。
  • 自动解码:能够自动解码响应内容,支持多种编码格式(如 UTF-8、GBK 等)。
  • 会话管理:通过 Session 对象管理多个请求之间的连接状态,提高效率和安全性。
  • 身份验证:内置了多种身份验证机制,如 Basic Auth、Digest Auth 等,方便处理需要认证的接口。
  • 社区活跃:拥有庞大的开发者社区,提供了大量的文档、教程和支持资源。

二、Requests 的安装

2.1 安装方式

Requests 提供了多种安装方式,适用于不同的环境和需求。以下是几种常见的安装方法:

方法一:通过 pip 安装

对于 Python 用户,推荐使用 pip 安装 Requests。确保你已经安装了 Python 和 pip,然后执行以下命令:

pip install requests

方法二:通过 Conda 安装

如果你使用的是 Anaconda 或 Miniconda,可以通过以下命令安装 Requests:

conda install requests

方法三:从源码编译安装

如果你更喜欢从源码编译安装 Requests,可以通过 GitHub Releases 页面下载源码并进行编译安装。以下是具体的步骤:

  1. 访问 Requests GitHub 仓库 并下载最新版本的源码包。

  2. 解压下载的文件,并进入解压后的目录。

  3. 执行以下命令进行安装:

    python setup.py install
    

2.2 验证安装

安装完成后,可以通过以下代码验证 Requests 是否安装成功:

import requests
print(requests.__version__)

如果显示版本号信息,则表示安装成功。

三、Requests 的配置

3.1 基本配置

首次使用 Requests 时,建议先进行一些基本配置,以便更好地适应个人工作习惯。以下是常用的配置项及其说明:

  • 超时设置:设置请求的超时时间,避免长时间等待导致程序卡死。
  • 代理设置:配置代理服务器,方便在特殊网络环境下使用。
  • SSL 验证:启用或禁用 SSL 验证,确保通信的安全性。
  • 自定义头信息:添加自定义的 HTTP 头信息,如 User-Agent、Authorization 等。
  • 会话管理:使用 Session 对象管理多个请求之间的连接状态,提高效率和安全性。
  • 日志记录:配置日志级别和输出路径,方便问题排查和调试。

3.2 超时设置

为了防止请求长时间未响应,建议设置合理的超时时间。可以通过 timeout 参数来指定超时时间(以秒为单位)。例如:

response = requests.get('https://api.example.com', timeout=5)

3.3 代理设置

如果需要通过代理服务器访问目标网站,可以通过 proxies 参数来配置代理。例如:

proxies = {
    'http': 'http://10.10.1.10:3128',
    'https': 'http://10.10.1.10:1080',
}
response = requests.get('https://api.example.com', proxies=proxies)

3.4 SSL 验证

默认情况下,Requests 会验证 SSL 证书的有效性。如果需要禁用 SSL 验证,可以通过 verify 参数来实现。例如:

response = requests.get('https://api.example.com', verify=False)

3.5 自定义头信息

为了模拟浏览器行为或传递特定的请求头信息,可以通过 headers 参数来添加自定义头信息。例如:

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
response = requests.get('https://api.example.com', headers=headers)

3.6 会话管理

为了提高效率和安全性,建议使用 Session 对象来管理多个请求之间的连接状态。例如:

session = requests.Session()
response = session.get('https://api.example.com')

3.7 日志记录

为了便于问题排查和调试,建议配置日志记录功能。可以通过以下代码启用详细的日志输出:

import logging

logging.basicConfig(level=logging.DEBUG)
response = requests.get('https://api.example.com')

四、Requests 的使用技巧

4.1 发送 GET 请求

GET 请求是最常见的 HTTP 请求类型之一,用于从服务器获取资源。以下是具体的操作示例:

response = requests.get('https://api.example.com')
print(response.status_code)
print(response.text)

4.2 发送 POST 请求

POST 请求通常用于向服务器提交数据。可以通过 datajson 参数来传递表单数据或 JSON 数据。以下是具体的操作示例:

4.2.1 表单提交

data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://api.example.com', data=data)
print(response.status_code)
print(response.text)

4.2.2 JSON 提交

json_data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://api.example.com', json=json_data)
print(response.status_code)
print(response.json())

4.3 文件上传

Requests 支持文件上传功能,可以通过 files 参数来传递文件对象。以下是具体的操作示例:

files = {'file': open('test.txt', 'rb')}
response = requests.post('https://api.example.com/upload', files=files)
print(response.status_code)
print(response.text)

4.4 处理响应

Requests 提供了多种方法来处理响应内容,包括文本解析、JSON 解析、二进制数据处理等。以下是具体的操作示例:

4.4.1 文本解析

response = requests.get('https://api.example.com')
print(response.text)

4.4.2 JSON 解析

response = requests.get('https://api.example.com/json')
print(response.json())

4.4.3 二进制数据处理

response = requests.get('https://api.example.com/image.jpg')
with open('image.jpg', 'wb') as f:
    f.write(response.content)

4.5 错误处理

为了确保程序的健壮性,建议对可能出现的异常情况进行处理。Requests 提供了多种异常类,用户可以根据需要捕获相应的异常。以下是具体的操作示例:

try:
    response = requests.get('https://api.example.com')
    response.raise_for_status()  # 如果响应状态码不是 200,抛出 HTTPError 异常
except requests.exceptions.HTTPError as errh:
    print("Http Error:", errh)
except requests.exceptions.ConnectionError as errc:
    print("Error Connecting:", errc)
except requests.exceptions.Timeout as errt:
    print("Timeout Error:", errt)
except requests.exceptions.RequestException as err:
    print("OOps: Something Else", err)

4.6 中间件与插件

Requests 支持通过中间件和插件扩展其功能。用户可以根据需求编写自定义中间件或安装第三方插件,以增强 Requests 的能力。以下是几种常见的插件及其用途:

  • requests-toolbelt:提供了一些实用工具,如 multipart/form-data 编码、重试机制等。
  • requests-cache:实现了请求缓存功能,减少重复请求次数,提高性能。
  • requests-oauthlib:集成了 OAuth2 认证机制,方便处理需要授权的接口。

4.7 性能优化

为了提升 Requests 的性能,可以从以下几个方面入手:

  • 启用会话复用:使用 Session 对象管理多个请求之间的连接状态,减少 TCP 连接建立的时间开销。
  • 批量请求:通过并发或异步请求的方式,同时发起多个请求,提高整体性能。
  • 压缩传输:启用 Gzip 压缩,减少传输的数据量,加快响应速度。

五、Requests 的高级功能

5.1 自定义适配器

Requests 支持自定义适配器,用户可以根据需求编写适配器来处理特定类型的请求。例如,编写一个适配器用于处理 HTTPS 请求中的证书验证问题:

from requests.adapters import HTTPAdapter
import ssl

class CustomHTTPSAdapter(HTTPAdapter):
    def init_poolmanager(self, *args, **kwargs):
        context = ssl.create_default_context()
        context.check_hostname = False
        context.verify_mode = ssl.CERT_NONE
        kwargs['ssl_context'] = context
        return super().init_poolmanager(*args, **kwargs)

session = requests.Session()
session.mount('https://', CustomHTTPSAdapter())
response = session.get('https://api.example.com')

5.2 异步请求

虽然 Requests 默认是同步的,但可以通过集成异步库(如 aiohttp)来实现异步请求。以下是具体的实现方法:

  1. 安装 aiohttp 库:

    pip install aiohttp
    
  2. 编写异步请求代码:

    import aiohttp
    import asyncio
    
    async def fetch(session, url):
        async with session.get(url) as response:
            return await response.text()
    
    async def main():
        async with aiohttp.ClientSession() as session:
            html = await fetch(session, 'https://api.example.com')
            print(html)
    
    if __name__ == '__main__':
        loop = asyncio.get_event_loop()
        loop.run_until_complete(main())
    

5.3 请求拦截

Requests 支持请求拦截功能,用户可以通过编写拦截器来修改请求或响应内容。以下是具体的实现方法:

import requests

class RequestInterceptor(requests.adapters.HTTPAdapter):
    def send(self, request, **kwargs):
        print(f"Intercepting request to {request.url}")
        return super().send(request, **kwargs)

session = requests.Session()
session.mount('http://', RequestInterceptor())
session.mount('https://', RequestInterceptor())

response = session.get('https://api.example.com')
print(response.text)

5.4 流式传输

对于大文件或流式数据,Requests 提供了流式传输功能,用户可以通过 stream 参数来启用该功能。以下是具体的实现方法:

response = requests.get('https://api.example.com/large-file.zip', stream=True)
with open('large-file.zip', 'wb') as f:
    for chunk in response.iter_content(chunk_size=8192):
        if chunk:
            f.write(chunk)

5.5 中间件与插件

Requests 拥有丰富的中间件和插件生态,用户可以根据需求选择合适的中间件或插件来增强功能。以下是几种常见的中间件和插件及其用途:

  • requests-mock:用于单元测试,模拟 HTTP 请求和响应。
  • requests-futures:实现异步请求功能,提高并发处理能力。
  • requests-ntlm:支持 NTLM 认证,方便处理企业内部网的接口。

总结

Requests 作为一款强大的 HTTP 请求库,凭借其简洁易用的 API 接口、丰富的功能模块以及活跃的社区支持,在 Python 开发中扮演着重要角色。

psf
一个简单、优雅的Python HTTP网络库。
Python
Apache-2.0
52.5 k