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 主要使用 连接池 进行网络请求的访问,所以访问之前需要先创建一个连接池对象:

# 导入urllib3模块:
>>> import urllib3
# 需要一个PoolManager实例来生成请求,由该实例对象处理与线程池的连接以及线程安全的所有细节,不需要任何人为操作:
>>> http = urllib3.PoolManager()
# 通过request()方法创建一个请求,该方法返回一个HTTPResponse对象:
>>> r = http.request('GET', 'http://httpbin.org/robots.txt')
>>> r.status
200
>>> r.data
'User-agent: *\nDisallow: /deny\n'

设置 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中。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python3,可以使用urllib.parse模块的urlencode方法来编码字典为键值对字符串形式。具体使用方法是导入urllib.parse模块,然后调用urlencode方法,并传入字典作为参数。例如,如果我们有一个字典wd={"wd":"传智播客"},我们可以使用以下代码来编码它:urllib.parse.urlencode(wd)。这将返回编码后的字符串。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python2和Python3urlliburlencode的引用方式的区别](https://blog.csdn.net/zoulonglong/article/details/80484354)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [解决python 3 urllib 没有 urlencode 属性的问题](https://download.csdn.net/download/weixin_38672800/12860133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [python 3 urllib 没有 urlencode 属性](https://blog.csdn.net/qq_38709565/article/details/81110095)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值