python爬虫 - 深入requests模块

  🌈个人主页: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() 创建一个本地文件,将下载的内容写入其中。

示例:

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() 方法,可以避免将整个文件一次性加载到内存中,而是逐块处理数据,适合大文件下载。

示例:

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 参数来避免请求长时间挂起。例如:

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

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

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 的值。

示例:

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 属性中。

示例:

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 对象可以自动保持会话的状态。

示例:

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。

示例:

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 对象,可以将其转换为一个普通的字典,便于后续处理。

示例:

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

(六)字典转换为 RequestsCookieJar

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

示例:

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 查看重定向链中的所有请求。

示例:

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 会返回重定向响应,但不会继续跟随。

示例:

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 规范。

示例:

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,以跟踪整个请求链。

示例:

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 参数来控制。

示例:

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.rhkb.cn/news/443681.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型部署-​Ollama+WebUI

Ollama(安装包和安装文档文末领取!) Ollama 简介 主要特点: 易于使用:它提供了一个简洁的界面和命令行工具,使得用户可以方便地管理和运行不同的大语言模型。 多种模型支持:可以运行多种开源…

介绍一款开源的 Modern GUI PySide6 / PyQt6的使用

首先附上大神的开源地址(自行克隆吧): https://github.com/Wanderson-Magalhaes/Modern_GUI_PyDracula_PySide6_or_PyQt6 步骤一:安装PySide6库 pip install PySide6 步骤二:运行main文件 python main.py 就得…

Windows 11 24H2版本有哪些新功能_Windows 11 24H2十四大新功能介绍

距离上次发布的23H2版本已经过去了一年时间,现在,Win 11的24H2版本终于等到了,微软已经全面公开发布Win11 24H2版本,版本号为26100.1742,此次官宣的版本包括了消费者版、商业版、LTSC 2024版等,各种语言版本…

python使用装饰器来统计函数被调用次数、格式化dict以及Python-smtplib邮件发送的IP name possibly forged问题解决

一、python调试:使用装饰器来统计函数被调用次数及格式化dict 喜欢调试的时候显示数据并显示一些其它的信息,比如区分是哪次调用的调试信息,比如友好的显示dict等相对复杂的数据类型,所以这里涉及到两个方面。一是统计函数被调用次…

【计算机网络】网络相关技术介绍

文章目录 NAT概述NAT的基本概念NAT的工作原理1. **基本NAT(静态NAT)**2. **动态NAT**3. **NAPT(网络地址端口转换,也称为PAT)** 底层实现原理1. **数据包处理**2. **转换表**3. **超时机制** NAT的优点NAT的缺点总结 P…

大模型微调十诫:关于将微调模型部署到生产环境的十条建议

转自NLP工程化 大模型微调十诫:关于将微调模型部署到生产环境的十条建议: (1)不要盲目微调模型,先尝试使用提示的方式满足需求。只有当提示无法达到质量、性能或成本目标时,才考虑微调。 (2&…

RabbitMQ延迟队列

1场景: 1.下单之后,给10分钟时间进行支付,如果10分钟后,没有支付,订单取消。(可以使用队列的ttl,因为所有的消息都是一样的停留时长10分钟) 2.定时发布文章(要求4月1号…

MPA-SVM多变量分类预测|海洋捕食者优化算法-支持向量机|Matalb

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、算法介绍: 四、完整程序下载: 一、程序及算法内容介绍: 基本内容: 本代码基于Matlab平台编译&…

JavaScript 数组简单学习

目录 1. 数组 1.1 介绍 1.2 基本使用 1.2.1 声明语法 1.2.2 取值语法 1.2.3 术语 1.3 案例 1. 数组 1.1 介绍 1.2 基本使用 1.2.1 声明语法 1.2.2 取值语法 1.2.3 术语 1.3 案例

基于java+springboot的旅游信息网站、旅游景区门票管理系统设计与实现

该系统是基于javaspringboot开发的旅游景区门票管理系统。是给师弟开发的大四实习作品。学习过程中,遇到问题可以咨询github作者。 演示地址 前台地址: http://travel.gitapp.cn 后台地址: http://travel.gitapp.cn/admin 后台管理帐号&am…

植物大战僵尸修改器-MFC

创建项目 创建mfc应用 基于对话框 打开资源视图下的 IDD_MFCAPPLICTION2_DIALOG 限制对话框大小 将属性中Border的值改为对话框外框 删除对话框中原有的控件 属性-外观-Caption 设置对话框标题 工具箱中拖放一个按钮 修改按钮名称 将按钮ID改为IDC_COURSE 在MFCApplication2…

Fiddler配合wireshark解密ssl

环境: win11(wireshark)--虚拟机win7(Fiddler)---虚拟机win7(HTTPS站点) 软件安装问题: 需要.net环境,NDP461-KB3102436-x86-x64-AllOS-ENU.exe。 安装fiddler后安装下…

Golang通用代码生成器:仙童,电音仙女尝鲜版十二,为售前准备的哑数据模式

Golang通用代码生成器:仙童,电音仙女尝鲜版十二,为售前准备的哑数据模式 哑数据模式是一种使用内存数据的为快速原型准备的模式。专门为售前,产品经理和项目经理准备。Golang通用代码生成器支持此种模式,请见视频:https://www.bi…

【Qt+Python项目构建】- 02 Qt creator 14.0 + PySide6 如何让图像控件的尺寸变化和窗口一致

前言:【这是个AI不会回答的问题】 Qt Creator 新的版本又发出了,Pyside6 有很多新功能。但是,一些传统的方法要被淘汰了。 一个经典的例子是: 我有个一个图像要显示在Form里面的图像控件上,OK, 我现在拖…

HarmonyOs 查看官方文档使用弹窗

1. 学会查看官方文档 HarmonyOS跟上网上的视频学习一段时间后,基本也就入门了,但是有一些操作网上没有找到合适教学的视频,这时,大家就需要养成参考官方文档的习惯了,因为官方的开发文档是我们学习深度任何一门语言或…

AI资深导师指导-ChatGPT深度科研工作应用、论文撰写、数据分析及机器学习与AI绘图

2022年11月30日,可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5,将人工智能的发展推向了一个新的高度。2023年4月,更强版本的ChatGPT4.0上线,文本、语音、图像等多模态交互方式使其在…

嵌入式硬件设计中EDA布局与布线实现

大家好,今天主要给大家分享一下,如何使用立创EDA进行布局和布线,具体实现过程如下: 第一:PCB概念介绍 在介绍PCB的时候,先来说明一下,电子管的发明史。 贝尔在1876年发明了电话,爱迪生1879年发明了白炽灯、特斯拉于1888年发明了电动机,所有这些,都为电子学的诞生准…

如何修改银河麒麟高级服务器操作系统修改网卡名称(如从ens33到eth0)

如何修改银河麒麟高级服务器操作系统修改网卡名称(如从ens33到eth0) 💖The Begin💖点点关注,收藏不迷路💖 查找并修改配置文件: 使用ifconfig查看网卡名称(如enp1s0)。找…

计算机网络实验一:组建对等网络

实验一 组建对等网络 实验要求: 1. 组建对等网络,会在命令行使用ipconfig,两网络能够相互ping通,尝试netstat 命令 2. 建立局域网共享文件夹 3. 安装packet tracer,模拟组建对等网并测试对等网 1、组建对等网络 连…

HAL+M4学习记录_4

一、按键 记录学习使用HAL库读取板载按键输入键值 板载三颗按键,引脚配置如下 其中K_UP按键按下为高电平,那么PA0引脚要配置为下拉模式;K0和K1按下为低电平,那么PE4和PE3引脚要配置为上拉模式。 二、通过按键控制LED 这里实现的…