Python 初步了解urllib库:网络请求的利器

目录

urllib库简介

request模块

parse模块

error模块

response模块

读取响应内容

获取响应状态码

获取响应头部信息

处理重定向

关闭响应

总结


在Python的众多库中,urllib库是一个专门用于处理网络请求的强大工具。urllib库提供了多种方法来打开和读取URLs,从而使得网络数据的获取和处理变得简单而直接。本文将带领大家走进urllib库的世界,探索其功能和用法。

urllib库简介

urllib库是Python的一个标准库,它包含了多个模块,用于处理URL相关的操作。其中,request模块用于打开和读取URLs,parse模块用于解析URLs,error模块则用于处理URL请求过程中可能出现的异常。

request模块

urllib.request模块提供了多种方法来实现URL的打开和读取。其中最常用的方法是urlopen()。这个方法接收一个URL作为参数,返回一个HTTPResponse对象,该对象包含了服务器的响应。

下面是一个简单的示例:

import urllib.request  response = urllib.request.urlopen('http://www.example.com')  
print(response.read())

在这个示例中,首先导入了urllib.request模块,然后使用urlopen()方法打开了一个URL。返回的HTTPResponse对象包含了服务器的响应,可以使用read()方法读取这个响应的内容。

parse模块

urllib.parse模块主要用于解析URLs。它提供了多种函数来解析URL的各个组成部分,比如网络位置、路径、参数等。

例如,使用urlparse()函数来解析一个URL:

import urllib.parse  url = 'http://www.example.com/path?arg1=value1&arg2=value2'  
parsed_url = urllib.parse.urlparse(url)  
print('Scheme:', parsed_url.scheme)  
print('Netloc:', parsed_url.netloc)  
print('Path:', parsed_url.path)  
print('Params:', parsed_url.params)  
print('Query:', parsed_url.query)  
print('Fragment:', parsed_url.fragment)

这个示例中,使用了urlparse()函数来解析一个URL,并打印出了URL的各个组成部分。

error模块

在网络请求中,经常会遇到各种异常,比如URL无法访问、网络连接超时等。urllib库提供了urllib.error模块来处理这些异常。

可以使用try-except语句来捕获和处理这些异常:

import urllib.request  
import urllib.error  try:  response = urllib.request.urlopen('http://www.example.com')  print(response.read())  
except urllib.error.URLError as e:  print('Error occurred:', e.reason)

在这个示例中,如果urlopen()方法抛出了URLError异常,就会捕获这个异常并打印出错误的原因。

下面是 urllib.error 模块中一些常见的异常类及其使用示例:

 URLError

URLError 是 urllib.error 模块中定义的基类,用于处理所有与 URL 相关的错误。它通常包含了一个描述错误的“原因”(reason)。

import urllib.request  
import urllib.error  try:  response = urllib.request.urlopen('http://nonexistent-domain.com')  
except urllib.error.URLError as e:  print('An error occurred:', e.reason)

 HTTPError

HTTPError 是 URLError 的一个子类,专门用于处理 HTTP 请求过程中出现的错误,比如 404 Not Found 或 500 Internal Server Error。当请求成功但服务器返回了一个错误状态码时,就会抛出 HTTPError 异常。

import urllib.request  
import urllib.error  try:  response = urllib.request.urlopen('http://www.example.com/nonexistent-page')  
except urllib.error.HTTPError as e:  print('HTTP error occurred:', e.code)  # 输出 HTTP 状态码  print(e.reason)                         # 输出错误原因  print(e.headers)                        # 输出响应头部  print(e.read())                         # 读取响应体内容(如果可用)

ContentTooShortError

ContentTooShortError 异常通常在读取的数据少于预期时抛出。这可能是因为连接在数据完全接收之前被关闭。

import urllib.request  
import urllib.error  try:  # 假设这个 URL 返回一个非常小的内容,但我们期望的内容长度更长  response = urllib.request.urlopen('http://www.example.com/small-content')  content = response.read(1000)  # 尝试读取比实际内容更多的数据  
except urllib.error.ContentTooShortError as e:  print('Content was too short:', e)

异常处理策略

在实际应用中,可能会根据具体的需求来捕获和处理不同的异常。通常,会首先捕获 HTTPError,因为它提供了关于 HTTP 请求失败的详细信息。然后,会捕获更一般的 URLError,以处理其他与 URL 相关的错误。

import urllib.request  
import urllib.error  try:  response = urllib.request.urlopen('http://www.example.com/some-page')  
except urllib.error.HTTPError as e:  # 处理 HTTP 错误,比如状态码检查、重试逻辑等  print('HTTP error occurred:', e.code)  
except urllib.error.URLError as e:  # 处理 URL 错误,比如网络不可用、DNS 解析失败等  print('URL error occurred:', e.reason)  
except Exception as e:  # 处理其他未明确捕获的异常  print('An unexpected error occurred:', e)

通过适当地使用 try-except 语句和 urllib.error 模块中的异常类,可以编写出健壮的网络请求代码,能够优雅地处理各种可能的错误情况。

response模块

urllib.response模块主要用于处理服务器的响应。通常,不需要直接操作urllib.response模块,而是会通过urllib.request模块得到的urllib.response.HttpResponse对象来间接地使用它。

当使用urllib.request.urlopen()或者其他类似方法发送一个HTTP请求时,如果请求成功,将得到一个HttpResponse对象,这个对象就是urllib.response模块的一部分。这个对象提供了方法来处理响应的状态、头部以及响应体。

以下是urllib.response模块在使用中经常涉及的几个方面:

读取响应内容

使用read()方法读取响应体的内容。

import urllib.request  response = urllib.request.urlopen('http://www.example.com')  
content = response.read()  
print(content)

获取响应状态码

使用status属性获取HTTP响应的状态码。

import urllib.request  response = urllib.request.urlopen('http://www.example.com')  
status_code = response.status  
print(status_code)

获取响应头部信息

使用getheader(name)方法获取特定头部的值,或者使用headers属性获取所有头部信息。

import urllib.request  response = urllib.request.urlopen('http://www.example.com')  
content_type = response.getheader('Content-Type')  
print(content_type)  # 获取所有头部信息  
for header, value in response.headers.items():  print(header, value)

处理重定向

默认情况下,urllib.request会自动处理HTTP重定向。但如果需要更细粒度的控制,可以通过urllib.request.HTTPRedirectHandler来自定义重定向行为。

处理cookies

虽然urllib.response模块本身不直接处理cookies,但可用urllib.request.HTTPCookieProcessorhttp.cookiejar.CookieJar来管理cookies。

关闭响应

在读取完响应内容后,为了释放系统资源,通常应该关闭响应。Python的HTTP响应对象支持上下文管理器协议,因此可以使用with语句来自动关闭响应。

import urllib.request  with urllib.request.urlopen('http://www.example.com') as response:  content = response.read()  # 在这里处理内容  # 响应会在with块结束时自动关闭

尽管urllib.response模块提供了这些功能,但在日常使用中,更多的是与urllib.request模块交互,它负责发送请求并返回HttpResponse对象,而HttpResponse对象则提供了上述方法来处理响应。

需要注意的是,对于更复杂的网络请求和处理,如POST请求、设置请求头部、处理cookies等,可能还需要结合urllib.request中的其他类和方法一起使用。同时,对于更加现代和高级的HTTP客户端需求,还可以考虑使用requests库,它提供了更加友好和强大的API。

代码实例

以下举3个实例,都是代码框架并不能正常运行,请根据网页实现情况修改代码。

图片下载

import re  
import urllib.request  def download_images(url):  # 从网页获取HTML代码  response = urllib.request.urlopen(url)  html = response.read().decode('utf-8')  # 使用正则表达式提取图片URL  img_urls = re.findall(r'src="([^"]+\.(?:png|jpg|jpeg|gif|bmp))"', html)  # 遍历图片URL并下载图片  for img_url in img_urls:  img_url = 'http://example.com/' + img_url  # 根据实际情况修改URL前缀  urllib.request.urlretrieve(img_url, 'image_' + img_url.split('/')[-1])  # 下载图片并保存  # 使用函数下载图片  
download_images('http://example.com/some_page_with_images')  # 替换为实际的网页URL

股票信息

import urllib.request  
from urllib.parse import urlencode  
import json  def get_stock_info(stock_symbol):  # 假设有一个网站提供股票信息,并且它接受一个查询参数'symbol'  url = 'http://example.com/stock_info'  params = {'symbol': stock_symbol}  query_string = urlencode(params)  full_url = f"{url}?{query_string}"  # 发起请求  req = urllib.request.Request(full_url)  response = urllib.request.urlopen(req)  data = response.read()  # 解析JSON响应  stock_data = json.loads(data)  return stock_data  # 使用函数获取股票信息  
stock_symbol = 'AAPL'  # 例如,查询苹果公司的股票信息  
stock_info = get_stock_info(stock_symbol)  # 输出股票信息  
print(stock_info)

天气预报

import urllib.request  
import json  def get_weather_forecast(city):  # 假设有一个提供天气服务的网站,并且它接受一个查询参数'city'  url = 'http://example.com/weather_forecast'  params = {'city': city}  query_string = urllib.parse.urlencode(params)  full_url = f"{url}?{query_string}"  # 发起请求  req = urllib.request.Request(full_url)  response = urllib.request.urlopen(req)  data = response.read()  # 解析JSON响应  weather_data = json.loads(data)  return weather_data  # 使用函数获取天气预报  
city = 'Beijing'  # 想要查询的城市  
weather_forecast = get_weather_forecast(city)  # 输出天气预报信息  
print(weather_forecast)

总结

urllib库是Python中用于处理网络请求的强大工具。通过urllib库,可以方便地打开和读取URLs,处理网络请求中的异常,以及解析URLs的各个组成部分。无论是进行网络爬虫的开发,还是实现其他与网络请求相关的功能,urllib库都是一个值得学习和使用的工具。

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

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

相关文章

STM32 HAL库RTC复位丢失年月日的解决办法

STM32 HAL库RTC复位丢失年月日的解决办法 0.前言一、实现方式1.CubeMX配置:2.MX_RTC_Init()函数修改2.编写手动解析函数 二、总结 参考文章:stm32f1 cubeMX RTC 掉电后日期丢失的问题 0.前言 最近在使用STM32F103做RTC实验时,发现RTC复位后时…

基于Java的物管系统设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术介绍 3 1.1 JSP介绍 3 1.2 MySQL介绍 3 1.3 B/S开发模式 3 1.4 Java介绍 4 2 系统分析 5 2.1 可行性研究 5 2.1.1技术可行性 5 2.2.2经济可行性 5 2.3.1操作可行性 5 2.2 需求分析 6 2.2.1系统用例图 6 2.2.2系统功能模块需求分析…

机器学习--循环神经网络(RNN)1

一、简介 循环神经网络(Recurrent Neural Network)是深度学习领域中一种非常经典的网络结构,在现实生活中有着广泛的应用。以槽填充(slot filling)为例,如下图所示,假设订票系统听到用户说&…

揭秘接口测试:完整流程指南!

在讲接口测试之前,首先需要给大家申明下:接口测试对于测试人员而言,非常非常重要,懂功能测试接口测试,就能在企业中拿到一份非常不错的薪资。 这么重要的接口测试,一般也是面试笔试必问。为方便大家更好的…

【C/C++】常量指针与指针常量的深入解析与区分(什么是const int * 与 int * const ?)

目录 一、前言 二、const 的简单介绍 三、常量指针 🔍介绍与分析 📰小结与记忆口诀 四、指针常量 🔍介绍与分析 📰小结与记忆口诀 五、总结与提炼 六、共勉 一、前言 在【C/C】的编程中,指针与const关键字的组合…

防御保护IPSEC实验

要求:在FW5和FW3之间建立一条IPSEC通道,保证10.0.2.0/24网段可以正常访问到192.168.1.0/24. 因为是双机热备状态则只需要配置FW1主设备。 新建ACL待加密数据流 安全建议: IPSec参数配置 FW3配置如下与FW1类似: FW1中新建安全策略…

链表|19.删除链表的倒数第N个节点

力扣题目链接 struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {//定义虚拟头节点dummy 并初始化使其指向headstruct ListNode* dummy malloc(sizeof(struct ListNode));dummy->val 0;dummy->next head;//定义 fast slow 双指针struct ListNode* f…

论文汇总:Rectifying the Shortcut Learning of Background for Few-Shot Learning

原文解读: 论文解读:Rectifying the Shortcut Learning of Background for Few-Shot Learning-CSDN博客 文章汇总 问题&动机&解决方法 图像背景是一种有害知识的来源,这是少数镜头学习模型容易吸收的(问题) 通过在训练和评估中提…

TI IWR6843ISK ROS驱动程序搭建

1、设备准备 1.1 硬件设备 1)TI IWR 6843 ISK 1块 2)Micro USB 数据线 1条 1.2 系统环境 1)VMware Workstation 15 Player 虚拟机 2)Ubuntu18.04 并安装有 ROS1 系统 如若没有安装 ROS 系统,可通过如下指令进行…

【分库分表】基于mysql+shardingSphere的分库分表技术

目录 1.什么是分库分表 2.分片方法 3.测试数据 4.shardingSphere 4.1.介绍 4.2.sharding jdbc 4.3.sharding proxy 4.4.两者之间的对比 5.留个尾巴 1.什么是分库分表 分库分表是一种场景解决方案,它的出现是为了解决一些场景问题的,哪些场景喃…

Solidity攻击合约:“被偷走的资金”

在以太坊智能合约开发中,Solidity是最常用的编程语言。然而,由于代码编写不当或缺乏安全意识,合约可能面临各种攻击。本文将通过一个简单的Solidity合约示例,展示一个潜在的攻击合约,并分析其相对于原本合约的危害以及…

计算机设计大赛 疲劳驾驶检测系统 python

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.2 打哈欠检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 🔥 优质竞赛项目系列&#x…

024—pandas 将一列数据等份变形

前言 今天我们将一个 Series 序列数据转为 DataFrame结构。我们将用么 pd.cut() 对数据进行分箱,也会用到 NumPy 的 np.reshape() 对阵列数据进行变形。接下来我们看看具体的需求,再分析一下解决思路,最后用代码实现它。 需求: …

flink实战--Flink任务资源自动化优化

背景 在生产环境Flink任务资源是用户在实时平台端进行配置,用户本身对于实时任务具体配置多少资源经验较少,所以存在用户资源配置较多,但实际使用不到的情形。比如一个 Flink 任务实际上 4 个并发能够满足业务处理需求,结果用户配置了 16 个并发,这种情况会导致实时计算资…

《Effective Modern C++》- 极精简版 15-21条

本文章属于专栏《业界Cpp进阶建议整理》 继续上篇《Effective Modern C》- 极精简版 5-14条。本文列出《Effective Modern C》的15-21条的个人理解的极精简版本。 Item15、尽量使用constexpr constexpr形容对象 constexpr对象都是const,但是const对象不一定是conste…

七、门控循环单元语言模型(GRU)

门控循环单元(Gated Recurrent Unit,GRU)是 LSTM 的一个稍微简化的变体,通常能够提供同等的效果,并且计算训练的速度更快。 门控循环单元原理图:参考门控循环单元 原理图中各个图形含义: X(t)&a…

C语言逗号运算符(,)

在C语言中,逗号运算符(,)用于在表达式中分隔多个子表达式,并按照从左到右的顺序依次计算这些子表达式。逗号运算符的运算结果是最后一个子表达式的值。 逗号运算符的底层行为是依次计算每个子表达式,并将每个子表达式…

gumbel-softmax如何实现离散分布可微+torch代码+原理+证明

文章目录 背景方法通俗理解什么是重参数化gumbel-softmax为什么是gumbeltorch实现思考 背景 这里举一个简单的情况,当前我们有p1, p2, p3三个概率,我们需要得到最优的一个即max(p1, p2, p3),例如当前p3 max(p1, p2, p3),那么理想…

【从部署服务器到安装autodock vina】

注意:服务器 linux系统选用ubuntu 登录系统,如果没有图形化见面可以先安装图形化界面 可以参考该视频 --> linux安装图形化界面 非阿里云ubuntu 依次执行以下命令 sudo apt-get update sudo apt-get install gnome sudo reboot阿里云ubuntu 需多执…

分布式解决方案

目录 1. 分布式ID1-1. 传统方案1-2. 分布式ID特点1-3. 实现方案1-4. 开源组件 1. 分布式ID 1-1. 传统方案 时间戳UUID 1-2. 分布式ID特点 全局唯一高并发高可用 1-3. 实现方案 方案总结: 号段模式 有两台服务器,给第一台服务器分配0-100&#xff0…