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库都是一个值得学习和使用的工具。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

试用期自我总结报告10篇

试用期自我总结报告(篇1) 一转眼试用期的时间飞快就过去了,在这段时间里我学习到了很多,也把自己在过去学习的东西得已融会贯通。能够来到幼儿园里成为一名老师是我一直以来的目标,而我也终于完成了自己的目标&#x…

Springboot+vue的医院药品管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的医院药品管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller&#xff09…

如何在RTMP推送端和RTMP播放端支持Enhanced RTMP H.265(HEVC)

技术背景 时隔多年,在Enhancing RTMP, FLV With Additional Video Codecs And HDR Support(2023年7月31号正式发布)官方规范出来之前,如果RTMP要支持H.265,大家约定俗成的做法是扩展flv协议,CDN厂商携手给…

React-Mock数据

1.概念 说明:React中使用Mock数据主要是为了模拟后端接口和数据,以便前端开发可以在没有实际后端支持的情况下进行。 2.实现步骤 2.1安装 npm i -D json-server 2.2准备json文件 {"list":[{"name":"李四","age&q…

【Python】进阶学习:OpenCV--一文详解cv2.namedWindow()

【Python】进阶学习:OpenCV–一文详解cv2.namedWindow() 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望…

编码器-解码器模型(Encoder-Decoder)

注意:本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 ([www.aideeplearning.cn]) 编码器-解码器模型简介 Encoder-Decoder算法是一种深度学习模型结构,广泛应用于自然语言处理(NLP)、图像处理…

mybatis-plus整合spring boot极速入门

使用mybatis-plus整合spring boot,接下来我来操作一番。 一,创建spring boot工程 勾选下面的选项 紧接着,还有springboot和依赖我们需要选。 这样我们就创建好了我们的spring boot,项目。 简化目录结构: 我们发现&a…

java中移位<< >> <<< |数据类型转换

移位 x64转换二进制&#xff1a;100 0000 左移2位 &#xff1a; 1000 0000 0 对应十进制 i 256 >>右移 <<左移 >>无符号位右移 关于右移一位相当于整除2 数据类型及其转换 基本数据类型&#xff0c;数据类型范围 byte(-128~127)&#xff08;-2^7~2…

unity学习(54)——选择角色界面--解析赋值服务器返回的信息1

1.decode这种照猫画虎的工作 把逆向出来UserHandler.cs中的内容&#xff0c;融到自建客户端的MessageManager.cs中&#xff1a; 2.此时登录账号&#xff0c;马上显示当前账号下已有三名角色&#xff1a; 此时返回数据包中的command的值是1&#xff1a; 3.当注册玩家数超过三名…

pytorch的理解

工具的查看与使用帮助 1. dir import torch torch.cuda.is_available()dir(torch) dir(torch.cuda) #可以看到有"is_available" 2. help help(torch.cuda.is_available)

python基础——条件判断和循环【if,while,for,range】

&#x1f4dd;前言&#xff1a; 这篇文章主要讲解一下条件判断语句if和循环语句while&#xff0c;for在python中需要注意的地方。 建议已有一定了解&#xff08;对语句的执行逻辑清楚&#xff09;的读者观看&#xff0c;如果对条件判断和循环的执行逻辑不太清楚&#xff0c;也可…

react实战——react旅游网

慕课网react实战 搭建项目问题1.按照官网在index.tsx中引入antd出错&#xff1f;2.typescript中如何使用react-router3.react-router3.1 V63.2 V53.3V6实现私有路由 4.函数式组件接收props参数时定义数据接口&#xff1f;5.使用TypeScript开发react项目&#xff1a;6.要使一个组…

【C++第四课-类和对象下】初始化列表、静态成员函数、静态成员变量、explicit关键字(隐式类型转换)、友元函数、友元类、内部类、编译器的常见优化

目录 再谈构造函数初始化列表初始化列表解决的问题&#xff1a;静态成员函数、成员变量explicit关键字 友元友元函数友元类 内部类编译器的常见优化&#xff08;了解&#xff09;优化1 再谈构造函数 初始化列表 有一些成员变量是无法在函数体内初始化的&#xff0c;eg&#x…

基于javaweb+springboot开发的城市地名地址信息管理系统设计和实现

基于javaweb(springboot)城市地名地址信息管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言…

CPE-CLIP

input embeddings follow the form [ g 1 , g 2 , . . . , g L g_1,g_2,...,g_L g1​,g2​,...,gL​,w] 辅助信息 作者未提供代码

el-select下拉框无法显示 elementplus踩坑日常

在使用el-select的时候参考了官方文档&#xff0c;但下拉框无法显示 解决办法1&#xff1a;检查是否没有按需引入eloption只引入了elselect 解决办法2&#xff1a;在el-select里面加入:popper-append-to-body"false" <el-select:popper-append-to-body"fa…

基于亚马逊云EC2+Docker搭建nextcloud私有化云盘

亚马逊EC2云服务器&#xff08;Elastic Compute Cloud&#xff09;是亚马逊AWS&#xff08;Amazon Web Services&#xff09;提供的一种云计算服务。EC2代表弹性计算云&#xff0c;它允许用户租用虚拟计算资源&#xff0c;包括CPU、内存、存储和网络带宽&#xff0c;以满足计算…

Intellij IDEA 中 git 操作的快捷键

1.添加新建的文件 即add 操作 shift alt a 2.提交操作 即 commit操作 ctrl k 在窗口中可以用feature来声明此次更新的内容 3.提交操作 即push操作 ctrl shift k 4.拉去远程分支操作 即pull操作 ctrl t

C语言 --- 指针(5)

目录 一.sizeof和strlen对比 1.sizeof 2.strlen 3.strlen 和sizeof的对比 二.数组和指针笔试题目详解 回顾&#xff1a;数组名的理解 1.一维数组 2.字符数组 代码1&#xff1a; 代码2&#xff1a; 代码3&#xff1a; 代码4&#xff1a; 代码5&#xff1a; 代码6&am…

进程伪装详解

前言 当我们获取到一台主机的权限过后&#xff0c;拿到了自己想要搜集的信息&#xff0c;这时候我们就会留一个后门进行权限维持&#xff0c;权限维持的学问其实很深&#xff0c;今天就主要介绍其中一种比较简单的权限维持的方法 -- 进程伪装。 我们知道在windows里面有很多系…