python爬虫-----深入了解 requests 库下篇(第二十五天)

devtools/2024/9/20 13:39:50/ 标签: python, 爬虫

🎈🎈作者主页: 喔的嘛呀🎈🎈
🎈🎈所属专栏:python爬虫学习🎈🎈
✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 

hello,兄弟姐妹们!我是喔的嘛呀。今天我们来学习 requests 后七个知识点。

目录

八、超时设置

九、SSL 验证

十、文件上传和下载

十一、连接池和线程安全

十三、HTTP 方法

十四、其他方法


 

八、超时设置

在网络通信中,超时设置非常重要,它可以确保在一定时间内收到服务器的响应,避免因等待过久而导致程序长时间阻塞。在使用 requests 库发送请求时,可以通过 timeout 参数来设置超时时间,该参数接受一个元组,分别指定连接超时时间和读取超时时间,单位为秒。以下是如何设置超时的示例:

import requestsurl = '<http://example.com/api>'
# 设置超时时间为连接超时10秒,读取超时20秒
response = requests.get(url, timeout=(10, 20))# 处理响应
print(response.text)

在这个示例中,我们将连接超时时间设置为 10 秒,读取超时时间设置为 20 秒。如果在规定时间内未收到响应,requests 库会抛出一个 Timeout 异常。这样可以确保及时处理网络请求中的超时情况,提高程序的稳定性和可靠性。

九、SSL 验证

在使用 requests 库发送 HTTPS 请求时,默认会验证服务器的 SSL 证书。SSL 证书用于验证服务器身份,并确保通信过程中的数据安全性。如果需要禁用 SSL 验证,可以将 verify 参数设置为 False。但是在实际应用中,为了保证通信的安全性,建议保持默认设置,即默认开启 SSL 验证。以下是如何设置 SSL 验证的示例:

import requestsurl = '<https://example.com/api>'
# 禁用 SSL 验证
response = requests.get(url, verify=False)# 处理响应
print(response.text)

在这个示例中,我们通过将 verify 参数设置为 False,来禁用 SSL 验证。这样虽然可以忽略证书验证过程,但也会降低通信的安全性。在实际生产环境中,建议仔细考虑是否禁用 SSL 验证,确保通信的安全性。

十、文件上传和下载

在网络爬虫中,有时需要上传文件到服务器或从服务器下载文件。requests 库提供了方便的方法来处理文件上传和下载。

  1. 文件上传:使用 files 参数可以上传文件。files 参数是一个字典,键是字段名,值是文件对象。以下是一个示例:
import requestsurl = '<http://example.com/upload>'
files = {'file': open('example.txt', 'rb')}
response = requests.post(url, files=files)print(response.text)
  1. 文件下载:使用 response.iter_content(chunk_size=1024) 可以以流的方式下载文件。chunk_size 参数指定每次读取的字节数,可以根据需要调整。以下是一个示例:
import requestsurl = '<http://example.com/file.txt>'
response = requests.get(url, stream=True)with open('file.txt', 'wb') as file:for chunk in response.iter_content(chunk_size=1024):file.write(chunk)print('File downloaded successfully')

在这个示例中,我们通过 response.iter_content(chunk_size=1024) 以流的方式下载文件,并将文件写入本地。这样可以有效地处理大文件的下载。

十一、连接池和线程安全

在网络爬虫中,使用连接池可以提高性能,因为它可以减少重复创建和销毁连接的开销。另外,线程安全性也很重要,特别是在多线程环境下使用网络请求时,需要确保请求的线程安全性。requests 库提供了一些方式来管理连接池和确保线程安全性。

  1. 连接池管理:可以使用 requests.Session() 创建会话对象,并通过 requests.adapters.HTTPAdapter 设置连接池的大小、最大连接数等参数。
import requests# 创建会话对象
session = requests.Session()# 创建适配器,设置连接池的大小和最大连接数
adapter = requests.adapters.HTTPAdapter(pool_connections=10, pool_maxsize=10)
session.mount('http://', adapter)
session.mount('https://', adapter)# 使用会话对象发送请求
response = session.get('<http://example.com>')
  1. 线程安全性requests 库本身是线程安全的,但在多线程环境中使用时,应该确保每个线程都使用独立的会话对象。这样可以避免多个线程共享同一个会话对象的连接池,从而保证线程安全性。
import requests
from concurrent.futures import ThreadPoolExecutor# 创建线程池
executor = ThreadPoolExecutor(max_workers=10)def fetch_url(url):# 每个线程使用独立的会话对象session = requests.Session()response = session.get(url)print(response.text)urls = ['<http://example.com>'] * 10
executor.map(fetch_url, urls)

在这个示例中,我们使用了 concurrent.futures.ThreadPoolExecutor 创建了一个包含10个线程的线程池,并通过 map 方法并发地发送请求。每个线程内部都创建了独立的会话对象,确保了线程安全性。

十二、定制请求

定制请求是指根据需求对请求进行个性化设置,如设置请求头、请求参数、请求体等。requests 库提供了丰富的参数和方法来定制请求。

  1. 设置请求头(headers 参数)

import requestsurl = '<http://example.com>'
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(url, headers=headers)
  1. 设置查询参数(params 参数)
import requestsurl = '<http://example.com>'
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get(url, params=params)
  1. 设置请求体(data 参数)
import requestsurl = '<http://example.com>'
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post(url, data=data)
  1. 设置超时时间(timeout 参数)
import requestsurl = '<http://example.com>'
response = requests.get(url, timeout=5)  # 设置超时时间为5秒
  1. 设置代理服务器(proxies 参数)
import requestsurl = '<http://example.com>'
proxies = {'http': '<http://127.0.0.1:8888>', 'https': '<https://127.0.0.1:8888>'}
response = requests.get(url, proxies=proxies)

通过这些方法,你可以根据需要定制请求,以满足不同的需求。

十三、HTTP 方法

HTTP 定义了多种请求方法,用于指定对资源的不同操作。在 requests 库中,可以使用 requests.request() 方法来发送任意类型的 HTTP 请求,其中 method 参数用于指定请求方法。以下是一些常用的 HTTP 方法及其用法:

1.GET:用于请求指定的资源。GET 请求的参数会附加在 URL 的后面。


import requestsresponse = requests.request('GET', '<http://example.com/api>')
  1. POST:用于向指定的资源提交数据,常用于表单提交或上传文件。
import requestsdata = {'key1': 'value1', 'key2': 'value2'}
response = requests.request('POST', '<http://example.com/api>', data=data)
  1. PUT:用于更新指定的资源,通常用于更新整个资源。
import requestsdata = {'key1': 'value1', 'key2': 'value2'}
response = requests.request('PUT', '<http://example.com/api>', data=data)
  1. DELETE:用于删除指定的资源。

import requestsresponse = requests.request('DELETE', '<http://example.com/api>')

5. HEAD:类似于 GET 请求,但只返回头部信息,不返回实际内容。

import requestsresponse = requests.request('HEAD', '<http://example.com/api>')

6. OPTIONS:用于获取目标资源所支持的通信选项。

import requestsresponse = requests.request('OPTIONS', '<http://example.com/api>')

通过使用这些方法,你可以灵活地发送各种类型的 HTTP 请求,以满足不同的需求。

十四、其他方法

除了上述提到的方法和属性外,requests 库还提供了一些其他有用的功能和属性:

  1. 响应时间(response.elapsed):可以获取请求的响应时间,以 datetime.timedelta 对象的形式返回。

import requestsresponse = requests.get('<http://example.com>')
print(response.elapsed.total_seconds())  # 获取响应时间,单位为秒
  1. 重定向历史(response.history):如果请求发生了重定向,可以通过该属性获取重定向的历史。

import requestsresponse = requests.get('<http://example.com>')
for redirect in response.history:print(redirect.url)
  1. 请求信息(response.request):可以获取请求的相关信息,如请求方法、URL、请求头等。
import requestsresponse = requests.get('<http://example.com>')
request = response.request
print(request.method)
print(request.url)
print(request.headers)

通过这些功能和属性,你可以更全面地了解请求和响应的相关信息,方便进行进一步的处理和分析。

好了,兄弟姐妹们,今天的学习就到这里了。老规矩第二十七天的学习,还是几个案列把知识点实操一下。拜拜喽!

祝屏幕前的兄弟姐妹们,天天开心,好运连连!

 


http://www.ppmy.cn/devtools/5763.html

相关文章

【MATLAB源码-第194期】基于matlab的MB-OFDM仿真,超宽带(UWB)无线传输。对比LS/DFT及其改进算法。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 一、无线通信的基本原理 无线通信是通过空气或其他介质传播电磁波来传输信息的技术。这种通信方式的核心在于电磁波&#xff0c;它能够在没有物理连接的情况下传输数据。无线通信的基本流程包括&#xff1a; 信号的生成&am…

OpenHarmony网络协议通信—kcp

kcp 是一种 ARQ 协议,可解决在网络拥堵情况下 tcp 协议的网络速度慢的问题 下载安装 直接在 OpenHarmony-SIG 仓中搜索 kcp 并下载。 使用说明 准备一套完整的 OpenHarmony 3.1 Beta 代码 库代码存放路径&#xff1a;./third_party/kcp 修改添加依赖的编译脚本 在/develo…

uniapp 当前系统没有安装苹果根证书,是否打开证书目录(打开后依次安装证书

当你遇到这类问题时&#xff0c;说明你也极其的困惑&#xff01;这就是为啥大抵国内这些货色搞的东西总是不尽人意&#xff01;连开发者生态都搞不好&#xff0c;就急着吹嘘。 这是官方给的技术说明方案&#xff1a; 恭喜你&#xff0c;当你按照这个搞之后&#xff0c;你的问题…

面试八股——集合——List

主要问题 数组 如果数组索引从0开始时&#xff0c;数组的寻址方式为&#xff1a; 如果数组索引从1开始时&#xff0c;数组的寻址方式为&#xff1a; 此时对于CPU来说增加了一个减法指令&#xff0c;降低寻址效率。 ArrayList⭐ ArrayList构造函数 尤其说一下第三个构造函数流…

datalist 是什么?以及作用是什么?

datalist 是 HTML5 中引入的一个新元素&#xff0c;它用于为 <input> 元素提供预定义的选项列表。当用户开始输入时&#xff0c;浏览器会显示一个下拉列表&#xff0c;其中包含与输入值匹配的 datalist 中的选项。这使得用户可以更容易地从预定义的选项中选择&#xff0c…

centos修改启动项加载不同内核

一.背景&#xff1a; 虚拟机中有时需要编译好几个内核版本&#xff0c;make install后系统存在几个内核版本。需要再哪个内核上开发调试就启动特定的内核版本。这就需要修改启动时的内核版本&#xff0c;再物理机或虚拟机启动时可以上下键选择。但有时是docket云环境中或远程时…

【SpringBoot实战篇】获取用户详细信息

1 明确需求 1需要获取用户详细信息 2 接口文档 1基本信息 2请求参数 无 3 响应数据 响应数据类型&#xff1a;application/json 响应参数说明&#xff1a; 响应数据样例 3 思路分析 1用户名在请求头里获取 4 开发 4.1 控制器usercontroller GetMapping("/userInfo")p…

vue3使用阿里oss上传资源(上传图片、视频、文件、pdf等等),删除oss资源。获取STS token的接口

vue3使用阿里oss上传资源 全部oss.ts代码如下&#xff1a; import OSS from "ali-oss";// 获取STS token export const getSTSToken async () > {const STS_TOKEN_URL "....."; // 获取STS token的接口&#xff0c;后端提供// fetch方式可按需更换成…

UE 录屏自动化上传阿里云OSS

前言 最近在做一个功能&#xff0c;然后就发现了一个很有趣的东西&#xff0c;虽然在一定程度上属于偷懒&#xff0c;但是在一些短频快的应用中还是很适用的&#xff0c;下面我就针对于这个测试做一些简单的分享&#xff0c;希望帮助到大家&#xff0c;在实际的开发中获得一些灵…

selenium篇-基础用法

Selenium WebDriver 是一款流行的自动化测试工具&#xff0c;用于模拟浏览器的各种操作。以下是一些Selenium WebDriver 中最常用的基本命令和方法摘要&#xff1a; 打开网页 (Get) 使用 get() 方法打开指定URL&#xff1a; Python 1driver.get("http://www.example.com&…

第63天:服务攻防-框架安全CVE 复现DjangoFlaskNode.JSJQuery

目录 思维导图 案例一&#xff1a;JavaScript-开发框架安全-Jquery&Node node.js目录穿越 CVE-2021-21315命令执行 Jquery CVE-2018-9207 案例二&#xff1a;Python-开发框架安全-Django&Flask django cve_2019_14234 CVE-2021-35042 flask ssti 思维导图 案…

HarmonyOS Next 视频弹幕功能

视频弹幕功能 介绍 本示例介绍如何使用ohos.danmakuflamemaster和ohos.gsyvideoplayer开发支持视频弹幕的播放器。可以自定义弹幕样式、占据屏幕宽度&#xff0c;发送弹幕&#xff0c;开关弹幕视图。 效果图预览 使用说明 点击播放按钮&#xff0c;进行视频播放&#xff0c…

layui框架实战案例(27):弹出二次验证

HTML容器 <button class"layui-btn layui-btn-sm layui-btn-danger" lay-event"delete"><i class"layui-icon layui-icon-delete"></i>批量删除</button>删除封装函数 function delAll(school_id, school_name) {var lo…

ZYNQ NVME高速存储之EXT4文件系统

前面文章分析了高速存储的各种方案&#xff0c;目前主流的三种存储方案是&#xff0c;pcie switch高速存储方案&#xff0c;zynq高速存储方案&#xff0c;fpga高速存储方案。虽然三种高速存储方案都可以实现高速存储&#xff0c;但是fpga高速存储方案是最烂的&#xff0c;fpga…

力扣 - 257. 二叉树的所有路径

题目链接 257. 二叉树的所有路径 题目描述 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;[“1->2…

解锁ApplicationContext vs BeanFactory: 谁更具选择性?

目录 一、聚焦源码回顾 &#xff08;一&#xff09;源码分析和理解 &#xff08;二&#xff09;简短的回顾对比建议 二、ApplicationContext vs BeanFactory特性对比 &#xff08;一&#xff09;主要特性总结 &#xff08;二&#xff09;直接建议 三、案例简单说明 &am…

Vue【路由】

1&#xff1a;什么是单页应用程序&#xff08;single page application&#xff09; 所有得功能在一个html页面上实现 2&#xff1a;单页面应用程序的优缺点 优点&#xff1a;按需更新性能高&#xff0c;开发效率也高&#xff0c;用户的体验较好 缺点&#xff1a;学习成本高…

llama-factory SFT 系列教程 (四),lora sft 微调后,使用vllm加速推理

文章目录 文章列表&#xff1a;背景简介llama-factory vllm API 部署融合 lora 模型权重 vllm API 部署HuggingFace API 部署推理API 部署总结 vllm 不使用 API 部署&#xff0c;直接推理数据集 tenplatevllm 代码部署 文章列表&#xff1a; llama-factory SFT系列教程 (一)&a…

Github 2024-04-20 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-20统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量非开发语言项目2Python项目2Swift项目2HTML项目1CSS项目1Go项目1C项目1C++项目1Rust项目1编程面试大学:成为软件工程师的全面学习计划 创建周期…

PostgreSQL 窗口函数汇总

文章目录 前言一、什么是窗口函数?二、常用的4类窗口函数三、PARTITION BY 子句四、窗口函数示例1. 聚合计算1.1 sum() 函数1.2 count() 函数1.3 avg() 函数2. 分组排序2.1 row_number() 函数2.2 rank() 函数2.3 dense_rank() 函数3. 分组查询