10.2 Requests库入门


文章目录

  • 前言
  • 一、Requests简介
  • [二、 快速上手](#二、 快速上手)
    • [2.1 发送请求](#2.1 发送请求)
    • [2.2 传递参数](#2.2 传递参数)
    • [2.3 响应内容](#2.3 响应内容)
    • [2.4 自定义请求头](#2.4 自定义请求头)
    • [2.5 重定向与历史记录](#2.5 重定向与历史记录)
    • [2.6 错误与异常处理](#2.6 错误与异常处理)

前言

爬虫本质上是一种自动化程序,它通过模拟客户端向服务器发送网络请求,获取响应数据,并依据预设规则对数据进行解析与存储。在 Python 生态中,提及爬虫便不得不提及其核心库之一 ------ Requests。


一、Requests简介

根据官方文档的描述:

Requests 是唯一一个非转基因的 Python HTTP 库,可供人类安全使用。

警告:非专业使用其他 HTTP 库可能导致危险的副作用,包括但不限于:安全缺陷、冗余代码、重复造轮子、啃文档、抑郁、头痛,甚至死亡。

这段介绍生动地概括了 Requests 库的特点,此处不再赘述。安装方式为在终端中执行命令:pip install requests。

二、 快速上手

2.1 发送请求

首先导入 Requests 模块:

python 复制代码
python
import requests

发起一个 GET 请求获取网页:

python 复制代码
python
r = requests.get('http://xxx.xxx')

此时我们获得了一个 Response 对象 r,可通过它进一步获取响应信息。Requests 提供了直观的 API 来支持常见 HTTP 方法,示例如下:

python 复制代码
python
r = requests.head('http://xxx.xxx/get')
r = requests.post('http://xxx.xxx/post', data={'key': 'value'})
r = requests.put('http://xxx.xxx/put', data={'key': 'value'})
r = requests.delete('http://xxx.xxx/delete')

通常建议为请求设置超时时间,通过 timeout 参数指定(单位为秒):

python 复制代码
python
r = requests.head('http://xxx.xxx/get', timeout=1)

2.2 传递参数

使用 GET 请求时,参数通常以键值对形式附在 URL 问号之后,如 http://xxx.xxx/get?key=val。Requests 支持通过 params 参数以字典形式传入参数:

python 复制代码
python
params = {'key1': 'val1', 'key2': 'val2'}
r = requests.get("http://xxx.xxx/get", params=params)

也支持将列表作为值传入:

python 复制代码
python
params = {'key1': 'val1', 'key2': ['val2', 'val3']}

注:字典中值为 None 的键不会被添加到 URL 查询字符串中。

2.3 响应内容

获取服务器返回的内容,以 https://api.github.com 为例:

python 复制代码
python
import requests
r = requests.get('https://api.github.com')
print(r.text)

# 输出示例:
# {"current_user_url":"https://api.github.com/user","current_user...

访问 r.text 时,Requests 会自动推测编码格式,可通过 r.encoding 查看或修改:

python 复制代码
python
r.encoding = 'GBK'  # 修改编码
  1. 二进制内容
    如图片等二进制数据,可通过 r.content 获取:
python 复制代码
python
from PIL import Image
from io import BytesIO

i = Image.open(BytesIO(r.content))
  1. JSON 内容
    Requests 内置了 JSON 解码器,可方便地解析 JSON 响应:
python 复制代码
python
import requests
r = requests.get('https://api.github.com')
data = r.json()

注意:调用 r.json() 成功并不代表请求成功。某些服务器可能在错误响应中也返回 JSON 数据(如 HTTP 500 错误信息)。因此建议通过 r.status_code(状态码 200 表示成功)或 r.raise_for_status()(成功时返回 None)进一步验证。

2.4 自定义请求头

如需添加请求头,可通过 headers 参数传入字典:

python 复制代码
python
url = 'http://xxx.xxx'
headers = {'user-agent': 'xxx'}
r = requests.get(url, headers=headers)

注意:自定义请求头的优先级低于某些特定配置。例如,若在 .netrc 中设置了认证信息,通过 headers 设置的 Authorization 将不会生效;若使用 auth 参数,则 .netrc 的配置将被覆盖。所有请求头值必须为字符串、字节串或 Unicode(通常不建议使用 Unicode)。

2.5 重定向与历史记录

默认情况下,Requests 会自动处理除 HEAD 外的所有重定向。可通过 history 属性查看重定向历史,该列表按请求时间从晚到早排序:

python 复制代码
python
import requests
r = requests.get('http://github.com')
print(r.history)
# 输出示例:[<Response [301]>]

若需禁用重定向,可在 GET、POST、PUT、DELETE、OPTIONS、PATCH 请求中设置 allow_redirects=False:

python 复制代码
python
r = requests.get('http://xxx.xxx', allow_redirects=False)

2.6 错误与异常处理

网络问题(如 DNS 失败、连接拒绝)会抛出 ConnectionError;

HTTP 返回非成功状态码时,Response.raise_for_status() 会抛出 HTTPError;

请求超时会抛出 Timeout;

超过最大重定向次数会抛出 TooManyRedirects。

所有 Requests 显式抛出的异常均继承自 requests.exceptions.RequestException。


相关推荐
R&ain17 小时前
C++中的深浅拷贝
开发语言·c++
dagouaofei17 小时前
工作计划 PPT 使用 AI 生成,与传统制作方式有什么不同
人工智能·python·powerpoint
hudawei99617 小时前
win和Mac在创建python虚拟环境,启动环境等操作的异同
windows·python·macos·虚拟环境
Fcy64820 小时前
C++ set&&map的模拟实现
开发语言·c++·stl
叫我:松哥20 小时前
基于大数据和深度学习的智能空气质量监测与预测平台,采用Spark数据预处理,利用TensorFlow构建LSTM深度学习模型
大数据·python·深度学习·机器学习·spark·flask·lstm
你怎么知道我是队长1 天前
C语言---枚举变量
c语言·开发语言
李慕婉学姐1 天前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
吃茄子的猫1 天前
quecpython中&的具体含义和使用场景
开发语言·python
じ☆冷颜〃1 天前
黎曼几何驱动的算法与系统设计:理论、实践与跨领域应用
笔记·python·深度学习·网络协议·算法·机器学习