Python 常用第三方庫 urllib3使用

urllib3 概述

  • 線程安全
  • 連接池管理
  • 客戶端 SSL/TLS 驗證
  • 支持 HTTP 和 SOCKS 代理

官方文檔:urllib3 2.0.4 documentation

urllib3 安裝

  • 通過 pip 安裝
pip install urllib3

urllib3 發送 HTTP 請求

  • 導入 urllib3 模塊
  • 創建 PoolManager 實例
  • 調用 request() 方法
import urllib3

def test_HTTP():
    # 創建連接池對象,默認會校驗證書
    pm = urllib3.PoolManager()
    # 發送HTTP請求
    res = pm.request(method='GET', url="http://httpbin.org/robots.txt")

    print(type(res))

urllib3 HTTPResponse 對象

  • status 屬性
  • headers 屬性
  • data 屬性
import urllib3


def test_response():
    # 創建連接池對象
    pm = urllib3.PoolManager()
    # 發送請求
    resp = pm.request(method='GET', url="http://httpbin.org/ip")

    print(resp.status)  # 查看響應狀態狀態碼
    print(resp.headers)  # 查看響應頭信息
    print(resp.data)  # 查看響應原始二進制信息

urllib3 解析響應內容

  • 二進制響應內容解碼
  • JSON 字符串
import urllib3
import json

def test_response():
    pm = urllib3.PoolManager()
    resp = pm.request(method='GET', url="http://httpbin.org/ip")

    # 獲取二進制形式的響應內容
    raw = resp.data
    print(type(raw), raw)
    # 使用utf-8解碼成字符串
    content = raw.decode('utf-8')
    print(type(content), content)
    # 將JSON字符串解析成字典對象
    dict_obj = json.loads(content)
    print(type(dict_obj), dict_obj)
    print(dict_obj['origin'])

urllib3 request 請求參數

  • 語法:request(method, url, fields, headers, **)

  • 必填

    • method:請求方式
    • url:請求地址
  • 選填

    • headers:請求頭信息
    • fields:請求體數據
    • body:指定請求體類型
    • tiemout:設置超時時間

urllib3 定製請求數據

  • 定製請求頭信息
  • 使用 headers 參數
import urllib3
import json

def test_headers():
    pm = urllib3.PoolManager()
    url = "http://httpbin.org/get"

    # 定製請求頭
    headers = {'School': 'hogwarts'}
    resp = pm.request('GET', url, headers=headers)

urllib3 定製請求數據

  • 定製查詢字符串參數

    • fields 參數:適用於GET, HEAD, DELETE 請求
    • 拼接url:適用於POST, PUT請求

urllib3 定製請求數據

import urllib3
import json

# GET/HEAD/DELETE 請求
def test_fields():
    pm = urllib3.PoolManager()
    url = "http://httpbin.org/get"
    fields = {'school': 'hogwarts'}
    resp = pm.request(method='GET', url=url, fields=fields)

# POST/PUT 請求
def test_urlencode():
   # 從內置庫urllib的parse模塊導入編碼方法
    from urllib.parse import urlencode
    pm = urllib3.PoolManager()
    url = "http://httpbin.org/post"
    # POST和PUT請求需要編碼後拼接到URL中
    encoded_str = urlencode({'school': 'hogwarts'})
    resp = pm.request('POST', url=url+"?"+encoded_str)

urllib3 定製請求數據

  • 提交 form 表單數據
  • 類型 'Content-Type': 'multipart/form-data
  • 請求方式:POST、PUT
import urllib3
import json

# POST/PUT 請求
def test_form():
    pm = urllib3.PoolManager()
    url = "http://httpbin.org/post"
    fields = {'school': 'hogwarts'}

    # fields數據會自動轉成form格式提交
    resp = pm.request('POST', url, fields=fields)

urllib3 定製請求數據

  • 提交 JSON 格式數據
  • 類型:'Content-Type': 'application/json'
  • 請求方式:POST、PUT
import urllib3
import json

def test_json():
    pm = urllib3.PoolManager()
    url = "http://httpbin.org/post"

    # 設定請求體數據類型
    headers={'Content-Type': 'application/json'}

    # JSON文本數據
    json_str = json.dumps({'school': 'hogwarts'})
    resp = pm.request('POST', url, headers=headers, body=json_str)

urllib3 定製請求數據

  • timeout :設置超時時間
  • 時間單位:秒
  • 值的格式:float 類型
import urllib3


def test_timeout():
    pm = urllib3.PoolManager()
    # 訪問這個地址,服務器會在3秒後響應
    url = "http://httpbin.org/delay/3"

    # 設置超時時長
    resp = pm.request(method='GET', url=url, timeout=4.0)
    assert resp.status == 200

urllib3 發送 HTTPS 請求

  • HTTPS 請求默認需要校驗證書

  • PoolManager 的 cert_reqs 參數

    • "CERT_REQUIRED":需要校驗
    • "CERT_NONE":取消校驗
import urllib3
import json


def test_HTTPS():
    # 創建不校驗證書的連接池對象
    pm_https = urllib3.PoolManager(cert_reqs="CERT_NONE")
    url = "https://httpbin.ceshiren.com/get"

    # 發送HTTPS請求
    resp = pm_https.request(method='GET', url=url)
    print(json.dumps(resp.data.decode('utf-8')))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章