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)为例,如下图所示,假设订票系统听到用户说&…

关于vue3使用prop传动态参数时父子数据不同步更新问题

子: <template><div><h3>子组件</h3><input :value"modelValue" input"$emit(update:modelValue, $event.target.value)"></div> </template><script setup> import { defineProps, defineEmits } from …

P5635 【CSGRound1】天下第一

题目背景 天下第一的 cbw 以主席的身份在 8102 年统治全宇宙后&#xff0c;开始了自己休闲的生活&#xff0c;并邀请自己的好友每天都来和他做游戏。由于 cbw 想要显出自己平易近人&#xff0c;所以 zhouwc 虽然是一个蒟蒻&#xff0c;也有能和 cbw 玩游戏的机会。 题目描述 …

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

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

logstash和elasticsearch的几种交互接口

Logstash与Elasticsearch是两个非常流行的开源工具&#xff0c;用于处理和存储大量的日志数据。它们之间的集成非常重要&#xff0c;因为Logstash用于收集、处理和转换日志数据&#xff0c;而Elasticsearch用于存储、搜索和分析这些数据。在本文中&#xff0c;我们将详细介绍Lo…

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

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

防御保护IPSEC实验

要求&#xff1a;在FW5和FW3之间建立一条IPSEC通道&#xff0c;保证10.0.2.0/24网段可以正常访问到192.168.1.0/24. 因为是双机热备状态则只需要配置FW1主设备。 新建ACL待加密数据流 安全建议&#xff1a; IPSec参数配置 FW3配置如下与FW1类似&#xff1a; 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

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

TI IWR6843ISK ROS驱动程序搭建

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

uni-app navigateTo路由传参传递对象

传递参数 先通过JSON.stringify将对象转成字符串 toNextPage(obj) {uni.navigateTo({url:/pages/nextpage/index?obj${JSON.stringify(obj)}}); },接收参数 再通过JSON.parse将传递过来的字符串转成对象 onLoad(options) {this.obj JSON.parse(options.obj) }

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

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

微信小程序 - 组件wxml中slot

在组件的 wxml 中可以包含 slot 节点&#xff0c;用于承载组件使用者提供的 wxml 结构。 默认情况下&#xff0c;一个组件的 wxml 中只能有一个 slot 。需要使用多 slot 时&#xff0c;可以在组件 js 中声明启用。 Component(options: {multipleSlots: true // 在组件定义时的…

P1611 循环的数字

题目描述 你曾经因为看见一样的东西一遍又一遍地重复、循环而对电视节目感到厌烦么&#xff1f;好吧&#xff0c;虽然我并不关心电视节目的好坏&#xff0c;不过有时却也很像那样不断循环的数字。 让我们假定两个不同的正整数 (n,m) 是循环的&#xff0c;当且仅当你能通过将 …

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

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

计算机设计大赛 疲劳驾驶检测系统 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 前言 &#x1f525; 优质竞赛项目系列&#x…

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

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

[MS5146T替代ADS1246T、MS5147替代ADS1247、MS5148T替代ADS1248] 2kSPS、24bit Σ-Δ ADC

[MS5146T替代ADS1246T、MS5147替代ADS1247、MS5148T替代ADS1248] 2kSPS、24bit Σ-Δ ADC 主要特点 ◼ 可编程转换速率&#xff1a;最高 2kSPS ◼ 集成输入多路选择器 ◼ PGA 噪声&#xff1a; 70nV(RMS)PGA128 ◼ 集成双路匹配可编程电流源 ◼ 集成低温漂 2.048…