【愚公系列】《Python网络爬虫从入门到精通》004-请求模块urllib3
| 标题 | 详情 |
|---|---|
| 作者简介 | 愚公搬代码 |
| 头衔 | 华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。 |
| 近期荣誉 | 2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主,2024年华为云十佳博主等。 |
| 博客内容 | .NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。 |
| 欢迎 | 👍点赞、✍评论、⭐收藏 |
文章目录
- 🚀前言
- 🚀一、请求模块urllib3
- 🔎1. urllib3 简介
- 🔎2. 安装 urllib3
- 🔎3. 发送网络请求
- 🦋3.1 GET 请求
- 🦋3.2 POST 请求
- 🦋3.3 请求重试
- 🔎4. 处理响应内容
- 🦋4.1 获取响应头
- 🦋4.2 处理 JSON 响应
- 🦋4.3 处理二进制数据(如图片)
- 🔎5.复杂请求的发送
- 🦋5.1 设置请求头
- 🦋5.2 设置超时
- 🦋5.3 设置代理
- 🔎6.上传文件
🚀前言
在现代编程中,网络请求是一个不可或缺的环节,无论是数据抓取、API调用还是后端服务的交互,都会涉及到网络通讯。而在众多网络请求库中,urllib3因其强大的功能和易用性,成为了许多开发者的首选。它不仅提供了对HTTP协议的全面支持,还具备连接池、重试机制和SSL/TLS验证等多种实用特性。
在本文中,我们将深入探讨urllib3模块的基本用法,帮助你更好地理解如何利用这个库进行高效的网络请求。不论你是初学者还是有经验的开发者,掌握urllib3都将为你的项目带来极大的便利。
🚀一、请求模块urllib3
🔎1. urllib3 简介
- 定义:urllib3 是一个功能强大、结构清晰的 Python HTTP 客户端库,被许多原生 Python 系统采用。
- 核心特性:
- 线程安全
- 连接池管理
- 客户端 SSL/TLS 验证
- 多部分编码文件上传
- 请求重试与 HTTP 重定向处理
- 支持 gzip/deflate 编码
- 支持 HTTP/SOCKS 代理
- 100% 测试覆盖率
🔎2. 安装 urllib3
- 通过
pip安装(非 Anaconda 环境):pip install urllib3
🔎3. 发送网络请求
🦋3.1 GET 请求
- 步骤:
- 创建
PoolManager对象管理连接池。 - 调用
request()方法发送请求。
- 创建
- 语法:
request(method, url, fields=None, headers=None, urlopen_kw)method: 请求方法(如GET、POST)。url: 目标 URL。fields: 请求参数(字典形式)。headers: 请求头(字典形式)。
示例 1:基础 GET 请求
import urllib3 # 导入urllib3模块
url = "http://httpbin.org/get"
http = urllib3.PoolManager() # 创建连接池管理对象
r = http.request('GET',url) # 发送GET请求
print(r.status) # 打印请求状态码

示例 2:多服务器请求
import urllib3 # 导入urllib3模块
urllib3.disable_warnings() # 关闭ssl警告
jingdong_url = 'https://www.jd.com/' # 京东url地址
python_url = 'https://www.python.org/' # Python url地址
baidu_url = 'https://www.baidu.com/' # 百度url地址
http = urllib3.PoolManager() # 创建连接池管理对象
r1 = http.request('GET',jingdong_url) # 向京东地址发送GET请求
r2 = http.request('GET',python_url) # 向python地址发送GET请求
r3 = http.request('GET',baidu_url) # 向百度地址发送GET请求
print('京东请求状态码:',r1.status)
print('python请求状态码:',r2.status)
print('百度请求状态码:',r3.status)

🦋3.2 POST 请求
- 关键:设置
method='POST'并通过fields传递表单数据。
示例 3:发送 POST 请求
import urllib3 # 导入urllib3模块
urllib3.disable_warnings() # 关闭ssl警告
url = 'https://www.httpbin.org/post' # post请求测试地址
params = {'name':'Jack','country':'中国','age':30} # 定义字典类型的请求参数
http = urllib3.PoolManager() # 创建连接池管理对象
r = http.request('POST',url,fields=params) # 发送POST请求
print('返回结果:',r.data.decode('utf-8'))

🦋3.3 请求重试
- 参数:
retries控制重试次数(默认 3 次,False禁用重试)。
示例 4:设置重试策略
import urllib3 # 导入urllib3模块
urllib3.disable_warnings() # 关闭ssl警告
url = 'https://www.httpbin.org/get' # get请求测试地址
http = urllib3.PoolManager() # 创建连接池管理对象
r = http.request('GET',url) # 发送GET请求,默认重试请求
r1 = http.request('GET',url,retries=5) # 发送GET请求,设置5次重试请求
r2 = http.request('GET',url,retries=False) # 发送GET请求,关闭重试请求
print('默认重试请求次数:',r.retries.total)
print('设置重试请求次数:',r1.retries.total)
print('关闭重试请求次数:',r2.retries.total)

🔎4. 处理响应内容
🦋4.1 获取响应头
import urllib3 # 导入urllib3模块
urllib3.disable_warnings() # 关闭ssl警告
url = 'https://www.httpbin.org/get' # get请求测试地址
http = urllib3.PoolManager() # 创建连接池管理对象
r = http.request('GET',url) # 发送GET请求,默认重试请求
response_header = r.info() # 获取响应头
for key in response_header.keys(): # 循环遍历打印响应头信息print(key,':',response_header.get(key))

🦋4.2 处理 JSON 响应
import urllib3 # 导入urllib3模块
import json # 导入json模块
urllib3.disable_warnings() # 关闭ssl警告
url = 'https://www.httpbin.org/post' # post请求测试地址
params = {'name':'Jack','country':'中国','age':30} # 定义字典类型的请求参数
http = urllib3.PoolManager() # 创建连接池管理对象
r = http.request('POST',url,fields=params) # 发送POST请求
j = json.loads(r.data.decode('unicode_escape')) # 将响应数据转换为字典类型
print('数据类型:',type(j))
print('获取form对应的数据:',j.get('form'))
print('获取country对应的数据:',j.get('form').get('country'))

🦋4.3 处理二进制数据(如图片)
import urllib3 # 导入urllib3模块
urllib3.disable_warnings() # 关闭ssl警告
url = 'https://search-operate.cdn.bcebos.com/4466f881476a1ee804b4a32aee790675.gif' # 图片请求地址
http = urllib3.PoolManager() # 创建连接池管理对象
r = http.request('GET',url) # 发送网络请求
print(r.data) # 打印二进制数据
f = open('python.png','wb+') # 创建open对象
f.write(r.data) # 写入数据
f.close() # 关闭

🔎5.复杂请求的发送
🦋5.1 设置请求头
- 目的:模拟浏览器请求,避免被服务器识别为爬虫。
- 实现步骤:
- 获取请求头信息:
- 在浏览器(如 Firefox)中按
F12打开开发者工具。 - 访问目标网页(如
https://www.baidu.com)。 - 在“网络”选项卡中选择一个请求,复制其
User-Agent值。
- 在浏览器(如 Firefox)中按
- 设置请求头:将
User-Agent作为字典键,浏览器信息作为值。
- 获取请求头信息:

示例:设置请求头
import urllib3 # 导入urllib3模块
urllib3.disable_warnings() # 关闭ssl警告
url = 'https://www.httpbin.org/get' # get请求测试地址
# 定义火狐浏览器请求头信息
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0'}
http = urllib3.PoolManager() # 创建连接池管理对象
r = http.request('GET',url,headers=headers) # 发送GET请求
print(r.data.decode('utf-8')) # 打印返回内容

🦋5.2 设置超时
- 两种设置方式:
- 全局设置:在
PoolManager对象初始化时指定timeout。 - 单次请求设置:在
request()方法中直接传递timeout。
- 全局设置:在
- 精确控制:使用
Timeout类分别设置连接超时和读取超时。
示例:基础超时设置
import urllib3 # 导入urllib3模块
urllib3.disable_warnings() # 关闭ssl警告
baidu_url = 'https://www.baidu.com/' # 百度超时请求测试地址
python_url = 'https://www.python.org/' # Python超时请求测试地址
http = urllib3.PoolManager() # 创建连接池管理对象
try:r = http.request('GET',baidu_url,timeout=0.01)# 发送GET请求,并设置超时时间为0.01秒
except Exception as error:print('百度超时:',error)
http2 = urllib3.PoolManager(timeout=0.1) # 创建连接池管理对象,并设置超时时间为0.1秒
try:r = http2.request('GET', python_url) # 发送GET请求
except Exception as error:print('Python超时:',error)

示例:精确超时控制
from urllib3 import Timeout
import urllib3 # 导入urllib3模块
urllib3.disable_warnings()
# 设置连接超时 0.5秒,读取超时 0.1秒
timeout = Timeout(connect=0.5, read=0.1)# 方式1:全局设置
http = urllib3.PoolManager(timeout=timeout)
http.request("GET", "https://www.python.org")# 方式2:单次请求设置
http = urllib3.PoolManager()
http.request("GET", "https://www.python.org", timeout=timeout)
🦋5.3 设置代理
- 核心类:
ProxyManager,需指定代理地址和请求头。 - 作用:隐藏真实 IP 或访问受限制资源。
示例:通过代理发送请求
import urllib3 # 导入urllib3模块
url = "http://httpbin.org/ip" # 代理IP请求测试地址
# 定义火狐浏览器请求头信息
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0'}
# 创建代理管理对象
proxy = urllib3.ProxyManager('http://120.27.110.143:80',headers = headers)
r = proxy.request('get',url,timeout=2.0) # 发送请求
print(r.data.decode()) # 打印返回结果
输出:
{"origin": "120.27.110.143"
}
🔎6.上传文件
- 两种方式:
- 文本文件:通过
fields参数以元组形式传递。 - 二进制文件:通过
body参数直接传递数据,并指定Content-Type。
- 文本文件:通过
示例:上传文本文件
import urllib3 # 导入urllib3模块
import json # 导入json模块
with open('test.txt') as f: # 打开文本文件data = f.read() # 读取文件
http = urllib3.PoolManager() # 创建连接池管理对象
# 发送网络请求
r = http.request( 'POST','http://httpbin.org/post',fields={'filefield': ('example.txt', data),})
files = json.loads(r.data.decode('utf-8'))['files'] # 获取上传文件内容
print(files) # 打印上传文本信息
输出:
{"filefield": "在学习中寻找快乐!"
}
示例:上传图片文件
import urllib3 # 导入urllib3模块
with open('python.jpg','rb') as f: # 打开图片文件data = f.read() # 读取文件
http = urllib3.PoolManager() # 创建连接池管理对象
# 发送请求
r = http.request('POST','http://httpbin.org/post',body = data,headers={'Content-Type':'image/jpeg'})
print(r.data.decode()) # 打印返回结果

相关文章:
【愚公系列】《Python网络爬虫从入门到精通》004-请求模块urllib3
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主&…...
网络安全技术复习总结
1|0第一章 概论 1.网络安全发展阶段包括四个阶段:通信安全、计算机安全、网络安全、网络空间安全。 2.2017年6月1日,我国第一部全面规范网络空间安全的基础性法律《中华人民共和国网络安全法》正式实施。 3.2021年 6月10日,《中华人民共和…...
初阶c语言(while循环二分法)
前言: 作业和那个不是一个级别的 内容: 3.在一个有序数组中查找具体的某个数字n。(讲解二分查找) 下标就是数组的下标,从0开始,有点难度,我头有点晕,就是大概知道了,写代码也写不出来的那种…...
如何使用Java语言在Idea和Android中分别建立服务端和客户端实现局域网聊天
手把手教你用Java语言在Idea和Android中分别建立服务端和客户端实现局域网聊天 目录 文章目录 手把手教你用**Java**语言在**Idea**和**Android**中分别建立**服务端**和**客户端**实现局域网聊天**目录**[toc]**基本实现****问题分析****服务端**Idea:结构预览Server类代码解…...
Java_多线程
并发和并行 并发 在同一时刻,有多个指令在单个CPU上交替执行 并行 在同一时刻,有多个指令在多个CPU上同时执行 多线程的实现方式 继承Thread类的方式 注意给线程设置名字,启动线程等操作 实现Runable的方式 自己创建一个类然后去实现…...
uniapp开发h5部署到服务器
1.发行>网站-PC Web或手机H5(仅适用于uniapp) 2.填写网站域名 3.编译成功后会生成一个unpackage文件夹找到下面的h5 4.接下来会使用一个工具把h5里面的文件放到服务器上面(WinSCP使用其他能部署的工具也行) 5.登录 6.登录成功后…...
如何在个人电脑本地化部署Deepseek-R1大模型
文章目录 Deepseek概述公司简介DeepSeek模型优势DeepSeek模型发展历史Ollama安装Deepseek版本选择Deepseek支持的客户端工具编程语言客户端库桌面客户端插件类其他工具客户端工具配置cherryStudio配置测试如何使用DeepSeek满血版什么是 DeepSeek R1 满血版?deepseek官方第三方…...
Java中关于JSON的基本使用
Java中关于JSON的基本使用 Java中可以操作json的类库jar有很多,网上一找一大片,每种封装的jar包有自己的方法,需要查阅资料使用,但无非就是json转对象,对象转json这些 Java中常见的json类jar包:Gson,Jackso…...
简化的动态稀疏视觉Transformer的PyTorch代码
存一串代码(简化的动态稀疏视觉Transformer的PyTorch代码) import torch import torch.nn as nn import torch.nn.functional as F class DynamicSparseAttention(nn.Module): def __init__(self, dim, num_heads8, dropout0.1): super().__init__()…...
PADS多层板减少层数
前提 PADS是硬件工程师必备的画图软件,相信很多朋友遇到过为降低成本把6层板改为4层,或8层改为6层的经历,正常是把不需要的两层上所有东西删掉,然后修改层设置,下面举例说明。 首先是将要删除的层上的数据全部删除&a…...
你需要提供管理员权限才能删除此文件夹解决方法
立即高级启动 windows10 搜索“设置”,然后“更新和安全””->“恢复”->“立即重新启动” windows11 搜索“设置”,然后“Windows更新”->“更新历史记录”->“恢复”->“立即重新启动” 疑难解答 点击“疑难解答” 高级选项 启…...
螺旋折线(蓝桥杯18G)
、 #include<iostream> using namespace std; typedef pair<int,int> Dot;//存储坐标 int dy[] { 0,1,0,-1 }; int dx[] { -1,0,1,0 }; int main() {int direction 0,x,y,dis 0;Dot pos make_pair(0,0);cin >> x >> y;for (int i 1;; i) {for (…...
常见的数据仓库有哪些?
数据仓库(Data Warehouse,简称数仓)是企业用于存储、管理和分析大量数据的重要工具,其核心目标是通过整合和处理数据,为决策提供高质量、一致性和可信度的数据支持。在构建和使用数仓时,选择合适的工具和技术至关重要。以下是常见的数仓工具及其特点的详细介绍: 1. Hiv…...
数据科学之数据管理|NumPy数据管
一、Numpy介绍 (一) 什么是numpy NumPy是Python中科学计算的基础包。它是一个Python库,提供多维数组对象,各种派生对象(如掩码数组和矩阵),以及用于数组快速操作的各种API,有包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数,基本统计运…...
LSTM 学习笔记 之pytorch调包每个参数的解释
0、 LSTM 原理 整理优秀的文章 LSTM入门例子:根据前9年的数据预测后3年的客流(PyTorch实现) [干货]深入浅出LSTM及其Python代码实现 整理视频 李毅宏手撕LSTM [双语字幕]吴恩达深度学习deeplearning.ai 1 Pytorch 代码 这里直接调用了nn.l…...
ASUS/华硕飞行堡垒9 FX506H FX706H 原厂Win10系统 工厂文件 带ASUS Recovery恢复
华硕工厂文件恢复系统 ,安装结束后带隐藏分区,带一键恢复,以及机器所有的驱动和软件。 支持型号:FX506HC, FX506HE, FX506HM, FX706HC, FX706HE, FX706HM, FX506HHR, FX706HMB, FX706HEB, FX706HCB, FX506HMB, FX506HEB, FX506HC…...
Unity使用iTextSharp导出PDF-04图形
坐标系 pdf文档页面的原点(0,0)在左下角,向上为y,向右为x。 文档的PageSize可获取页面的宽高数值 单位:像素 绘制矢量图形 使用PdfContentByte类进行绘制,注意文档打开后才有此对象的实例。 绘制方法 …...
JDBC如何连接数据库
首先,我们要去下载JDBC的驱动程序 官网下载地址:https://downloads.mysql.com/archives/c-j/ 选择最新版本就可以 然后回到我们idea点击file - project Structure - Modules, 就行了 参考1:如何解决JDBC连接数据库出现问题且对进行数据库操…...
Unity URP的2D光照简介
官网工程,包括2d光照,动画,动效介绍: https://unity.com/cn/blog/games/happy-harvest-demo-latest-2d-techniques https://docs.unity3d.com/6000.0/Documentation/Manual/urp/Lights-2D-intro.html 人物脸部光照细节和脚上的阴影…...
【IC】AI处理器核心--第二部分 用于处理 DNN 的硬件设计
第 II 部分 用于处理 DNN 的硬件设计 第 3 章 关键指标和设计目标 在过去的几年里,对 DNN 的高效处理进行了大量研究。因此,讨论在比较和评估不同设计和拟议技术的优缺点时应考虑的关键指标非常重要,这些指标应纳入设计考虑中。虽然效率通常…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
