当前位置:首页 > 技术 > 正文内容

Python requests库核心用法指南

访客 技术 2026年7月12日 2

概述

本文基于requests官方文档的快速入门部分进行整理,requests版本为2.31.0。requests是Python中常用的HTTP客户端库,用于发送各类HTTP请求并处理响应数据。

Response对象解析

当执行HTTP请求(如GET、POST等)成功后,返回的对象是一个Response实例,其类型为requests.Response。该对象包含了服务器返回的各种信息,我们可以通过其属性和方法进行解析。

获取请求的实际URL

import requests

response = requests.get('https://www.google.com')
print(response.url)  # 输出最终解析后的URL地址

检查响应状态码

response = requests.get('https://www.google.com')
print(response.status_code)  # 输出HTTP状态码,如200、404等

处理文本响应内容

当服务器返回文本格式的数据时,可以使用text属性进行解析。requests会自动根据HTTP响应头中的信息推测合适的编码方式。

response = requests.get('https://www.example.com')
print(response.encoding)  # 查看当前使用的编码方式
response.encoding = 'utf-8'  # 手动设置编码
print(response.text)  # 获取解码后的文本内容

注意:修改encoding属性后,后续访问text属性将使用新的编码值。

处理二进制响应内容

response = requests.get('https://www.example.com/image.png')
print(type(response.content))  # 输出: <class 'bytes'>
print(len(response.content))  # 获取字节长度

解析JSON格式响应

response = requests.get('https://api.github.com/users/octocat')
data = response.json()  # 返回Python字典对象
print(data['login'])  # 访问JSON中的特定字段

注意:json()方法返回的是Python对象,若需要转换为JSON字符串,需使用json.dumps()

获取原始套接字响应

在极少数场景下,如果需要直接获取服务器返回的原始字节流,可以访问raw属性,但需要设置stream=True参数。

response = requests.get('https://www.example.com', stream=True)
print(response.raw.read(10))  # 读取前10个字节

响应头处理

获取服务器返回的响应头

response = requests.post('https://httpbin.org/post')
print(response.headers)  # 输出所有响应头信息
print(response.headers.get('Content-Type'))  # 获取特定响应头

获取请求时发送的Headers

response = requests.get('https://httpbin.org/get')
print(response.request.headers)  # 查看发送请求时的headers

获取请求的详细信息

response = requests.get('https://httpbin.org/get')
print(response.request.method)  # 请求方法:GET、POST等
print(response.request.url)     # 请求URL
print(response.request.body)    # 请求体内容

请求头设置

可以为HTTP请求添加自定义的请求头,只需传递一个字典给headers参数即可。

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    'Accept-Language': 'zh-CN,zh;q=0.9',
}

response = requests.get('https://www.example.com', headers=headers)

请求参数设置

URL查询参数(GET请求)

对于GET请求,参数通常附加在URL的问号后面。requests提供了便捷的params参数来处理参数编码。

params = {
    'keyword': 'python',
    'page': 1,
    'size': 20
}

response = requests.get('https://www.example.com/search', params=params)
print(response.url)  # https://www.example.com/search?keyword=python&page=1&size=20

表单数据(POST请求)

提交表单数据时,将参数字典传递给data参数,数据会被编码为form-data格式。

data = {
    'username': 'testuser',
    'password': '123456'
}

response = requests.post('https://httpbin.org/post', data=data)

当某个键对应多个值时,可以采用以下方式:

data = [
    ('key', 'value1'),
    ('key', 'value2'),
]
response = requests.post('https://httpbin.org/post', data=data)

JSON格式数据(POST请求)

发送JSON格式的数据有两种方式:

方式一:手动转换为JSON字符串

import json

payload = {'name': 'Alice', 'age': 25}
response = requests.post(
    'https://httpbin.org/post',
    data=json.dumps(payload),
    headers={'Content-Type': 'application/json'}
)

方式二:使用json参数(推荐,requests 2.4.2+)

payload = {'name': 'Alice', 'age': 25}
response = requests.post('https://httpbin.org/post', json=payload)

requests会自动将payload序列化为JSON,并设置正确的Content-Type头。

注意:如果同时传递了data或files参数,json参数将被忽略。

Cookie处理

发送Cookie

方式一:使用字典传递Cookie

cookies = {
    'session_id': 'abc123',
    'user_preference': 'dark_mode'
}

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

方式二:使用RequestsCookieJar(适用于跨域名场景)

import requests.cookies

jar = requests.cookies.RequestsCookieJar()
jar.set('site_cookie', 'value1', domain='example.com', path='/')
jar.set('another_cookie', 'value2', domain='www.example.com', path='/')

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

读取响应中的Cookie

response = requests.get('https://www.example.com')
print(response.cookies)  # 获取所有Cookie(RequestsCookieJar类型)

# 访问特定Cookie
session_cookie = response.cookies.get('session_id')
print(session_cookie)

超时设置

设置超时时间后,如果在指定时间内未收到任何响应数据,requests将抛出异常而不会无限等待。

# 设置5秒超时
response = requests.get('https://www.example.com', timeout=5)

超时参数说明:

  • 超时时间与数据传输所需时间无关
  • 只要在设定时间内收到了响应(无论数据量大小),就不会触发超时
  • 超时是针对服务端响应的首字节到达时间
try:
    response = requests.get('https://slow-server.example.com', timeout=3)
except requests.exceptions.ConnectTimeout:
    print('连接超时,服务器未在规定时间内响应')

错误与异常处理

requests库中所有异常都继承自requests.exceptions.RequestException

ConnectionError(连接错误)

网络连接失败、DNS解析失败或服务器无法连接时抛出。

import requests
from requests.exceptions import ConnectionError

try:
    response = requests.get('https://this-domain-does-not-exist.xyz')
except ConnectionError as e:
    print(f'连接错误: {e}')

HTTPError(HTTP错误)

当响应状态码为4xx(客户端错误)或5xx(服务器错误)时,可以通过raise_for_status()手动触发异常。

response = requests.get('https://httpbin.org/status/404')

if response.status_code >= 400:
    try:
        response.raise_for_status()
    except requests.exceptions.HTTPError as e:
        print(f'HTTP错误: {e}')

Timeout(超时错误)

请求超时时会抛出Timeout异常。

import requests
from requests.exceptions import Timeout

try:
    response = requests.get('https://slow-server.example.com', timeout=2)
except Timeout:
    print('请求超时,服务器响应时间过长')

TooManyRedirects(重定向过多)

当请求超过最大重定向次数时抛出。

import requests
from requests.exceptions import TooManyRedirects

try:
    response = requests.get('https://httpbin.org/redirect/10', max_redirects=5)
except TooManyRedirects:
    print('重定向次数超过限制')

完整的异常处理示例

import requests
from requests.exceptions import (
    RequestException,
    ConnectionError,
    HTTPError,
    Timeout,
    TooManyRedirects
)

def safe_request(url, **kwargs):
    try:
        response = requests.get(url, **kwargs)
        response.raise_for_status()
        return response
    except ConnectionError:
        print('网络连接失败')
    except HTTPError as e:
        print(f'HTTP错误: {e}')
    except Timeout:
        print('请求超时')
    except TooManyRedirects:
        print('重定向次数过多')
    except RequestException as e:
        print(f'请求失败: {e}')
    return None

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。