Python 中 urllib、urllib2、urllib3 用法、区别、urlencode、quote() / quote_plus()

Python 标准库:https://docs.python.org/zh-cn/3/library/index.html

Python2.x 库名可用: urllib,urllib2,urllib3,httplib,httplib2。
Python3.x 库名可用: urllib ( urllib2 合并到了 urllib ),urllib3,httplib2。

urllib3 是一个第三方库,不是标准库,与 urllib 及 urllib2 的关系不大。urllib3 功能强大且易于使用的Python HTTP客户端。大部分 Python 生态系统已经在使用 urllib3,你也应该这样做。 urllib3 带来了Python标准库中缺少的许多关键功能。

  • 线程安全。
  • 连接池。
  • 客户端 SSL/TLS 验证。
  • 使用分段编码上传文件。
  • 用于重试请求和处理 HTTP 重定向的帮助程序。
  • 支持 gzip、deflate、brotli 和 zstd 编码。
  • 对 HTTP 和 SOCKS 的代理支持。
  • 100% 测试覆盖率。

1、urllib

总的来说, 使用 Python3.x,记住只有 urllib,想要更简洁好用就用第三方 requests 库

urllib --- URL 处理模块:https://docs.python.org/zh-cn/3.11/library/urllib.html

源代码: Lib/urllib/

urllib 是一个收集了多个涉及 URL 的模块的包:

urllib.parse

urllib.parse 模块是Python的一个重要的URL解析器,其中包含了许多常用的函数,例如urlencode、quote、unquote、quote_plus、unquote_plus等。这些函数能够帮助我们解析URL,加密URL内容,或者将URL转换为可读的内容。

urllib.parse模块用于解析URL,支持对URL的操作包括拆分、拼接、编码、解码等。
urllib.parse模块在功能上分为两大类:URL parsing(URL解析)和URL quoting(URL引用)

拆分和拼接:将url字符串拆分为各种组件,或者将url组件合并为url字符串

urlparse()/urlsplit()

parse_qs()/parse_qsl()

urlunparse()/urlunsplit()

urljoin()

urlencode / urldecode

可以将一个字典类型的参数转换成url格式的参数,常用于构建get请求的参数,如下示例,可以看到 urlencode 将字典类型的参数转换成了URL格式的参数。

import urllib.parse

params = {'name': '张三', 'age': 18, 'sex': '男'}
query_string = urllib.parse.urlencode(params)
print(query_string)

quote() / quote_plus()

这两个函数都用于将字符串进行 URL 编码。它们之间的主要区别在于它们对空格字符(" ")的处理方式不同。

  • quote() 函数将字符串转换为 URL 编码的格式。默认情况下,它会将除了字母、数字和'_.-'之外的特殊字符转换成百分号编码(例如 %20)。quote() 不编码斜线; 空格‘ ’编码为‘%20’
  • quote_plus() 函数的行为与 quote() 类似,但它使用加号(+)来替代空格,这是表单数据在提交时常用的编码方式。除了空格以外,quote_plus() 也会将特殊字符转换成对应的百分号编码。quote_plus() 会编码斜线为‘%2F’; 空格‘ ’编码为‘+’
  • 等等

选择这两个函数中的哪一个取决于你需要编码字符串的具体用途。对于 URL 的路径部分,推荐使用 quote();而对于查询字符串(URL 中 ? 后面的部分),则推荐使用 quote_plus()

quote() 可以将 URL中的特殊字符进行编码,比如中文等,使得它们可以安全地在URL中传递。这个函数有一个可选参数safe,可以指定一些字符不进行编码。下面是一个quote函数的例子:可以看到中文部分被进行了编码,但是“/”,“?”等字符没有被编码。

import urllib.parse

url = 'https://www.example.com/?name=张三&age=18'
encoded_url = urllib.parse.quote(url, safe='/:?=&')
print(encoded_url)

quote_plus() 可以将 URL中的空格和特殊字符进行编码。同样可以通过safe参数指定不进行编码的字符。下面是一个quote_plus 的例子:可以看到空格、中文等被进行了编码。

import urllib.parse

url = 'https://www.example.com/?name=张三 年龄=18'
encoded_url = urllib.parse.quote_plus(url, safe='/:?=&')
print(encoded_url)

unquote() / unquote_plus()

与quote函数相反。将 URL中的编码字符解码成为原字符,

import urllib.parse

encoded_url = 'https://www.example.com/?name=%E5%BC%A0%E4%B8%89&age=18'
url = urllib.parse.unquote(encoded_url)
print(url)

与quote_plus函数相反,将编码后的字符解码成为原字符。

import urllib.parse

encoded_url = 'https%3A%2F%2Fwww.example.com%2F%3Fname%3D%E5%BC%A0%E4%B8%89+%E5%B9%B4%E9%BE%84%3D18'
url = urllib.parse.unquote_plus(encoded_url)
print(url)

2、urllib3

官网地址:https://urllib3.readthedocs.io/en/stable/#

pypi:https://pypi.org/project/urllib3/

安装:pip install urllib3

用户手册

高级用法

API 接口

简单使用

urllib3 主要使用 连接池 进行网络请求的访问,所以访问之前需要先创建一个连接池对象:

import urllib3

# 需要一个PoolManager实例来生成请求,由该实例对象处理与线程池的连接以及线程安全的所有细节
http = urllib3.PoolManager()
# 通过request()方法创建一个请求,该方法返回一个HTTPResponse对象:
resp = http.request('GET', 'https://httpbin.org/robots.txt')
print(resp)
print(resp.data)

关于 requests 包请求农业银行报:https://github.com/whyour/qinglong/issues/1765

import urllib3
from urllib3.util.ssl_ import create_urllib3_context

ctx = create_urllib3_context()
ctx.load_default_certs()
ctx.options |= 0x4  # ssl.OP_LEGACY_SERVER_CONNECT

with urllib3.PoolManager(ssl_context=ctx) as http:
    r = http.request("GET", "https://www.abchina.com/cn/AboutABC/investor_relations/announcements/a-announcement/202408/t20240806_2428311.htm")
    print(r.status)
    print(r.data.decode('utf-8'))

设置 headers

通过 request() 方法向请求(request)中添加一些其他信息:

>>> r = http.request(
...     'POST',
...     'http://httpbin.org/post',
...     fields={'hello': 'world'})

或者:在request()方法中,可以定义一个字典类型(dictionary),并作为headers参数传入:

headers={'X-Something': 'value'}
resp = http.request('GET', 'http://httpbin.org/headers', headers=headers)

设置 url 参数

对于GET等没有请求正文的请求方法,可以简单的通过设置fields参数来设置url参数。

fields = {'arg': 'value'}
resp = http.request('GET', 'http://httpbin.org/get', fields=fields)

如果使用的是POST等方法,则会将fields作为请求的请求正文发送。所以,如果你的POST请求是需要url参数的话,那么需要自己对url进行拼接。

fields = {'arg': 'value'}
resp = http.request('POST', 'http://httpbin.org/get', fields=fields)

设置代理

>>> import urllib3
>>> proxy = urllib3.ProxyManager('http://50.233.137.33:80', headers={'connection': 'keep-alive'})
>>> resp = proxy.request('get', 'http://httpbin.org/ip')
>>> resp.status
200
>>> resp.data
b'{"origin":"50.233.136.254"}\n'

urllib3中没有直接设置cookies的方法和参数,只能将cookies设置到headers中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值