1. 程式人生 > 程式設計 >Python urllib3軟體包的使用說明

Python urllib3軟體包的使用說明

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',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',fields={'hello': 'Xiangbin'})

使用JSON模組,還可以以body形式傳送請求引數,示例如下:

>>> import json
>>> data = {'Hello': 'Xiangbin'}
>>> encoded_data = json.dumps(data).encode('utf-8')
>>> r = http.request('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',...   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,'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軟體包的使用說明就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。