杰瑞科技汇

Python requests模块如何高效使用?

requests 是一个为人类设计的、优雅且简单的 HTTP 库,相比于 Python 内置的 urllib 模块,requests 的 API 更加简洁直观,极大地简化了 HTTP 请求的发送和处理过程。


为什么使用 requests

在深入细节之前,先理解为什么 requests 如此受欢迎:

  • 简洁易用:API 设计非常直观,几行代码就能完成复杂的 HTTP 请求。
  • 功能强大:支持 GET、POST、PUT、DELETE、HEAD、OPTIONS 等所有 HTTP 方法。
  • 自动解码:自动处理响应内容的编码(如 gzip, deflate),你无需手动处理。
  • 会话管理:通过 Session 对象,可以跨请求保持某些参数(如 cookies, headers)。
  • JSON 处理:内置了 response.json() 方法,能轻松将 JSON 响应解析为 Python 字典。
  • 完善的文档:拥有非常清晰和详尽的官方文档。

安装 requests

如果你的 Python 环境中还没有安装 requests,可以通过 pip 进行安装:

pip install requests

核心用法:发送请求

requests 的核心就是向指定的 URL 发送 HTTP 请求,并获取服务器的响应,最常用的方法是 requests.get(),但其他方法(如 post, put, delete)的使用方式也完全类似。

1 发送 GET 请求

GET 请求通常用于从服务器获取数据。

import requests
# 目标 URL
url = 'https://api.github.com'
# 发送 GET 请求
response = requests.get(url)
# --- 检查请求是否成功 ---
# response 对象有一个 `status_code` 属性,表示 HTTP 状态码
# 200 表示成功
if response.status_code == 200:
    print("请求成功!")
    # --- 获取响应内容 ---
    # response.text 获取响应的文本内容(str 类型)
    # print(response.text) # 通常是一大段 JSON 或 HTML 文本
    # response.json() 将响应内容直接解析为 Python 字典 (如果响应是 JSON 格式)
    # 这是 requests 最方便的功能之一
    data = response.json()
    print(f"API 返回的版本信息: {data.get('version')}")
    # response.content 获取响应内容的字节形式 (bytes)
    # 适用于下载图片、文件等二进制数据
    # print(response.content)
    # response.headers 获取响应头信息 (一个类字典对象)
    print(f"响应头: {response.headers}")
else:
    print(f"请求失败,状态码: {response.status_code}")

2 发送 POST 请求

POST 请求通常用于向服务器提交数据,例如表单数据、JSON 数据等。

import requests
import json
url = 'https://httpbin.org/post' # 一个用于测试 HTTP 请求的网站
# --- 准备要发送的数据 ---
# 1. 发送表单数据 (application/x-www-form-urlencoded)
# form_data = {'key1': 'value1', 'key2': 'value2'}
# 2. 发送 JSON 数据 (application/json)
json_data = {'name': 'Alice', 'age': 30, 'city': 'New York'}
# 发送 POST 请求
# 使用 `json` 参数会自动将字典转换为 JSON 字符串,
# 并设置正确的 Content-Type 头为 'application/json'
response = requests.post(url, json=json_data)
if response.status_code == 200:
    print("POST 请求成功!")
    # httpbin.org 会将你发送的数据和接收到的数据都返回给你
    response_data = response.json()
    print("服务器收到的 JSON 数据:")
    print(json.dumps(response_data.get('json'), indent=2))
else:
    print(f"POST 请求失败,状态码: {response.status_code}")

请求参数、请求头和 Cookies

在实际开发中,我们经常需要发送自定义的请求头、URL 查询参数和 Cookies。

1 URL 查询参数

使用 params 参数,它会自动将字典转换为 URL 查询字符串。

import requests
url = 'https://httpbin.org/get'
# 要发送的查询参数
params = {
    'query': 'python requests',
    'page': 1,
    'per_page': 10
}
response = requests.get(url, params=params)
if response.status_code == 200:
    print("带参数的 GET 请求成功!")
    # httpbin.org 会将请求的 URL 和参数都返回
    print("最终的请求 URL:", response.json().get('url'))

2 请求头

使用 headers 参数来添加或修改请求头,这对于模拟浏览器、设置认证信息等场景非常重要。

import requests
url = 'https://httpbin.org/get'
# 自定义请求头
headers = {
    'User-Agent': 'My Cool App 1.0',
    'Accept': 'application/json',
    'X-Custom-Header': 'This is a custom value'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
    print("带自定义头的 GET 请求成功!")
    # httpbin.org 会返回你发送的请求头
    print("服务器收到的请求头:", response.json().get('headers'))

3 Cookies

使用 cookies 参数来发送 Cookies。

import requests
url = 'https://httpbin.org/cookies'
# 要发送的 Cookies
cookies_to_send = {
    'session_id': '12345abcde',
    'user_token': 'xyz987'
}
# requests.CookiesJar 也可以用来管理更复杂的 cookies
# from http import cookies
# jar = cookies.SimpleCookie()
# jar['session_id'] = '12345abcde'
# ...
response = requests.get(url, cookies=cookies_to_send)
if response.status_code == 200:
    print("带 Cookies 的 GET 请求成功!")
    # httpbin.org 会返回你发送的 cookies
    print("服务器收到的 Cookies:", response.json().get('cookies'))

高级功能:会话对象 (Session)

Session 对象可以在多个请求之间保持某些参数,cookies,这对于需要登录状态的网站(如爬虫)非常有用。

一个 Session 对象会为你提供一个“会话上下文”,你在这个上下文中发出的所有请求都会共享相同的 cookies。

import requests
# 创建一个 Session 对象
session = requests.Session()
# 1. 首先发送一个请求,获取并保存 cookies (登录)
# 假设登录接口会设置一个 session_id cookie
login_url = 'https://httpbin.org/cookies/set'
login_data = {'session_id': 'my_session_token'}
# 使用 session 发送登录请求
session.post(login_url, data=login_data)
print("登录请求已发送,session 已保存 cookies。")
# 2. 之后的所有请求都会自动带上这个 cookie
protected_url = 'https://httpbin.org/cookies' # 这个接口会返回请求中包含的所有 cookies
response = session.get(protected_url)
if response.status_code == 200:
    print("使用 Session 发起的后续请求成功!")
    print("服务器返回的 Cookies:", response.json().get('cookies'))
    # 你会看到 'session_id': 'my_session_token' 仍然存在
# 如果用普通的 requests.get,则不会有这个 cookie
response_no_session = requests.get(protected_url)
print("\n不使用 Session 的请求返回的 Cookies:", response_no_session.json().get('cookies'))

处理异常

网络请求充满了不确定性,可能会因为各种原因失败(如网络错误、URL 不存在、服务器错误等)。requests 提供了专门的异常类来处理这些情况。

最常用的是 requests.exceptions.RequestException,它是所有 requests 相关异常的基类。

import requests
from requests.exceptions import RequestException, HTTPError, ConnectionError, Timeout
url = 'https://this-url-does-not-exist.com'
try:
    # 设置一个超时时间,防止程序无限等待
    response = requests.get(url, timeout=5) 
    # 如果响应的状态码是 4xx 或 5xx,raise_for_status() 会抛出 HTTPError
    response.raise_for_status() 
except HTTPError as http_err:
    print(f"HTTP 错误发生: {http_err}")
except ConnectionError as conn_err:
    print(f"连接错误发生: {conn_err}")
except Timeout as timeout_err:
    print(f"请求超时: {timeout_err}")
except RequestException as req_err:
    # 捕获所有 requests 相关的异常
    print(f"请求发生错误: {req_err}")
else:
    # 如果没有异常发生,则执行这里的代码
    print("请求成功!")
    print(response.text)

完整示例:爬取一个简单的网页

这个示例综合了 GET 请求、自定义请求头、处理文本和异常。

import requests
from requests.exceptions import RequestException
def fetch_webpage(url):
    """
    爬取指定 URL 的网页内容
    """
    # 设置一个常见的 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'
    }
    try:
        print(f"正在尝试访问: {url}")
        # 发送 GET 请求,设置超时和自定义头
        response = requests.get(url, headers=headers, timeout=10)
        # 如果状态码不是 200,则引发异常
        response.raise_for_status()
        # 获取网页的文本内容
        # requests 会自动根据响应头判断编码 (如 Content-Type 中的 charset)
        # 如果自动判断失败,可以手动指定 encoding=response.apparent_encoding
        html_content = response.text
        return html_content
    except RequestException as e:
        print(f"访问网页时出错: {e}")
        return None
# --- 使用示例 ---
target_url = 'https://www.python.org'
content = fetch_webpage(target_url)
if content:
    print("\n成功获取网页内容!")
    # 打印前 500 个字符
    print(content[:500])
    # 查找 "Download" 字符串出现的位置
    print("\n'Download' 首次出现的位置:", content.find('Download'))

功能 方法/属性 描述
发送请求 requests.get(url), requests.post(url, ...) 发送 HTTP 请求
响应状态 response.status_code 获取 HTTP 状态码 (200, 404, 500...)
response.text 获取响应的文本内容 (自动解码)
response.json() 将 JSON 响应解析为 Python 字典
response.content 获取响应内容的字节形式 (用于二进制文件)
请求参数 requests.get(url, params={'key': 'value'}) 添加 URL 查询参数
请求头 requests.get(url, headers={'User-Agent': '...'}) 添加/修改请求头
Cookies requests.get(url, cookies={'key': 'value'}) 发送 Cookies
会话管理 session = requests.Session() 创建会话对象,用于保持 cookies 和参数
异常处理 try...except requests.exceptions.RequestException 捕获请求过程中的各种错误
超时设置 requests.get(url, timeout=5) 设置请求超时时间(秒)

requests 是 Python 开发者必备的工具之一,掌握它,你就可以轻松地与任何提供 HTTP API 的服务进行交互。

分享:
扫描分享到社交APP
上一篇
下一篇