【Python爬虫开发基础⑫】requests库概述(文件上传、cookies处理、状态码处理、异常处理等)

news2024/9/25 7:18:56

🚀个人主页:为梦而生~ 关注我一起学习吧!
💡专栏:python网络爬虫从基础到实战 欢迎订阅!后面的内容会越来越有意思~
💡往期推荐
⭐️前面比较重要的基础内容
【Python爬虫开发基础⑦】urllib库的基本使用
【Python爬虫开发基础⑧】XPath库及其基本用法
【Python爬虫开发基础⑨】jsonpath和BeautifulSoup库概述及其对比
【Python爬虫开发基础⑩】selenium概述
【Python爬虫开发基础⑪】requests库概述(GET和POST请求)
⭐️爬虫的实战文章
【Python爬虫开发实战①】使用urllib以及XPath爬取可爱小猫图片
【Python爬虫开发实战②】使用urllib以及jsonpath爬取即将上映电影信息
大家可以复制代码感受一下爬虫的魅力~
💡本期内容:上一篇文章我们简单的介绍了requests库,这一篇文章我们接着讲~


文章目录

  • 1 文件上传
  • 2 cookies处理
  • 3 状态码处理
  • 4 异常处理


1 文件上传

使用 requests 库进行文件上传非常方便。可以通过传递一个 files 参数来指定要上传的文件。

import requests

# 设置上传的文件路径和目标 URL
file_path = 'path/to/file.jpg'
url = 'https://api.example.com/upload'

# 创建文件对象,并设置文件名和文件内容类型
files = {'file': open(file_path, 'rb')}

# 发送 POST 请求并上传文件
response = requests.post(url, files=files)

# 检查响应状态码
if response.status_code == 200:
    # 获取响应内容(文本格式)
    content = response.text
    print(f'Response content: {content}')
else:
    print('Failed to upload file. Status code:', response.status_code)

在上述示例代码中,我们首先指定了要上传的文件路径 file_path 和目标 URL url。然后,创建了一个 files 字典,其中键为 'file',值为使用 open() 函数打开文件对象。注意,这里需要将文件以二进制模式打开 ('rb')

接下来,我们使用 requests.post() 方法发送 POST 请求,并通过参数 files=files 来指定要上传的文件。

最后,我们检查响应状态码是否为 200,如果成功,则获取响应内容并打印出来。如果上传失败,则打印相应的错误信息和状态码。

注意:可以根据实际需求对文件上传进行更多的定制,例如设置文件名、文件类型等。requests 库提供了丰富的选项来满足不同的文件上传需求。可以根据具体情况进行相应的设置,并将文件对象以适当的方式传递给 requests.post() 方法。


2 cookies处理

在使用 requests 库发送网络请求时,可以方便地处理和管理 cookies。Cookies 是服务器存储在用户浏览器中的数据,用于跟踪用户会话和存储用户信息。requests 库提供了一些方法来处理和操作 cookies。

  • 获取 cookies: 可以使用 response.cookies 属性获取响应中的 cookies。它返回一个 RequestsCookieJar 对象,可以通过索引或属性名访问特定的 cookie 值。

  • 发送 cookies: 可以通过传递 cookies 参数将 cookies 添加到请求中。cookies 参数可以是一个字典,其中键为 cookie 名称,值为 cookie 值。

  • 保存 cookies: 通过设置 session 属性为 True,可以创建一个会话对象,该对象将自动保存和管理 cookies。在后续请求中,会话对象会自动发送之前收到的 cookies,并接收和更新新的 cookies。

示例代码

import requests

# 发送 GET 请求并获取 cookies
response = requests.get('https://api.example.com')
cookies = response.cookies

# 将 cookies 添加到后续请求中
url = 'https://api.example.com/data'
response = requests.get(url, cookies=cookies)

# 创建会话对象,并保存 cookies
session = requests.Session()
response = session.get('https://api.example.com/login')

# 做其他操作,会话对象会自动发送和接收 cookies
response = session.get('https://api.example.com/profile')

在上述示例代码中,我们首先发送一个 GET 请求并获取响应中的 cookies。通过 response.cookies 属性可以获得一个 RequestsCookieJar 对象,其中包含了响应中的 cookies。

接下来,我们将 cookies 添加到后续请求中,通过 cookies=cookies 参数传递给 requests.get() 方法。这样,在发送请求时会自动带上之前收到的 cookies。

另外,我们还创建了一个会话对象 session,通过 requests.Session() 创建。会话对象会自动保存和管理 cookies。在后续的请求中,直接使用会话对象发送请求,会话对象会自动发送和接收 cookies。

注意:需要注意的是,如果没有指定会话对象或手动处理 cookies,requests 库默认会将每个请求视为相互独立的,不会自动处理 cookies。

cookie从需要在开发者工具的抓包中找:
在这里插入图片描述


3 状态码处理

requests 库提供了一种简便的方式来处理 HTTP 请求的响应状态码。在发送请求后,可以通过访问 response.status_code 属性来获取响应的状态码,并根据状态码进行相应的处理。

以下是一些常见的 HTTP 状态码和其含义:

状态码意义
200 OK请求成功,信息在返回的响应报文中
201 Created请求成功,并在服务器上创建了新资源
204 No Content请求成功,但响应中没有返回任何内容
301 Moved Permanently请求的对象已经被永远的转移了,新的URL定义在响应报文的Location,首部行中,客户软件将自动获取新的URL
400 Bad Request一个通用的差错代码,指示该请求不能被服务器理解
401 Unauthorized请求未被授权,需要提供有效的身份验证信息
403 Forbidden请求被服务器拒绝,通常是因为权限不足
404 Not Found被请求的文档不在服务器上
500 Internal Server Error服务器内部发生错误,无法完成请求
505 HTTP Version Not Supported服务器不支持请求报文使用的HTTP协议版本

示例代码

import requests

# 发送 GET 请求
response = requests.get('https://api.example.com')

# 获取响应状态码
status_code = response.status_code

# 根据状态码进行处理
if status_code == 200:
    print('Request successful')
elif status_code == 404:
    print('Page not found')
elif status_code == 500:
    print('Internal Server Error')
else:
    print('Unexpected status code:', status_code)

在上述示例代码中,我们发送了一个 GET 请求到 'https://api.example.com'。然后,通过访问 response.status_code 来获取响应的状态码,并将其赋值给变量 status_code

接下来,我们使用条件语句对不同的状态码进行处理。以常见的状态码为例,如果状态码为 200,则表示请求成功,我们打印出相应的成功信息。如果状态码为 404,则表示页面未找到,我们打印出相应的错误信息。如果状态码为 500,则表示服务器内部错误,同样打印出相应的错误信息。对于其他未预料到的状态码,我们打印出无法识别的状态码信息。

注意:状态码的具体含义可能根据不同的 HTTP 协议版本和服务器实现有所差异。因此,在实际应用中,可能需要参考相应的文档或规范来了解每个状态码的含义,并根据具体情况进行适当处理。


4 异常处理

requests 库提供了一套完善的异常处理机制,用于捕获和处理与网络请求相关的异常。当发生异常时,可以通过捕获 requests.exceptions.RequestException 异常来处理,并根据不同的异常类型进行相应的操作。

import requests
from requests.exceptions import RequestException

try:
    # 发送 GET 请求
    response = requests.get('https://api.example.com')

    # 检查响应状态码
    response.raise_for_status()

    # 处理响应数据
    data = response.json()
    print('Response data:', data)

except requests.exceptions.HTTPError as err:
    print('HTTP Error:', err)

except requests.exceptions.ConnectionError as err:
    print('Connection Error:', err)

except requests.exceptions.Timeout as err:
    print('Timeout Error:', err)

except requests.exceptions.RequestException as err:
    print('Error occurred:', err)

在上述示例代码中,我们首先尝试发送一个 GET 请求到 'https://api.example.com'。然后,使用 response.raise_for_status() 方法检查响应的状态码,如果状态码表明请求失败,将会抛出 requests.exceptions.HTTPError 异常。

try 语句块中,我们通过多个 except 子句来捕获和处理不同类型的异常。例如,如果发生连接错误(如网络连接问题、DNS 错误等),将抛出 requests.exceptions.ConnectionError 异常;如果发生超时错误,将抛出 requests.exceptions.Timeout 异常。

最后,我们使用 requests.exceptions.RequestException 来捕获其他的请求异常,这包括 HTTPErrorConnectionErrorTimeout 以及其他未明确定义的异常类型。在这个异常处理块中,可以打印出发生的异常信息,或者根据实际需求进行相应的错误处理。

注意:捕获 RequestException 异常将会捕获所有与请求相关的异常,因此它应该作为捕获异常的基类。如果你只想捕获特定类型的异常,可以将其放在更具体的子类异常之前。

通过合理的异常处理,可以增加代码的健壮性和可靠性,并提供有用的错误信息和反馈给用户。在实际使用中,可以根据具体的场景和需求,进一步处理异常、记录日志、重试请求或采取其他适当的措施。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/738826.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据平台之数仓模型设计

文章目录 前言一、维度建模基本概念1.1 事实表1.2 维度表 二、维度建模三种模式2.1 星型模型2.2 雪花模式2.3 星座模式 三、ChatGPT代替Sql Boy3.1 简单案例3.2 复杂案例 四、总结 前言 看到几篇不错的文章,自己总结合并了分享给小伙伴 金博尔和恩门共同开创的数仓…

vue项目 设置启动时自动运行到电脑默认浏览器中

相信大家很多参与企业开发会发现 别人搭建的vue项目都会自动启动在电脑的默认浏览器上 这个其实React项目自己就会有 但是 vue项目我们需要自己设置一下 在根目录的 vue.config.js 将devServer下 设置 open: true 参考代码如下 module.exports {devServer: {open: true} }这样…

机器学习30:《推荐系统-III》使用 TensorFlow 构建电影推荐系统

本文将介绍基于 MovieLens 数据集创建一个电影推荐系统的方法。具体而言,包括探索电影数据,训练矩阵分解模型,检查嵌入,矩阵分解中的正则化,Softmax 模型训练等内容。 目录 1.准备工作 1.1 导入依赖模块 1.2 加载数…

LeetCode 1107.每日新用户统计

数据准备 Create table If Not Exists Traffic (user_id int, activity ENUM(login, logout, jobs, groups, homepage), activity_date date); Truncate table Traffic; insert into Traffic (user_id, activity, activity_date) values (1, login, 2019-05-01); insert into …

Charles抓包map local后出现“failed: unacceptable content-type: text/plain“

Charles 抓包map local 修改 映射到本地数据 出现如下报错 返回ErrorUrlhttps://xxxx 返回ErrorError Domaincom.alamofire.error.serialization.response Code-1016 "Request failed: unacceptable content-type: text/plain" UserInfo{NSLocalizedDescriptionRequ…

邮票面值-2022年全国青少年信息素养大赛Python国赛第5题

[导读]:超平老师计划推出《全国青少年信息素养大赛Python编程真题解析》50讲,这是超平老师解读Python编程挑战赛真题系列的第7讲。 全国青少年信息素养大赛(原全国青少年电子信息智能创新大赛)是“世界机器人大会青少年机器人设计…

适配理想全系车型,OPPO首创手表无感蓝牙车钥匙系统

OPPO 宣布与理想汽车深度合作,首家推出系统级手表无感蓝牙车钥匙功能,适配理想全系列车型。此功能早已适配 OPPO 手机。仅支持 OPPO Watch 2、OPPO Watch 3 和 OPPO Watch SE 系列,可独立使用,无需手机即可控制车辆。 OPPO首发数字…

Python:创建一个满足高斯分布的立方体

算法说明: (1)首先定义一个中心点坐标 center,标准差 sigma 和峰值 amplitude。 (2)然后通过计算每个点到中心点的欧氏距离,并将欧氏距离应用于高斯分布的公式 amplitude * exp(-distances**2 /…

tcp转发服务桥(windows)

目的 目的是为了在网关上转发udp数据和tcp数据。对于网络里面隔离的内网来说,有一台可以上网的服务器,那么通过两块网卡就可以转发出去,在服务器上进行数据的转发,有tcp和udp两种,udp已经写过了,这次使用了…

MySQL 导出库和表信息导出成Excel

最近在写文档需要将数据库的表和对应的表信息做成EXCEL。 我不能一个一个表一个一个字段的敲下去吧!!! 那有没有一个SQL搞定呢? 这个可以有有! 数据库里有那些表(包含表名和表介绍) SELECT…

路径规划算法:基于野马优化的路径规划算法- 附代码

路径规划算法:基于野马优化的路径规划算法- 附代码 文章目录 路径规划算法:基于野马优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化算法野马…

关于CEPH的简单畅谈

CEPH是什么 CEPH是一个先进的分布式存储系统,它具有高度可靠性、可扩展性和性能。CEPH旨在解决传统存储系统中存在的诸多挑战,如单点故障、难以扩展、数据丢失风险等。 CEPH的设计理念是将数据分布到一个由多个节点组成的集群中,并利用冗余…

ERROR: ORA-12560: TNS: 协议适配器错误

之前在Windows安装了Oracle,遇到了ORA-12560 TNS: protocol adapter error的错误。这个问题的原因很简单,就是没有配Oracle的环境变量。由于是去年遇到的问题,我现在已经忘了具体配置什么变量,但可以肯定的是这个问题就是环境变量…

24 | MySQL是怎么保证主备一致的?

以下内容出自《MySQL 实战 45 讲》 https://time.geekbang.org/column/article/76446 24 | MySQL是怎么保证主备一致的? MySQL 主备的基本原理 如图所示就是基本的主备切换流程。(M-S结构) 节点 A 到 B 这条线的内部流程是什么样的 &#x…

DEVICENET转ETHERNET/IP网关devicenet怎么读

远创智控YC-EIP-DNT,你听说过吗?这是一款自主研发的ETHERNET/IP从站功能的通讯网关,它能够连接DEVICENET总线和ETHERNET/IP网络,从而解决生产管理系统中协议不同造成的数据交换互通问题。 这款产品在工业自动化领域可谓是一大利…

微调预训练的 NLP 模型

动动发财的小手,点个赞吧! 针对任何领域微调预训练 NLP 模型的分步指南 简介 在当今世界,预训练 NLP 模型的可用性极大地简化了使用深度学习技术对文本数据的解释。然而,虽然这些模型在一般任务中表现出色,但它们往往缺…

vue进阶----路由

目录 前端路由的概念与原理 什么是路由 SPA 与前端路由 前端路由 前端路由的工作方式 实现简易的前端路由 vue-router 的基本用法 vue-router vue-router 安装和配置的步骤 声明路由的匹配规则 vue-router 的常见用法 1、路由重定向 2、嵌套路由 3、动态路由匹配 …

Stable Diffusion高阶技能(1)-掌握这些,你也能绘出惊艳画作

开篇 初踏入AI作画的世界,你可能会对如何制造出惊艳的艺术作品而困惑。作为一个前沿技术的探索者,我在这一篇文章中,会和你一同揭秘如何用正确的提示词操控AI的“透视”,将最美的画面展现在你眼前。 技能一、提高图片质量的高阶手法 在数量众多的元素中,我们如何做出最…

Vue组件库Element-常见组件-Form表单

Form表单 Form 表单&#xff1a;由输入框、选择器、单选框、多选框等控件组成&#xff0c;用以收集、检验、提交数据 具体关键代码如下&#xff1a; <template><div><el-row><!-- button 按钮 --><el-button>默认按钮</el-button><e…

DDPM 知识点

Generative Modeling by Estimating Gradients of the Data Distribution | Yang Song Score Matching 系列 (一) Non-normalized 模型估計 | 棒棒生