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实现的一个p2p文件传输实例
Jun 04 Python
python 打印出所有的对象/模块的属性(实例代码)
Sep 11 Python
python实现简单爬虫功能的示例
Oct 24 Python
使用pandas对矢量化数据进行替换处理的方法
Apr 11 Python
pandas表连接 索引上的合并方法
Jun 08 Python
Centos 升级到python3后pip 无法使用的解决方法
Jun 12 Python
浅谈Python脚本开头及导包注释自动添加方法
Oct 27 Python
Django框架搭建的简易图书信息网站案例
May 25 Python
python GUI库图形界面开发之PyQt5菜单栏控件QMenuBar的详细使用方法与实例
Feb 28 Python
利用Python如何画一颗心、小人发射爱心
Feb 21 Python
Python 读写 Matlab Mat 格式数据的操作
May 19 Python
python 中的@运算符使用
May 26 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 第二节 数据类型之数值型
2012/04/28 PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
2013/06/20 PHP
PHP遍历目录并返回统计目录大小
2014/06/09 PHP
PHP保存带BOM文件的方法
2015/02/12 PHP
深入理解PHP变量的值类型和引用类型
2015/10/21 PHP
php微信公众平台交互与接口详解
2016/11/28 PHP
php + nginx项目中的权限详解
2017/05/23 PHP
thinkPHP5.0框架事务处理操作简单示例
2018/09/07 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
2019/05/08 PHP
番茄的表单验证类代码修改版
2008/07/18 Javascript
始终在屏幕中间显示Div的代码(css+js)
2011/03/10 Javascript
基于jquery的lazy loader插件实现图片的延迟加载[简单使用]
2011/05/07 Javascript
JQuery扩展插件Validate 3通过参数设置错误信息
2011/09/05 Javascript
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
JSON.stringify转换JSON时日期时间不准确的解决方法
2014/08/08 Javascript
javascript中局部变量和全局变量的区别详解
2015/02/27 Javascript
AngularJS封装$http.post()实例详解
2017/05/06 Javascript
微信小程序自定义多选事件的实现代码
2018/05/17 Javascript
微信小程序中使用wxss加载图片并实现动画效果
2018/08/13 Javascript
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
理理Vue细节(推荐)
2019/04/16 Javascript
解决vue跨域axios异步通信问题
2019/04/17 Javascript
layui使用数据表格实现购物车功能
2019/07/26 Javascript
在nuxt中使用路由重定向的实例
2020/11/06 Javascript
python在windows下实现ping操作并接收返回信息的方法
2015/03/20 Python
基于hashlib模块--加密(详解)
2017/06/21 Python
Python解析命令行读取参数--argparse模块使用方法
2018/01/23 Python
Python协程 yield与协程greenlet简单用法示例
2019/11/22 Python
python机器学习库xgboost的使用
2020/01/20 Python
使用pandas库对csv文件进行筛选保存
2020/05/25 Python
美国最大的无人机经销商:DroneNerds
2018/03/20 全球购物
2015年人事专员工作总结
2015/04/29 职场文书
赢在执行观后感
2015/06/16 职场文书
MySQL索引知识的一些小妙招总结
2021/05/10 MySQL
python基础学习之生成器与文件系统知识总结
2021/05/25 Python
使用pd.merge表连接出现多余行的问题解决
2022/06/16 Python