Python3 urllib 详解

news/2025/9/23 10:12:34/文章来源:https://www.cnblogs.com/xtcoding/p/19106663

Python3 urllib 详解

在 Python 的网络编程领域,urllib是一个历史悠久且功能完善的标准库,它提供了处理 URL 请求、解析 URL、处理网络异常等一系列功能。与第三方库(如requests)相比,urllib无需额外安装,随 Python 环境自带,适合轻量网络操作和对环境依赖有严格限制的场景。本文将从核心模块、基础用法到高级技巧,全面解析 Python3 中的urllib

一、urllib 的核心组成

Python3 的urllib是一个包含多个子模块的集合,每个子模块专注于不同的功能,核心模块包括:
 
子模块功能描述核心场景
urllib.request 发送 HTTP 请求(GET/POST 等),获取响应 爬取网页、调用 API
urllib.parse 解析 URL、处理查询参数、编码数据 构造 URL、处理请求参数
urllib.error 定义网络请求中的异常类,用于错误处理 捕获 404/500 等错误、网络超时等
urllib.robotparser 解析网站的robots.txt文件,判断爬取权限 合规爬虫开发

二、urllib.request:发送 HTTP 请求的核心工具

urllib.requesturllib中最常用的模块,负责发起 HTTP/HTTPS 请求并获取服务器响应。其核心函数是urlopen(),可直接打开一个 URL 并返回响应对象。

2.1 基础用法:发送 GET 请求

GET 是最常见的 HTTP 请求方法,用于从服务器获取资源。urlopen()默认使用 GET 方法,示例如下:
 
import urllib.request# 1. 发送GET请求(默认方法)
url = "https://httpbin.org/get"  # 测试API,返回请求信息
response = urllib.request.urlopen(url)# 2. 处理响应
print("状态码:", response.status)  # 200(成功)
print("响应头:", response.getheaders())  # 所有响应头信息
print("响应体(字节):", response.read()[:100])  # 读取响应体(前100字节)
print("响应体(字符串):", response.read().decode("utf-8"))  # 解码为字符串
 
 
关键说明
 
  • responseHTTPResponse对象,包含服务器返回的所有信息;
  • read()方法返回响应体的字节流(bytes类型),需用decode("utf-8")转为字符串;
  • 一次read()后,指针会移至末尾,再次调用需重新请求或使用response.seek(0)重置指针。

2.2 发送 POST 请求

POST 请求用于向服务器提交数据(如表单提交、API 参数传递),需通过data参数指定提交的数据(需为bytes类型)。
 
import urllib.request
import urllib.parse# 1. 定义URL和提交的数据
url = "https://httpbin.org/post"
data = {"name": "张三","age": 25,"hobby": ["coding", "reading"]
}# 2. 编码数据(字典→查询字符串→字节流)
# urlencode()将字典转为"name=张三&age=25..."格式(字符串)
# encode()将字符串转为bytes类型(POST数据必须为bytes)
encoded_data = urllib.parse.urlencode(data).encode("utf-8")# 3. 发送POST请求(指定data参数)
response = urllib.request.urlopen(url, data=encoded_data)# 4. 打印响应(服务器会返回提交的数据,用于验证)
print(response.read().decode("utf-8"))
 
 
核心步骤
 
  • 使用urllib.parse.urlencode()将字典转为 URL 编码的字符串(如name=%E5%BC%A0%E4%B8%89,中文会自动编码);
  • 通过encode("utf-8")将字符串转为bytes类型,满足urlopen()data参数的要求;
  • 若不指定dataurlopen()默认使用 GET 方法。

2.3 自定义请求:设置请求头、方法等

urlopen()的功能有限,若需设置请求头(如模拟浏览器)、指定请求方法(如 PUT/DELETE),需使用urllib.request.Request类构造自定义请求。

示例:模拟浏览器发送请求(设置 User-Agent)

许多网站会拒绝无浏览器标识的请求,通过设置User-Agent可模拟浏览器:
import urllib.request# 1. 定义URL和请求头
url = "https://httpbin.org/get"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36","Referer": "https://www.baidu.com"  # 可选,模拟来源页面
}# 2. 构造Request对象(包含URL、请求头)
req = urllib.request.Request(url=url, headers=headers)# 3. 发送请求
response = urllib.request.urlopen(req)# 4. 验证请求头是否生效(服务器返回的请求信息中应包含User-Agent)
print(response.read().decode("utf-8"))
 

示例:发送 PUT/DELETE 请求

import urllib.request# 发送PUT请求
url = "https://httpbin.org/put"
req = urllib.request.Request(url=url, method="PUT")  # 指定方法为PUT
response = urllib.request.urlopen(req)
print("PUT响应:", response.status)  # 200# 发送DELETE请求
url = "https://httpbin.org/delete"
req = urllib.request.Request(url=url, method="DELETE")
response = urllib.request.urlopen(req)
print("DELETE响应:", response.status)  # 200
 

三、urllib.parse:URL 解析与数据编码工具

urllib.parse模块提供了 URL 处理的核心功能,包括解析 URL、拼接 URL、编码请求参数等,是构造合法请求的重要工具。

3.1 解析 URL:urlparse () 与 urlunparse ()

urlparse()可将 URL 字符串拆分为 6 个部分(协议、域名、路径等),urlunparse()则相反,将拆分后的部分重新组合为 URL。
 
from urllib.parse import urlparse, urlunparse# 解析URL
url = "https://www.example.com:8080/path/index.html?name=张三&age=25#anchor"
parsed = urlparse(url)print("协议(scheme):", parsed.scheme)  # https
print("域名(netloc):", parsed.netloc)  # www.example.com:8080
print("路径(path):", parsed.path)      # /path/index.html
print("查询参数(query):", parsed.query)  # name=张三&age=25
print("锚点(fragment):", parsed.fragment)  # anchor# 重新组合URL
components = (parsed.scheme,parsed.netloc,"/new/path",  # 修改路径parsed.params,parsed.query,parsed.fragment
)
new_url = urlunparse(components)
print("新URL:", new_url)  # https://www.example.com:8080/new/path?name=张三&age=25#anchor
 

3.2 处理查询参数:urlencode () 与 parse_qs ()

urlencode()用于将字典转为 URL 查询字符串(如name=张三&age=25),parse_qs()则将查询字符串解析为字典。
 
from urllib.parse import urlencode, parse_qs# 字典→查询字符串(用于构造GET参数或POST数据)
params = {"name": "张三","age": 25,"hobby": ["coding", "reading"]  # 列表会转为多个同名参数
}
query_string = urlencode(params)
print("查询字符串:", query_string)  # name=%E5%BC%A0%E4%B8%89&age=25&hobby=coding&hobby=reading# 查询字符串→字典(用于解析响应中的参数)
parsed_params = parse_qs(query_string)
print("解析后的字典:", parsed_params)
# {'name': ['张三'], 'age': ['25'], 'hobby': ['coding', 'reading']}
# 注意:值为列表(因可能有多个同名参数)
 

3.3 编码与解码特殊字符:quote () 与 unquote ()

URL 中不能包含空格、中文等特殊字符,需通过quote()编码;unquote()则用于解码。
 
from urllib.parse import quote, unquote# 编码特殊字符(中文、空格等)
original = "张三 & 李四"
encoded = quote(original)
print("编码后:", encoded)  # %E5%BC%A0%E4%B8%89%20%26%20%E6%9D%8E%E5%9B%9B# 解码
decoded = unquote(encoded)
print("解码后:", decoded)  # 张三 & 李四
 

四、urllib.error:网络异常处理

网络请求可能因各种原因失败(如页面不存在、网络超时),urllib.error定义了两类主要异常,用于捕获和处理这些错误。

4.1 HTTPError:HTTP 协议错误(如 404、500)

HTTPErrorURLError的子类,对应 HTTP 响应中的错误状态码(4xx 客户端错误、5xx 服务器错误),包含状态码、响应头等信息。
 
import urllib.request
from urllib.error import HTTPErrorurl = "https://httpbin.org/status/404"  # 模拟404错误try:response = urllib.request.urlopen(url)
except HTTPError as e:print("HTTP错误状态码:", e.code)  # 404print("错误响应头:", e.headers)print("错误响应体:", e.read().decode("utf-8"))
 

4.2 URLError:通用网络错误(如无网络、域名不存在)

URLError涵盖非 HTTP 协议的错误(如网络中断、域名解析失败),错误原因可通过reason属性获取。
 
import urllib.request
from urllib.error import URLErrorurl = "https://invalid.example.invalid"  # 无效域名try:response = urllib.request.urlopen(url, timeout=5)
except URLError as e:print("网络错误原因:", e.reason)  # [Errno -2] Name or service not known
 

4.3 异常捕获顺序

由于HTTPErrorURLError的子类,捕获时需先处理HTTPError,再处理URLError,否则HTTPError会被URLError捕获:
 
try:response = urllib.request.urlopen(url)
except HTTPError as e:print("HTTP错误:", e.code)
except URLError as e:print("网络错误:", e.reason)
else:print("请求成功,状态码:", response.status)
 

五、高级用法:代理、Cookie 与超时设置

urllib虽基础,但也支持代理、Cookie 管理等高级功能,需结合HandlerOpener实现。

5.1 使用代理服务器

通过ProxyHandler设置代理,可隐藏真实 IP 或访问受限资源:
 
import urllib.request# 1. 定义代理(键为协议,值为"代理IP:端口")
proxies = {"http": "http://123.45.67.89:8080","https": "https://123.45.67.89:8080"
}# 2. 创建代理处理器
proxy_handler = urllib.request.ProxyHandler(proxies)# 3. 构建自定义Opener
opener = urllib.request.build_opener(proxy_handler)# 4. 使用Opener发送请求(替代urlopen())
url = "https://httpbin.org/get"
response = opener.open(url)
print(response.read().decode("utf-8"))  # 响应中会包含代理IP信息
 

5.2 处理 Cookie

http.cookiejar模块(需与urllib配合)用于管理 Cookie,实现登录状态保持等功能:
 
import urllib.request
import http.cookiejar# 1. 创建CookieJar对象(存储Cookie)
cookie_jar = http.cookiejar.CookieJar()# 2. 创建Cookie处理器
cookie_handler = urllib.request.HTTPCookieProcessor(cookie_jar)# 3. 构建Opener(自动处理Cookie)
opener = urllib.request.build_opener(cookie_handler)# 4. 发送请求(登录操作,假设该URL会返回Cookie)
login_url = "https://httpbin.org/cookies/set?session=123456"
opener.open(login_url)# 5. 访问需要登录的页面(会自动携带Cookie)
profile_url = "https://httpbin.org/cookies"
response = opener.open(profile_url)
print("当前Cookie:", response.read().decode("utf-8"))  # 应包含session=123456
 

5.3 设置超时时间

避免请求因网络问题无限等待,通过timeout参数设置超时(单位:秒):
 
import urllib.request
from urllib.error import URLErrorurl = "https://httpbin.org/delay/10"  # 延迟10秒响应的测试URLtry:# 设置超时为5秒(超过则抛出URLError)response = urllib.request.urlopen(url, timeout=5)
except URLError as e:print("超时错误:", e.reason)  # [Errno 110] Connection timed out
 

六、urllib.robotparser:合规爬虫工具

urllib.robotparser用于解析网站的robots.txt文件,判断爬虫是否有权限访问特定 URL,是合规爬虫的基础工具。
 
from urllib.robotparser import RobotFileParser# 1. 创建解析器并加载robots.txt
rp = RobotFileParser()
rp.set_url("https://www.example.com/robots.txt")  # 指定robots.txt的URL
rp.read()  # 读取并解析文件# 2. 判断爬虫是否有权限访问URL
user_agent = "my_crawler"  # 爬虫标识
url1 = "https://www.example.com/public/page"  # 允许访问的URL
url2 = "https://www.example.com/private/page"  # 禁止访问的URLprint(f"能否访问{url1}:", rp.can_fetch(user_agent, url1))  # True
print(f"能否访问{url2}:", rp.can_fetch(user_agent, url2))  # False
 

七、urllib 的局限性与替代方案

urllib作为标准库,功能稳定但用法相对繁琐,存在以下局限性:
 
  • 不支持会话保持(需手动管理 Cookie);
  • 处理复杂表单(如文件上传)时代码冗长;
  • 无默认连接池,高并发请求效率低。
 
若需更简洁的 API 或高级功能,推荐使用第三方库requests(需pip install requests),其语法更直观(如requests.get()requests.post()),内置会话管理和连接池。

八、总结

urllib是 Python 处理 URL 请求的基础标准库,通过urllib.request发送请求、urllib.parse处理 URL、urllib.error捕获异常,可满足大部分轻量网络操作需求。其核心优势在于 “零依赖”,适合环境受限的场景(如服务器无外网权限安装第三方库)。
 
掌握urllib的使用,不仅能完成简单的爬虫、API 调用,更能帮助理解 HTTP 协议的底层交互逻辑

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

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

相关文章

(转)使用 Embarcadero Delphi FMX 应用程序实现多点触控

原文地址:https://www.softacom.com/blog/development/how-to-add-multi-touch-to-an-embarcadero-delphi-fmx-app/

成功案例 网站互联网+营销策略怎么写

练习1编写Order类,有int型的orderId,String型的orderName,相应的getter()和setter()方法,两个参数的构造器, 重写父类的equals()方法:public boolean equals(Object obj),并判断测试类中创建的两…

百度云服务ubtuntu安装docker

1. 更新你的包管理器和安装必要的包 sudo apt-get update sudo apt-get install -y \ ca-certificates \ curl \ gnupg \ lsb-release 2. 添加Docker的官方GPG密钥 curl -fsSL https://download.docker.co…

YKM-1Z-16

YKM-1Z-16YKM:通常是某些厂家的继电器系列代号。1Z:表示触点形式是 单刀双掷 (1 转换触点,SPDT)。16:常常表示 触点的额定电流 16A。👉 综合起来,YKM-1Z-16 就是一个 16A 单刀双掷继电器,常用于工业控制、电气…

景洪服装网站建设网络营销主要学些什么

[css] 如何写高效的CSS? 唔,自动补全、预编译这些辅助手段确实能提升一定的效率, 但我觉得真正能提升效率的是,不看预览就敢上手的理论知识。 见过太多加几行就要预览下效果的开发了,哪怕给他双屏其实也还是会拖慢节奏…

如何用网站做推广网站管理助手4.0破解

前言 在前面例程中谈到了C 通过Snap7开源库S7通信库跟西门子S7-1200PLC/S7-1500PLC以及合信CTMC M226ES PLC/CPU226 PLC通信的方式方法和应用例程。但是遗憾的是Snap7中根据官方资料显示只能访问PLC的 DB区、MB区、C区、T区 、I区、Q区,并没有提到有关如何访问S7-20…

广西建设网站在线服务wordpress更新机制

文章目录 配置文件一、Yaml 文件1.1 修改banner1.2 日志1.3 端口1.4 属性提示消失解决方案 二、Properties 文件三、配置高级3.1 临时属性3.2 临时属性(开发环境)3.3 配置文件四级分类3.3.1 原始配置文件(四级)3.3.2 config目录下…

昆山市住房和城乡建设局网站谷歌查询关键词的工具叫什么

今日目标 掌握纯注解开发依赖注入(DI)模式 学习使用纯注解进行第三方Bean注入 1 注解开发依赖注入(DI)【重点】 问题导入 思考:如何使用注解方式将Bean对象注入到类中 1.1 使用Autowired注解开启自动装配模式(按类型) Service public class StudentS…

设计制作实践活动感悟win优化大师怎么样

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 目录 一BIOS 1破解密码的前提 2B…

自己建网站能赚钱吗无锡百姓网推广代理商

撤销当前的操作 使用原因及解决的问题 基本上暴力搜索的问题 适用于 组合问题 [1,2,3,4] 两位数的组合有哪些切割问题 给定字符串,求切割方式使其字串都是回文子串子集问题 求 [1,2,3,4] 的子集排列组合 组合(不强调顺序)棋盘问题 如何理解回溯法 抽象为一个树形结构 回溯…

湛江网站制作工具网页设计在大学属于什么专业

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid1728 题意:走迷宫,找最小的拐角 题解:对BFS有了新的理解,DFS剪枝应该也能过,用BFS就要以拐角作为增量来搜,即以当前点为坐标,4…

高密网站开发电子商务公司排行榜

12月7日,由热度电商、热度云、集脉新电商联合举办的「破局新渠道」热度全域达人分销生态大会暨热度云3.0发布会在杭州国际博览中心圆满收官。大会邀请了平台官方、电商协会、品牌方、业务操盘手、数据专家、团长机构、达人等达人分销生态中的多个角色,从…

手机怎么做优惠券网站昌吉市静态管理公告最新

目录 前言 一、提高学习力 🧑‍💻 1. 快速找到需要的知识 2. 组合自己的知识体系 3. 内化知识技能 二、提问能力❗ 三、思维、创新能力 🌟 1. 批判性思维 1.1 八大基本结构进行批判性提问 1.2 苏格拉底的提问分类方法 2. 结构化思…

做女装的网站有哪些网站建设和运行费用

一、指针、引用 引用指的是为已经创建的对象重新起一个名字。创建引用的时候,编译器只是将这个别名绑定到引用的对象上。 对象名提供了一种直接访问数据的方式,因为对象名本质上是数据所在的内存地址空间的一个地址映射。 引用提供了一种简介访问数据…

新闻20字摘抄大全杭州网站优化咨询

问题描述 会员从一级完成任务升级到二级以后,一级显示还差经验,这里差的其实是二级到三级的经验,如下图所示 修复方法 1、前端需要修改: 路径:/pages/users/user_vip/index.vue 方便复制: v-if"i…

中国最好的网站建设公司电商运营的网站

目录 1、GRAY色彩空间 2、从BGR色彩空间转换到GRAY色彩空间 2.1色彩空间转换码 2.2实例 BGR色彩空间转换到GRAY色彩空间 3、HSV色彩空间 4、从BGR色彩空间转换到HSV色彩空间 4.1色彩空间转换码 4.2实例 BGR色彩空间转换到HSV色彩空间 1、GRAY色彩空间 GRAY色彩空间通常…

怎么用代码做网站推荐安康网站定制厂家

1,工具-新建用户密钥生成向导linux2,密钥类型选择:RSA,而后下一步shell3,输入密钥名称和密码ssh4,公钥格式为SSH-OpenSSH,保存为文件(后缀为pub)(记录此文件目录)工具二,登陆在须要免密登陆的主…

厚街建设网站wordpress文章内增加标题列表

为顺应信息技术服务业发展趋势及市场需求,维护市场秩序,加强行业自律,促进信息系统服务商交付能力的不断提高,增强信息系统服务商创新能力和国际竞争力,支撑信息系统服务商转型提升,中国软件行业协会、企业…

火星免费建网站成都动力无限 网站 差

前言 本想今年辞掉工作大干一场,没想到碰到疫情,家里蹲了3个月…,还好字节能给一次机会。前阵子字节跳动的提前批开始了,看宣传是说有海量HC,机会多多,本着涨涨面经的心理,然后就投递了一下杭州…

网站开发毕设任务书有没有专门做包装设计的网站

netstat可以查看linux系统中正在使用的服务和端口情况常见参数-a (all)显示所有选项,默认不显示LISTEN相关-t (tcp)仅显示tcp相关选项-u (udp)仅显示udp相关选项-n 拒绝显示别名,能显示数字的全部转化成数字。-l 仅列出有在 Listen (监听) 的服务状态-p …