Request库用法总结

一、简介

requests 是一个用于发送 HTTP 请求的简单且优雅的 Python 库。它以简洁的 API 和强大的功能性而著称,使开发者能够轻松地处理与 Web 服务器的通信。无论是进行 Web 抓取、与 API 交互,还是实现 Web 自动化,requests 都是一个非常得力的工具。
Python 的标准库中已经包含了处理 HTTP 请求的模块,例如 urllib,但这些模块的使用较为繁琐,代码可读性较差。而 requests 提供了一种更加直观和易于使用的方式,成为了开发者进行 HTTP 操作的首选库。

在开始使用 requests 之前,你需要先安装它。你可以使用 Python 包管理器 pip 来安装 requests。

pip install requests

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

import requests

response = requests.get('https://www.baidu.com')
print(response.status_code)  # 如果输出200,则表示安装成功

requests 的使用通常分为以下几个步骤:

  • 发起 HTTP 请求:使用 requests 的各种方法(如 get()、post() 等)发起请求。
  • 处理响应:获取服务器返回的响应对象,解析响应内容。
  • 处理异常:处理可能出现的网络异常,如超时、连接错误等。
  • 高级操作:使用 requests 进行会话管理、文件上传、身份认证等操作

二、基本用法

下面将详细介绍 requests 库的基本用法,包括如何发起不同类型的 HTTP 请求、解析响应内容、检查状态码、以及如何处理请求头等基本操作。

1 GET 请求

GET 请求是用于从服务器获取资源的最常见的 HTTP 请求方法。

  • 基本 GET 请求

    使用 requests.get() 方法可以发送一个简单的 GET 请求,并获取响应内容。

    import requests
    
    url = "https://api.example.com/data"
    response = requests.get(url)
    
    # 打印响应内容
    print(response.text)
    
  • 带参数的 GET 请求

    你可以在 GET 请求中通过 params 参数传递 URL 参数,服务器可以根据这些参数返回特定的数据。

    params = {'key1': 'value1', 'key2': 'value2'}
    response = requests.get(url, params=params)
    
    print(response.url)  # 查看生成的 URL
    print(response.text)  # 打印响应内容
    
  • 获取 JSON 数据

    如果服务器返回的是 JSON 格式的数据,可以直接使用 response.json() 方法将其解析为 Python 字典。

    response = requests.get(url)
    
    if response.status_code == 200:
        data = response.json()
        print(data)
    

2 POST 请求

POST 请求用于向服务器发送数据以创建或更新资源。常用于提交表单数据或上传文件。

  • 发送表单数据

    使用 requests.post() 方法可以将表单数据发送到服务器。

    url = "https://api.example.com/submit"
    data = {'name': 'John', 'age': 30}
    
    response = requests.post(url, data=data)
    
    print(response.status_code)
    print(response.text)
    
  • 发送 JSON 数据

    当服务器要求以 JSON 格式发送数据时,可以使用 json 参数。

    json_data = {'username': 'admin', 'password': 'admin123'}
    
    response = requests.post(url, json=json_data)
    
    print(response.status_code)
    print(response.json())
    

3 PUT 请求

PUT 请求用于更新服务器上的现有资源。与 POST 不同,PUT 通常用于更新而不是创建新资源。

  • 发送更新数据

    使用 requests.put() 方法可以发送数据以更新服务器上的资源。

    url = "https://api.example.com/update/1"
    data = {'name': 'John Doe', 'age': 31}
    
    response = requests.put(url, data=data)
    
    print(response.status_code)
    print(response.text)
    

4 DELETE 请求

DELETE 请求用于删除服务器上的资源。

  • 删除资源

    使用 requests.delete() 方法可以从服务器上删除指定的资源。

    url = "https://api.example.com/delete/1"
    
    response = requests.delete(url)
    
    print(response.status_code)
    print(response.text)
    

5 解析响应内容

收到服务器的响应后,你可以通过 Response 对象来解析和处理响应内容。requests 提供了多种方式来访问响应数据。

  • 响应文本 (response.text):获取响应内容的文本形式,通常用于处理 HTML、XML 等文本数据。

    response = requests.get('https://www.example.com')
    print(response.text)  # 输出页面的 HTML 内容
    
  • 二进制内容 (response.content):获取响应内容的二进制形式,适用于处理图片、音频等非文本数据。

    response = requests.get('https://www.example.com/image.jpg')
    with open('image.jpg', 'wb') as file:
        file.write(response.content)
    
  • JSON 数据 (response.json()):如果响应内容是 JSON 格式,你可以使用 response.json() 将其解析为 Python 字典或列表。

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

6 检查响应状态码

HTTP 状态码用于表示服务器对请求的处理结果。requests 提供了简单的方法来检查响应的状态码,以判断请求是否成功。

response = requests.get('https://www.example.com')
if response.status_code == 200:
    print("请求成功")
else:
    print(f"请求失败,状态码: {response.status_code}")
  • 常见状态码

    • 200: 请求成功
    • 404: 资源未找到
    • 500: 服务器内部错误
  • raise_for_status() 方法:该方法用于检查请求是否成功,如果响应状态码表明请求失败(例如 4xx 或 5xx 错误),则会抛出一个 HTTPError 异常。

    try:
        response = requests.get('https://www.example.com/404')
        response.raise_for_status()
    except requests.HTTPError as e:
        print(f"请求失败: {e}")
    

三、高级功能

1 会话管理

在多个请求之间保持状态(例如保持登录状态),可以通过使用 requests.Session 对象来实现。Session 对象可以保存 Cookies,并在同一会话中复用它们,这在处理需要登录的操作时非常有用。

  • 创建会话

    session = requests.Session()
    
  • 在会话中发起请求

    session.get('https://www.example.com/login')  # 先登录
    response = session.get('https://www.example.com/dashboard')  # 访问需要登录的页面
    print(response.text)
    
  • 关闭会话:使用完会话后,可以通过 session.close() 关闭它,释放资源。

    session.close()
    

会话对象不仅可以保持 Cookies,还可以保持所有的请求设置,比如请求头、代理等。因此,通过会话对象,你可以减少重复代码,提高代码的可读性和可维护性。

2 身份认证

许多 Web 服务在处理请求时需要用户进行身份认证。requests 库提供了对多种身份认证方式的支持,最常见的包括基本认证(Basic Auth)和基于令牌的认证(Token-based Auth)。

  • 基本认证

    from requests.auth import HTTPBasicAuth
    
    response = requests.get('https://www.example.com', auth=HTTPBasicAuth('username', 'password'))
    print(response.status_code)
    
  • 基于令牌的认证

    通常用于 API 访问,通过在请求头中传递一个 Token 实现身份认证。

    headers = {'Authorization': 'Bearer your_token_here'}
    response = requests.get('https://www.example.com/api/protected', headers=headers)
    print(response.json())
    
  • 自定义认证

    你还可以通过继承 requests.auth.AuthBase 类实现自定义的认证方法,以满足特定的身份认证需求。

    from requests.auth import AuthBase
    
    class TokenAuth(AuthBase):
        def __init__(self, token):
            self.token = token
    
        def __call__(self, r):
            r.headers['Authorization'] = f'Bearer {self.token}'
            return r
    
    response = requests.get('https://www.example.com/api/protected', auth=TokenAuth('your_token_here'))
    print(response.status_code)
    

3 使用代理

在某些网络环境下,你可能需要通过代理服务器发送请求。requests 库支持通过代理发送 HTTP 和 HTTPS 请求。

  • 设置代理

    proxies = {
        'http': 'http://10.10.1.10:3128',
        'https': 'https://10.10.1.10:1080',
    }
    response = requests.get('https://www.example.com', proxies=proxies)
    print(response.status_code)
    
  • 使用身份认证的代理:如果代理服务器需要认证,可以在代理 URL 中包含用户名和密码。

    proxies = {
        'http': 'http://user:password@10.10.1.10:3128/',
        'https': 'https://user:password@10.10.1.10:1080/',
    }
    response = requests.get('https://www.example.com', proxies=proxies)
    print(response.status_code)
    
  • HTTPS 代理的注意事项:在使用 HTTPS 代理时,如果遇到 SSL 证书错误,可以通过 verify=False 禁用 SSL 证书验证,但这可能会带来安全风险。

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

4 文件上传

requests 库允许你通过 HTTP POST 请求上传文件。上传文件时,你需要使用 files 参数来传递文件对象。

  • 上传单个文件

    files = {'file': open('report.csv', 'rb')}
    response = requests.post('https://www.example.com/upload', files=files)
    print(response.status_code)
    
  • 上传多个文件:如果需要上传多个文件,可以在 files 参数中传递多个文件对象。

    files = {
        'file1': open('report.csv', 'rb'),
        'file2': open('summary.txt', 'rb'),
    }
    response = requests.post('https://www.example.com/upload', files=files)
    print(response.status_code)
    
  • 自定义文件名和 MIME 类型:你可以通过传递元组的方式自定义文件的文件名和 MIME 类型。

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

5 流式请求

在处理大文件下载或需要逐步处理响应内容的情况下,使用流式请求可以避免将整个响应内容加载到内存中。requests 提供了 stream 参数用于开启流式请求。

  • 下载大文件

    response = requests.get('https://www.example.com/largefile.zip', stream=True)
    with open('largefile.zip', 'wb') as file:
        for chunk in response.iter_content(chunk_size=8192):
            if chunk:
                file.write(chunk)
    
    • iter_content(chunk_size=8192):以指定的块大小迭代响应内容,适用于处理大文件。
  • 逐行读取响应内容:流式请求还可以用于逐行读取响应内容,适合处理服务器返回的大量文本数据。

    response = requests.get('https://www.example.com/stream', stream=True)
    for line in response.iter_lines():
        if line:
            print(line.decode('utf-8'))
    

6 持续连接与请求池

在高并发场景下,你可能需要频繁地发起 HTTP 请求。为了提高性能,requests 库支持 HTTP 持续连接(Keep-Alive)和连接池(Connection Pooling),这些功能在 Session 对象中默认启用。

  • 复用 TCP 连接:在同一个 Session 中,requests 会自动复用 TCP 连接,从而减少连接建立的开销。

    session = requests.Session()
    for _ in range(10):
        response = session.get('https://www.example.com')
        print(response.status_code)
    session.close()
    
  • 使用请求池Session 对象通过连接池来管理连接的复用。默认情况下,requests 在同一会话中会保持 10 个连接。

    session = requests.Session()
    adapter = requests.adapters.HTTPAdapter(pool_connections=10, pool_maxsize=100)
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    
    response = session.get('https://www.example.com')
    print(response.status_code)
    session.close()
    

7 设置请求头

在 HTTP 请求中,头信息(Headers)包含了关于客户端和请求的元数据,如用户代理、授权信息等。你可以通过 headers 参数自定义这些头信息。

headers = {'User-Agent': 'my-app/0.0.1'}
response = requests.get('https://www.example.com', headers=headers)
print(response.request.headers)  # 查看发送的请求头
  • 常见的请求头
    • User-Agent: 标识客户端类型(例如浏览器、爬虫)。
    • Authorization: 用于身份认证(例如 Basic Auth 或 Bearer Token)。
    • Content-Type: 指定请求正文的媒体类型(如 application/json)。

8 使用 Cookies

有些网站在用户登录后会通过 Cookies 保存会话信息。requests 可以通过 cookies 参数来发送自定义的 Cookies,或者通过 response.cookies 来获取服务器返回的 Cookies。

  • 发送 Cookies

    cookies = {'session_id': '123456789'}
    response = requests.get('https://www.example.com', cookies=cookies)
    print(response.text)
    
  • 获取 Cookies

    response = requests.get('https://www.example.com')
    print(response.cookies)
    

9 处理超时和重定向

在发送 HTTP 请求时,有时可能需要设置请求的超时时间或处理重定向的情况。

  • 设置超时时间:通过 timeout 参数设置请求的超时时间,以避免请求卡住。

    try:
        response = requests.get('https://www.example.com', timeout=5)
        print(response.text)
    except requests.Timeout:
        print("请求超时")
    
  • 处理重定向requests 默认会自动处理 HTTP 重定向。如果不希望自动重定向,可以通过 allow_redirects=False 来禁用它。

    response = requests.get('https://www.example.com', allow_redirects=False)
    print(response.status_code)  # 输出重定向前的状态码(通常为 3xx)
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值