python爬虫 - 深入requests模块

news/2024/10/20 11:47:46/

  🌈个人主页:https://blog.csdn.net/2401_86688088?type=blog
🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html

目录

前言

一、下载网络文件

(一)基本步骤

(二)分段下载大文件

(三)常见问题

二、requests模块处理Cookie

(一)发送带有 Cookies 的请求

(二)从响应中获取 Cookies

(三)Session 对象管理 Cookies

(四)手动设置和修改 Cookies

(五)RequestsCookieJar 转换为字典

(六)字典转换为 RequestsCookieJar

(七)总结

三、重定向与历史请求

(一)重定向的概念

(二)自动重定向

(三)禁止重定向

(四)POST 请求的重定向

(五)重定向链和历史请求

(六)限制重定向次数

(七)总结

四、总结


前言

本文主要介绍了如何使用 Python 的 requests 模块进行网络请求操作,涵盖了从文件下载、Cookie 处理到重定向与历史请求等多个方面。通过详细的示例代码,展示了如何高效地实现各种网络操作,帮助开发者更轻松地进行 HTTP 请求的处理和数据管理。


一、下载网络文件

(一)基本步骤

使用 requests.get() 方法可以发送 HTTP GET 请求,从给定的 URL 下载文件。以下是下载文件的典型步骤:

  1. 发送请求 使用 requests.get() 向文件的 URL 发送请求。

  2. 获取文件内容 响应对象的 content 属性包含文件的二进制数据,可以将其保存到本地文件中。

  3. 保存文件 使用 with open() 创建一个本地文件,将下载的内容写入其中。

示例:

python">import requests# 要下载的文件的 URL
url = 'https://example.com/sample.pdf'# 发送 GET 请求
response = requests.get(url)# 检查请求是否成功
if response.status_code == 200:# 以二进制模式打开一个文件,将文件内容写入本地with open('sample.pdf', 'wb') as file:file.write(response.content)print("文件下载成功")
else:print(f"文件下载失败,状态码:{response.status_code}")

(二)分段下载大文件

如果文件比较大,建议使用分段下载方式。通过 iter_content() 方法,可以避免将整个文件一次性加载到内存中,而是逐块处理数据,适合大文件下载。

示例:

python">import requests# 要下载的文件的 URL
url = 'https://example.com/largefile.zip'# 发送 GET 请求,流式获取文件
response = requests.get(url, stream=True)# 检查请求是否成功
if response.status_code == 200:# 以二进制模式打开一个文件,逐块写入数据with open('largefile.zip', 'wb') as file:for chunk in response.iter_content(chunk_size=1024):if chunk:  # 过滤掉保持活动的空数据块file.write(chunk)print("大文件下载成功")
else:print(f"文件下载失败,状态码:{response.status_code}")

(三)常见问题

常见的问题主要有两个:

1. 超时设置:可以使用 timeout 参数来避免请求长时间挂起。例如:

python">response = requests.get(url, timeout=10)  # 设置10秒超时

2. 错误处理:建议添加异常处理来捕获网络错误。例如:

python">try:response = requests.get(url)response.raise_for_status()  # 检查请求是否成功
except requests.exceptions.RequestException as e:print(f"请求失败:{e}")

二、requests模块处理Cookie

requests 模块可以轻松地处理 HTTP 请求中的 Cookies,包括发送带有 Cookie 的请求和在响应中获取 Cookie。以下是如何使用 requests 模块处理 Cookies 的一些常见方法和操作示例。

(一)发送带有 Cookies 的请求

在发送请求时,可以通过 cookies 参数向服务器发送 Cookie。这个参数接收一个字典形式的 Cookie 数据,其中键是 Cookie 名称,值是 Cookie 的值。

示例:

python">import requests# 定义 Cookies
cookies = {'session_id': '123456','user': 'john_doe'
}# 发送带有 Cookies 的请求
response = requests.get('https://example.com', cookies=cookies)# 打印响应内容
print(response.text)

在这个示例中,session_id 和 user 是发送给服务器的 Cookie。

(二)从响应中获取 Cookies

服务器在响应中也可以返回 Set-Cookie 头,requests 模块会自动将这些 Cookie 存储在 response.cookies 属性中。

示例:

python">import requests# 发送请求
response = requests.get('https://example.com')# 获取响应中的 Cookies
cookies = response.cookies# 遍历 Cookies
for cookie in cookies:print(f"{cookie.name}: {cookie.value}")

response.cookies 是一个 RequestsCookieJar 对象,类似于字典,可以像访问字典那样访问特定的 Cookie。

(三)Session 对象管理 Cookies

使用 requests.Session() 对象时,Cookies 会自动在不同的请求之间保存和发送。这在处理需要登录认证的情况时非常有用,因为 Session 对象可以自动保持会话的状态。

示例:

python">import requests# 创建一个 Session 对象
session = requests.Session()# 第一次请求,可能会设置 Cookies(例如登录)
response = session.get('https://example.com/login')# 在后续的请求中,Cookies 会自动发送
response = session.get('https://example.com/dashboard')# 查看当前 Session 中的 Cookies
print(session.cookies)

在这个示例中,session 对象会自动管理从响应中接收到的 Cookies,并在后续请求中发送它们。这样,可以保持一个会话(如登录后的状态)。

(四)手动设置和修改 Cookies

如果想手动管理 Session 对象的 Cookies,可以通过 session.cookies.set() 方法来设置或修改 Cookies。

示例:

python">import requests# 创建一个 Session 对象
session = requests.Session()# 设置一个新的 Cookie
session.cookies.set('my_cookie', 'cookie_value')# 发送请求,并自动附带这个 Cookie
response = session.get('https://example.com')# 打印响应内容
print(response.text)

(五)RequestsCookieJar 转换为字典

response.cookies 返回的是一个 RequestsCookieJar 对象,可以将其转换为一个普通的字典,便于后续处理。

示例:

python"># 将 Cookies 转换为字典
cookies_dict = requests.utils.dict_from_cookiejar(response.cookies)print(cookies_dict)

(六)字典转换为 RequestsCookieJar

可以将一个字典转换为 RequestsCookieJar,这样可以方便地管理 Cookie。

示例:

python">from requests.cookies import cookiejar_from_dict# 定义 Cookies 字典
cookies_dict = {'session_id': '123456', 'user': 'john_doe'}# 将字典转换为 RequestsCookieJar
jar = cookiejar_from_dict(cookies_dict)# 发送请求时使用这个 CookieJar
response = requests.get('https://example.com', cookies=jar)

(七)总结

  • 发送 Cookie: 通过 cookies 参数传递字典。

  • 获取 Cookie: 通过 response.cookies 获取服务器返回的 Cookie。

  • 自动管理 Cookie: 使用 requests.Session() 可以在多个请求间自动管理 Cookie。

  • 手动设置和修改: 通过 session.cookies.set() 手动设置 Cookies。

  • 转换 CookieJar 和字典: requests.utils.dict_from_cookiejar()requests.cookies.cookiejar_from_dict() 方法可以互相转换。


三、重定向与历史请求

重定向 和 历史请求 是常见的网络请求处理需求。requests 模块默认会自动处理 HTTP 重定向,并且提供了查看重定向历史的功能。

(一)重定向的概念

重定向是指服务器告诉客户端当前请求的资源已经移动到另一个 URL,客户端需要访问新的 URL。常见的重定向状态码包括:

  • 301 Moved Permanently: 永久重定向,资源已永久搬迁到新的 URL。

  • 302 Found: 临时重定向,资源临时搬迁,但客户端应继续使用原始 URL。

  • 303 See Other: 告诉客户端请求的资源可以在另一个 URL 处使用 GET 请求获取。

  • 307 Temporary Redirect: 请求资源临时搬迁,客户端应保留请求方法和数据。

  • 308 Permanent Redirect: 类似于 301,但客户端必须使用相同的请求方法。

(二)自动重定向

requests 模块默认会自动处理重定向。如果服务器返回一个 3xx 响应,requests 会跟随 Location 头中的新 URL 进行重定向。你可以通过 response.history 查看重定向链中的所有请求。

示例:

python">import requests# 发送一个可能发生重定向的请求
response = requests.get('http://example.com')# 打印最终响应的 URL
print(f"最终的 URL: {response.url}")# 检查重定向历史
if response.history:print("发生了重定向")for resp in response.history:print(f"状态码: {resp.status_code}, URL: {resp.url}")
else:print("没有发生重定向")

在这个例子中,response.history 是一个包含重定向历史的列表,包含每次重定向的响应对象,最终的响应会保存在 response 中。

(三)禁止重定向

如果不希望自动跟随重定向,可以通过 allow_redirects=False 禁用重定向。在这种情况下,requests 会返回重定向响应,但不会继续跟随。

示例:

python">import requests# 禁止自动重定向
response = requests.get('http://example.com', allow_redirects=False)# 查看响应状态码和重定向的 URL
print(f"状态码: {response.status_code}")
if response.is_redirect or response.status_code in [301, 302, 303, 307, 308]:print(f"重定向的 URL: {response.headers['Location']}")

如果服务器返回重定向状态码(如 301 或 302),Location 头部中将包含重定向的新 URL,requests 将返回此信息而不会自动发起新的请求。

(四)POST 请求的重定向

当发送 POST 请求时,如果遇到 302 或 303 重定向,requests 会自动将方法更改为 GET,以符合 HTTP 规范。

示例:

python">import requests# 发送一个 POST 请求,并触发重定向
response = requests.post('http://example.com/login', data={'username': 'user', 'password': 'pass'})# 打印重定向后的请求方法
if response.history:print(f"重定向后使用的请求方法: {response.request.method}")

在这种情况下,POST 请求可能会被重定向为 GET 请求。

(五)重定向链和历史请求

可以通过 response.history 来查看每一次重定向的状态码和 URL,以跟踪整个请求链。

示例:

python">import requests# 发送一个可能发生多次重定向的请求
response = requests.get('http://example.com')# 打印重定向链中的每个请求信息
for resp in response.history:print(f"状态码: {resp.status_code}, URL: {resp.url}, 请求方法: {resp.request.method}")

(六)限制重定向次数

requests 模块默认允许最多 30 次重定向。如果需要限制重定向次数,可以通过 max_redirects 参数来控制。

示例:

python">import requests# 限制最多重定向次数为 5
response = requests.get('http://example.com', max_redirects=5)# 查看响应状态码
print(f"最终的状态码: {response.status_code}")

如果重定向次数超过了设置的限制,requests 会抛出 TooManyRedirects 异常。

(七)总结

  • 自动重定向: requests 默认会自动处理 3xx 重定向,并可通过 response.history 查看重定向链。

  • 禁止重定向: 使用 allow_redirects=False 禁止自动重定向。

  • POST 请求重定向: 如果遇到 302 或 303 状态码,POST 请求会自动转换为 GET 请求。

  • 历史请求: 通过 response.history 获取每次重定向的状态码、URL 和请求方法,了解请求过程。

  • 限制重定向次数: 可以通过 max_redirects 限制最大重定向次数,防止陷入无限重定向循环。


四、总结

通过 requests 模块,开发者可以轻松实现文件下载、Cookie 自动管理以及处理重定向和历史请求。本文通过清晰的步骤和代码示例,展示了如何处理常见的网络请求需求,并提供了应对大文件下载、请求超时及多次重定向等复杂场景的解决方案,使网络编程变得更加简单和高效。


http://www.ppmy.cn/news/1538692.html

相关文章

【C++几种单例模式解读及实现方式】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、单例是什么?二、解读1.懒汉式2.饿汉式3.static变量特性4.call_once特性 总结 前言 单例模式几乎是每种语言都不可少的一种设计模式&#xff0c…

Redis 典型应用之缓存

目录 1. 缓存的基本概念 2. 使用 Redis 作为缓存 3. 缓存的更新策略 3.1 定期生成 3.2 实时生成 3.2.1 内存淘汰策略 1. FIFO (First In First Out) 先进先出 2. LRU (Least Recently Used) 淘汰最久未使使用的 3. LFU (Least Frequently Used) 淘汰访问次数最少的 4…

【uni-app】HBuilderX安装uni-ui组件

目录 1、官网找到入口 2、登录帐号 3、打开HuilderX 4、选择要应用的项目 5、查看是否安装完成 6、按需安装 7、安装完毕要重启 8、应用 前言:uniapp项目使用uni-ui组件方式很多,有npm安装等,或直接创建uni-ui项目,使用un…

操作系统15

设备分配与回收 1.数据结构:系统设备表、设备控制表、控制器控制表、通道控制表 2.分配原则 (1)要充分发挥设备的使用率,尽可能让设备忙碌,但又避免由于不合理的分配方法造成的死锁 (2)要做到…

报错 - llama-index pydantic error | arbitrary_types_allowed | PydanticUserError

国庆节前使用 LiteLLMEmbedding 设置 llama-index Settings.embed_model 还好好的,回来后,就就报错,试着降级 llama-index 也无用;设置 Settings.llm 也是好好地。 解决方法:conda 重新创建环境后,在安装 …

CVPR 2024最佳论文候选-pixelSplat论文解读

目录 一、概述 二、相关工作 1、单场景下的视角合成 2、基于先验的三维重建和视图合成 3、多视图几何测量 三、3DGS的缺点 1、容易陷入最小值 2、需要大量输入图像 3、尺度模糊性 四、pixelSplat 1、解决尺度模糊性(深度信息生成) 2、编码器…

计算机挑战赛4

对于给定的十进制整数N(N<100000)&#xff0c;将1到N(含N)之间的每个整数转成八进制&#xff0c;求转换后的所有八进制数中含7的总个数。 提示:某个数的八进制含7的个数可以参照下面的例子: 对于整数127&#xff0c;对应的八进制为177&#xff0c;其含7的个数为2。 输入说明…

C# 字符串(string)三个不同的处理方法:IsNullOrEmpty、IsInterned 、IsNullOrWhiteSpace

在C#中&#xff0c;string.IsNullOrEmpty、string.IsInterned 和 string.IsNullOrWhiteSpace 是三个不同的字符串处理方法&#xff0c;它们各自有不同的用途&#xff1a; 1.string.IsNullOrEmpty&#xff1a; 这个方法用来检查字符串是否为null或者空字符串&#xff08;"…