Python urllib3软件包的使用说明


Posted in Python onNovember 18, 2020

urllib3是一款Python 3的HTTP客户端。

Python标准库提供了urllib。在Python 2中,另外提供了urllib2;而在Python 3中,重构了urllib和urllib2到标准库urllib,并另外提供了urllib3。

1. urllib3的特性

线程安全

连接缓冲池

客户端SSL/TLS验证

文件上传

请求重试

HTTP重定向

支持gzip和deflate encoding

支持HTTP和SOCKS的代理

2. 安装

urllib3不是Python 3的标准库,要使用需要另外安装,pip命令如下:

pip install urllib3

3. 用法

1) HTTP GET请求

>>> import urllib3
>>> http = urllib3.PoolManager()
>>> r = http.request('GET', 'http://httpbin.org/robots.txt')
>>> r.status
200
>>> r.data
...
>>> r.headers
...

注意:任何HTTP请求,只有通过PoolManager对象发出,才能够提供连接缓冲池和线程安全特性。

任何请求的返回对象都是HTTPResponse对象,其中包含status, data和headers三个属性。

2) HTTP POST请求

>>> import urllib3
>>> http = urllib3.PoolManager()
>>> r = http.request('POST', 'http://httpbin.org/post', fields={'hello': 'Xiangbin'})
>>> r.status
200
>>> r.data
...
>>> r.headers
...

3) JSON响应的处理

>>> import urllib3
>>> import json
 
>>> http = urllib3.PoolManager()
>>> r = http.request('GET', 'http://httpbin.org/ip')
>>> r.data
b'{\n "origin": "10.23.1.37"\n}\n'
>>> json.loads(r.data.decode('utf-8'))
{'origin': '127.0.0.1'}

注意:使用json的loads()方法

4) 流式响应的处理

>>> import urllib3
>>> http = urllib3.PoolManager()
>>> r = http.request('GET', 'http://httpbin.org/bytes/1024', preload_content=False)
>>> for chunk in r.stream(32):
...   print(chunk)
...
>>> r.release_conn()

注意:preload_content=False表示流式处理响应数据。

处理stream()方法读取响应数据之外,还可以使用read()方法,示例如下:

>>> import urllib3
>>> http = urllib3.PoolManager()
>>> r = http.request('GET', 'http://httpbin.org/bytes/1024', preload_content=False)
>>> r.read(4)
b'\x88\x1f\x8b\xe5' 
>>> r.release_conn()

5) 请求带参数

>>> r = http.request('GET', 'http://httpbin.org/headers', fields={'hello': 'Xiangbin'}, headers={'X-Something': 'value'})

对于POST和PUT方法,需要将参数编码后,这样才可以追加到URL,示例如下:

>>> from urllib.parse import urlencode
>>> encoded_args = urlencode({'arg': 'value'})
>>> url = 'http://httpbin.org/post?' + encoded_args
>>> r = http.request('POST', url)

当然,最好还是以fields参数形式,urllib3将自动编码,示例如下:

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

使用JSON模块,还可以以body形式发送请求参数,示例如下:

>>> import json
>>> data = {'Hello': 'Xiangbin'}
>>> encoded_data = json.dumps(data).encode('utf-8')
>>> r = http.request('POST', 'http://httpbin.org/post', body=encoded_data, headers={'Content-Type': 'application/json'})
>>> json.loads(r.data.decode('utf-8'))['json']
{'Hello': 'Xiangbin'}

6) 上传文件

文本文件

>>> with open('example.txt') as fp:
...   file_data = fp.read()
>>> r = http.request(
...   'POST',
...   'http://httpbin.org/post',
...   fields={
...     'filefield': ('example.txt', file_data, 'text/plain'),
...   })
>>> json.loads(r.data.decode('utf-8'))['files']
{'filefield': '...'}

注意:上传文件必须使用POST方法。

二进制文件

>>> with open('example.jpg', 'rb') as fp:
...   binary_data = fp.read()
>>> r = http.request(
...   'POST',
...   'http://httpbin.org/post',
...   body=binary_data,
...   headers={'Content-Type': 'image/jpeg'})
>>> json.loads(r.data.decode('utf-8'))['data']
b'...'

补充知识:Python的requests软件包详解

requests是一款Python的第三方HTTP类库,便于进行HTTP访问。

1. requests的特性

能够发送HTTP 1.1请求

无需手工为GET方法设置URL的请求参数,无需手工为POST方法组编码表单形式

借助于urllib3实现HTTP请求的连接会话缓存

支持Python 2.6, 2.7, 3.3-3.7

2. requests的安装

requests不是Python标准库,需要使用PIP安装,命令如下:

pip install requests

安装过程如下:

C:\Sam\works>pip install requests
Collecting requests
 Downloading https://files.pythonhosted.org/packages/51/bd/23c926cd341ea6b7dd0b2a00aba99ae0f828be89d72b2190f27c11d4b7fb/requests-2.22.0-py2.py3-none-any.whl (57kB)
  100% |????????????????????????????????| 61kB 17kB/s
Collecting certifi>=2017.4.17 (from requests)
 Downloading https://files.pythonhosted.org/packages/18/b0/8146a4f8dd402f60744fa380bc73ca47303cccf8b9190fd16a827281eac2/certifi-2019.9.11-py2.py3-none-any.whl (154kB)
  100% |????????????????????????????????| 163kB 18kB/s
Collecting idna<2.9,>=2.5 (from requests)
 Downloading https://files.pythonhosted.org/packages/14/2c/cd551d81dbe15200be1cf41cd03869a46fe7226e7450af7a6545bfc474c9/idna-2.8-py2.py3-none-any.whl (58kB)
  100% |????????????????????????????????| 61kB 10kB/s
Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 (from requests)
 Downloading https://files.pythonhosted.org/packages/e0/da/55f51ea951e1b7c63a579c09dd7db825bb730ec1fe9c0180fc77bfb31448/urllib3-1.25.6-py2.py3-none-any.whl (125kB)
  100% |????????????????????????????????| 133kB 32kB/s
Collecting chardet<3.1.0,>=3.0.2 (from requests)
 Downloading https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl (133kB)
  100% |????????????????????????????????| 143kB 48kB/s
Installing collected packages: certifi, idna, urllib3, chardet, requests
Successfully installed certifi-2019.9.11 chardet-3.0.4 idna-2.8 requests-2.22.0 urllib3-1.25.6
You are using pip version 19.0.3, however version 19.3.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.

3. requests的接口

1) Main interfaces

requests.request()
requests.head()
requests.get('url', params={'key1':'value1', 'key2':'value2'},headers={'user-agent': '...'}, cookies={'name1':'value2'})
requests.post('url', data={'key':'value'})
requests.post('url', json={'key':'value'})
requests.post('url', files={'uploaded_file': open('report.xls', 'rb')})
requests.post('url', files={'uploaded_file': ('report.xls', open('report.xls', 'rb'), 'application/excel', {'Expires': '0'})})
requests.post('url', files={'uploaded_file': ('temp.txt', 'one line\ntwo lines\n')})
requests.put('url', data={'key':'value'})
requests.patch()
requests.delete('url')
def getGithub():
  github_url = 'https://api.github.com/user/repos'
  myresponse = requests.get(github_url, auth=('champagne', 'myPassword'))
  print(myresponse.json())
def postGithub():
  github_url = 'https://api.github.com/user/repos'
  data = json.dumps({'name':'python test', 'description':'a python test repo'})
  myresponse = requests.post(github_url, data, auth=('champagne', 'myPassword'))
  print(myresponse.text)

2) requests.Session类

import requests

requests.Session()

3) requests.Request类

import requests

requests.Request('GET', 'http://httpbin.org/get')

4) requests.PreparedRequest类

import requests
req = requests.Request('GET', 'http://httpbin.org/get')
preq = req.prepare()

5) requests.Response类

import requests
r = requests.get('https://api.github.com/events')
r.headers['content-type'] #'application/json;charset=utf8'
r.url
r.status_code #200==requests.codes.ok
r.encoding #'utf-8' by default
r.raw #raw content
r.text #text content
r.content #binary content
r.json()#json content, recommended
r.cookies['a_key']

注意:调用json()方法,如果返回结果不是有效的JSON数据,则抛出ValueError异常。

6) requests.adapters.BaseAdapter类

7) requests.adapters.HTTPAdapter类

requests提供的使用urllib3的HTTP Adapter

以上这篇Python urllib3软件包的使用说明就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 命令行非阻塞输入的小例子
Sep 27 Python
Python中让MySQL查询结果返回字典类型的方法
Aug 22 Python
python 中的divmod数字处理函数浅析
Oct 17 Python
Python编程中NotImplementedError的使用方法
Apr 21 Python
python验证码识别教程之利用滴水算法分割图片
Jun 05 Python
python实现简单多人聊天室
Dec 11 Python
Python实现一个带权无回置随机抽选函数的方法
Jul 24 Python
python爬虫刷访问量 2019 7月
Aug 01 Python
python系统指定文件的查找只输出目录下所有文件及文件夹
Jan 19 Python
pandas中的数据去重处理的实现方法
Feb 10 Python
Django model class Meta原理解析
Nov 14 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
Mar 03 Python
Python从文件中读取数据的方法步骤
Nov 18 #Python
详解Python中如何将数据存储为json格式的文件
Nov 18 #Python
python3中calendar返回某一时间点实例讲解
Nov 18 #Python
关于Python3的import问题(pycharm可以运行命令行import错误)
Nov 18 #Python
python 实现弹球游戏的示例代码
Nov 17 #Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
Nov 17 #Python
python 发送get请求接口详解
Nov 17 #Python
You might like
用PHP和ACCESS写聊天室(五)
2006/10/09 PHP
探讨:如何通过stats命令分析Memcached的内部状态
2013/06/14 PHP
php数据类型判断函数有哪些
2013/09/23 PHP
PHP多态代码实例
2015/06/26 PHP
php+ajax实现无刷新分页
2015/11/18 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
[原创]PHP实现SQL语句格式化功能的方法
2017/07/28 PHP
JavaScript跨平台的开源框架NativeScript
2015/03/24 Javascript
javascript实现对表格元素进行排序操作
2015/11/18 Javascript
基于Jquery实现焦点图淡出淡入效果
2015/11/30 Javascript
js中用cssText设置css样式的简单方法
2016/09/19 Javascript
Bootstrap幻灯片轮播图支持触屏左右手势滑动的实现方法
2016/10/13 Javascript
JavaScript组成、引入、输出、运算符基础知识讲解
2016/12/08 Javascript
原生js实现弹出层效果
2017/01/20 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
2017/09/18 Javascript
vue.js轮播图组件使用方法详解
2018/07/03 Javascript
详解vue通过NGINX部署在子目录或者二级目录实践
2018/09/03 Javascript
React Hooks的深入理解与使用
2018/11/12 Javascript
JavaScript基础之this和箭头函数详析
2019/09/05 Javascript
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
[02:32]【DOTA2亚洲邀请赛】iceice,梦开始的地方
2017/03/13 DOTA
python在windows命令行下输出彩色文字的方法
2015/03/19 Python
详解在Python的Django框架中创建模板库的方法
2015/07/20 Python
python如何通过twisted实现数据库异步插入
2018/03/20 Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
2019/01/02 Python
python中return的返回和执行实例
2019/12/24 Python
python如何随机生成高强度密码
2020/08/19 Python
python 如何上传包到pypi
2020/12/24 Python
慕尼黑山地运动、户外服装和体育用品专家:Sporthaus Schuster
2019/08/27 全球购物
SQL面试题
2013/12/09 面试题
软件测试企业面试试卷
2016/07/13 面试题
jQuery treeview树形结构应用
2021/03/24 jQuery
计算机开发个人求职信范文
2013/09/26 职场文书
商务专员岗位职责范本
2014/06/29 职场文书
600字作文之感受大自然
2019/11/27 职场文书
Mysql中常用的join连接方式
2022/05/11 MySQL