爬蟲基本原理與實戰---3、Urllib庫的基本使用

官方文檔地址:https://docs.python.org/3/library/urllib.html
轉載自:https://www.2cto.com/kf/201801/714859.html

什麼是 Urllib 庫?

 urllib 庫 是 Python 內置的 HTTP 請求庫。urllib 模塊提供的上層接口,使訪問 www 和 ftp 上的數據就像訪問本地文件一樣。有以下幾種模塊:

1.urllib.request 請求模塊
2. urllib.error 異常處理模塊
3. urllib.parse url 解析模塊
4. urllib.robotparser robots.txt 解析模塊

Urllib 庫下的幾種模塊基本使用如下:
urllib.request

關於 urllib.request: urllib.request 模塊提供了最基本的構造 HTTP (或其他協議如 FTP)請求的方法,利用它可以模擬瀏覽器的一個請求發起過程。利用不同的協議去獲取 URL 信息。它的某些接口能夠處理基礎認證 ( Basic Authenticaton) 、redirections (HTTP 重定向)、 Cookies (瀏覽器 Cookies)等情況。而這些接口是由 handlers 和 openers 對象提供的。

一. urlopen

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

參數說明:

url:需要打開的網址
data: Post 提交的數據, 默認爲 None ,當 data 不爲 None 時, urlopen() 提交方式爲 Post
timeout:設置網站訪問超時時間

下面是一個請求實例:

import urllib.request
# 可以是 from urllib import request,語句等價
response = urllib.request.urlopen('https://www.baidu.com')
print("查看 response 響應信息類型: ",type(response))
page = response.read()
print(page.decode('utf-8'))

輸出情況:

查看 response 響應信息類型:  <class>
 <!--STATUS OK--></class>

說明: 直接使用 urllib.request 模塊中的 urlopen方法獲取頁面,其中 page 數據類型爲 bytes 類型,經過 decode 解碼 轉換成 string 類型。通過輸出結果可以 urlopen 返回對象是 HTTPResposne 類型對象。

urlopen 返回一個類文件對象,並提供瞭如下方法:

read() , readline() , readlines() , fileno() , close() :這些方法的使用方式與文件對象完全一樣;
info():返回一個httplib.HTTPMessage對象,表示遠程服務器返回的頭信息;可以通過Quick Reference to Http Headers查看 Http Header 列表。
getcode():返回Http狀態碼。如果是http請求,200表示請求成功完成;404表示網址未找到;
geturl():返回獲取頁面的真實 URL。在 urlopen(或 opener 對象)可能帶一個重定向時,此方法很有幫助。獲取的頁面 URL 不一定跟真實請求的 URL 相同。

使用實例:

import urllib.request
response = urllib.request.urlopen('https://python.org/')
print("查看 response 的返回類型:",type(response))
print("查看反應地址信息: ",response)
print("查看頭部信息1(http header):\n",response.info())
print("查看頭部信息2(http header):\n",response.getheaders())
print("輸出頭部屬性信息:",response.getheader("Server"))
print("查看響應狀態信息1(http status):\n",response.status)
print("查看響應狀態信息2(http status):\n",response.getcode())
print("查看響應 url 地址:\n",response.geturl())
page = response.read()
print("輸出網頁源碼:",page.decode('utf-8'))

關於 Post 數據,下面是一個 Post 實例:

import urllib.request,urllib.parse
url = 'https://httpbin.org/post'
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36',
    'Referer': 'https://httpbin.org/post',
    'Connection': 'keep-alive'
    }
  # 模擬表單提交
dict = {
    'name':'MIka',
    'old:':18
}
data = urllib.parse.urlencode(dict).encode('utf-8')
\#data 數如果要傳bytes(字節流)類型的,如果是一個字典,先用urllib.parse.urlencode()編碼。
req = urllib.request.Request(url = url,data = data,headers = headers)
response = urllib.request.urlopen(req)
page = response.read().decode('utf-8')
print(page)

註解:
如實例易知,在 urlopen 參數 data 不爲 None 時,urlopen() 數據提交方式 爲 Post。urllib.parse.urlencode()方法將參數字典轉化爲字符串。
提交的網址是httpbin.org,它可以提供HTTP請求測試。 https://httpbin.org/post 這個地址可以用來測試 POST 請求,它可以輸出請求和響應信息,其中就包含我們傳遞的 data 參數。

關於 timeout 參數
timeout參數可以設置超時時間,單位爲秒,意思就是如果請求超出了設置的這個時間還沒有得到響應,就會拋出異常,如果不指定,就會使用全局默認時間。它支持 HTTP 、 HTTPS 、 FTP 請求。

相關實例:

import urllib.request
response = urllib.request.urlopen("https://httpbin.org/get",timeout=1)
print(response.read().decode("utf-8"))

輸出結果:

  "args": {}, 
  "headers": {
    "Accept-Encoding": "identity", 
    "Connection": "close", 
    "Host": "httpbin.org", 
    "User-Agent": "Python-urllib/3.6"
  }, 
  "origin": "119.137.62.237", 
  "url": "https://httpbin.org/get"
}

我們試着給timeout一個更小的值,例如timeout=0.1,此時拋出 urllib.error.URLError 異常,錯誤原因爲 time out 。因爲常理下 0.1 s 內根本就不可能得到服務器響應。所以通過設置參數 timeout 的值對於應對網頁響應的速度具有一定的意義。同時,可以通過設置這個超長時間來控制一個網頁如果長時間未響應就跳過它的抓取(可以通過try-catch 語句)。

try-catch 實現異常處理:

import urllib.request
import  socket
import urllib.error
try:
    response = urllib.request.urlopen('https://httpbin.org/get',timeout=0.1)
except urllib.error.URLError as e:
    if  isinstance(e.reason, socket.timeout):
            print("Time out!")

輸出:

Time out!

關於其他參數

Context 參數,必須是 ssl.SSL.Context 類型,用來指定 SSL 設置。cafile、capath 兩個參數是指定 CA 證書和它的路徑,在請求 HTTPS 連接時可能用的上。
cadefault 參數已經棄用,默認爲 False。

二. Request

urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

使用request()來包裝請求,再通過urlopen()獲取頁面。單純使用 urlopen 並不能足以構建一個完整的請求,例如 對拉勾網的請求如果不加上 headers 等信息,就無法正常解析訪問網頁內容。

下面是一個使用實例

import urllib.request
url = "https://www.lagou.com/zhaopin/Python/?labelWords=label"
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36',
    'Referer': 'https://www.lagou.com/zhaopin/Python/?labelWords=label',
    'Connection': 'keep-alive'
}
req = request.Request(url, headers=headers)
page = request.urlopen(req).read()
page = page.decode('utf-8')
print(page)

headers 的參數設置:

User-Agent :這個頭部可以攜帶如下幾條信息:瀏覽器名和版本號、操作系統名和版本號、默認語言。這個數據可以從 網頁開發工具上的請求反應信息中獲取(瀏覽器上一般按 F12 打開開發工具)。作用是用於僞裝瀏覽器。

Referer:可以用來防止盜鏈,有一些網站圖片顯示來源 https://*.com ,就是檢查 Referer 來鑑定的。

Connection:表示連接狀態,記錄 Session 的狀態。

origin_req_host:請求方的 host 名稱或者 IP 地址。

unverifiable:指請求無法驗證,默認爲 False。用戶並沒有足夠的權限來選擇接收這個請求結果,例如請求一個 HTML 文檔中的圖片,但沒有自動抓取圖像的權限,這時 unverifiable 爲 True。

method:指定請求使用的方法,例如 GET、POST、PUT 等。

三. Openers 和 Handlers

當需要獲取一個 URL 時需要使用一個 opener (這是一個不容易理解的對象—-urllib.request.OpenerDirector的實例)。一般情況下通過 urlopen 使用默認的 opener ,但允許自己創建不同的 opener 。Opener 會使用 handlers 。handler 承擔”重活”並知道如何以某個特定的協議(如http,ftp等)打開 URL、知道如何處理 URL的某些行爲(比如 Http 重定向或是 Cookie等)。

引入 Opener(即 OpenerDirector 類)的目的是爲了能夠實現更高級的功能,一般情況下使用的 Request 、 urlopen() 相當於類庫封裝好了的極其常用的請求方法,利用這兩個就可以完成基本的請求。但當需要實現更高級的功能時就需要更高級的實例來完成操作。所以,這裏就用到了比調用 urlopen() 的對象的更普遍的對象—-Opener 。

Opener 通過 Handler 構建,可以使用 open() 方法,返回的類型和 urlopen() 相同。

OpenerDirector操作類是一個管理很多處理類(Handler)的類。這些 Handler 類都對應處理相應的協議,或者特殊功能。

分別有下面的處理類(即 Handler 類):
BaseHandler、HTTPErrorProcessor、HTTPDefaultErrorHandler、HTTPRedirectHandler、ProxyHandler、AbstractBasicAuthHandler、HTTPBasicAuthHandler、ProxyBasicAuthHandler、AbstractDigestAuthHandler、
ProxyDigestAuthHandler、AbstractHTTPHandler、HTTPHandler、HTTPCookieProcessor、UnknownHandler、
FileHandler、FTPHandler、CacheFTPHandler

其中,urllib.request.BaseHandler 是所有其他 Handler 的父類,其提供了最基本的Handler方法。例如:default_open()、protocol_request() 等。

常見的 BaseHandler 子類有:

  • HTTPDefaultErrorHandler :用於處理HTTP響應錯誤,錯誤都會拋出 HTTPError 類型的異常。
  • HTTPRedirectHandler :用於處理重定向。
  • HTTPCookieProcessor: 用於處理 Cookie 。
  • ProxyHandler :用於設置代理,默認代理爲空
  • HTTPPasswordMgr : 用於管理密碼,它維護了用戶名密碼的表。
  • HTTPBasicAuthHandler : 用於管理認證,如果一個鏈接打開時需要認證,那麼可以用它來解決認證問題。 另外還

有其他的 Handler ,可以參考官方文檔。

基本認證(Basic Authentication)

什麼是基本認證?當訪問網頁信息時被要求需要認證(或授權)時,服務器會發送一個頭信息(如果驗證失敗便返回 401 錯誤代碼)請求認證。它指定了一個realm(領域)。這個頭信息的形式看起來會像是:www-Authenticate:SCHEME realm=”REALM”,例如WWW-Authenticate: Basic realm=”cPanel Users”

接着,客戶端應該使用正確的用戶名和密碼重新請求(請求頭中應該包含對應的realm、用戶名以及用戶密碼),這就是“基礎認證”。

通過創建一個 HTTPBasicAuthHandler 並利用 opener 使用這個 handler 可以簡化這個認證過程。

HTTPBasicAuthHandler使用一個叫做密碼管理器(password manager)的對象處理 url 和 realm、用戶名和密碼之間的映射。如果你知道realm(領域)是什麼(根據服務器發送的認證 headers 可以得知),那麼你便可以使用 HTTPPasswordMgr。人們往往不在乎realm是什麼。這種情況下,最方便的是使用HTTPPasswordMgrWithDefaultRealm。它允許你爲一個url指定一個默認的用戶名和密碼。它會在你沒有給某個realm提供用戶名和密碼的時候起作用。這種情況下,需要將 add_password 方法的 realm 參數設置爲 None。

頂層 URL (top-level URL)就是第一個需要認證的 URL,只有是比你傳遞給.add_password() 的 URL更“深層”的 URL 也可以匹配得上。

下面是一個實例:

# -*- coding: utf-8 -*-  
import urllib

# 創建一個密碼管理者  
password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()

# 添加用戶名和密碼  

top_level_url = "https://example.com/foo/" 

# 如果知道 realm, 我們可以使用他代替 ``None``.  
# password_mgr.add_password(None, top_level_url, username, password)  
password_mgr.add_password(None, top_level_url,'username','password')  

# 創建了一個新的handler  
handler = urllib.request.HTTPBasicAuthHandler(password_mgr)  

# 創建 "opener" (OpenerDirector 實例)  
opener = urllib.request.build_opener(handler)  

# 使用 opener 獲取一個URL  
a_url = 'https://www.python.org/' 
x = opener.open(a_url)  
print(x.read().decode("utf-8"))

# 安裝 opener.  
# 現在所有調用 urllib.request.urlopen 將用我們的 opener.  
urllib.request.install_opener(opener)

此處代碼爲實例代碼,用於說明Handler和Opener的使用方法。在這裏,首先實例化了一個HTTPPasswordMgrWithDefaultRealm 對象,然後利用 add_password() 添加進用戶名和密碼,相當於建立了一個處理認證的處理器。接下來利用 urllib.request.build_opener() 方法來利用這個處理器構建一個 Opener ,那麼這個 Opener 在發送請求的時候就具備了認證功能了。最後通過 Opener 的 open() 方法打開 URL,即可以完成認證。

說明幾點:
1. 上面實例中,只將HTTPBasicAuthHandler提供給 build_opener 。
2. 默認情況下,opener可以處理一般情況的 handler—-ProxyHandler(已經設置了代理環境變量如 http_proxy)、UnknownHandler、HTTPHandler、HTTPDefaultErrorHandler、HTTPRedirectHandler、FTPHandler、FileHandler、DataHandler、HTTPErrorProcessor。

實際上,toplevel_url 要麼是一個完整的 URL(包括“http:”模式部分以及主機名和可選的端口號)比如“https://example.com/”,要麼是一個“authority”(即主機名和可選的端口號)例如“example.com”或“example.com:8080”(後者包含了端口號)。該“authority”如果出現的話,不能包含“用戶信息(userinfo)“元素——如“joe@password:example.com” 是不被允許的。

代理
urllib 可以通過 ProxyHandler 自動檢測你的代理設置並使用它們。當代理設置被檢測時,它是普通 handler 的一部分。通常認爲這是好事,當有些情況它也可能沒有用。一個不用定義代理設置並使用它們的是創建自己的 ProxyHandler。這個實現方法類似於創建一個基本認證 handler。

下面是一個實例:

#! /usr/bin/env python3
import urllib.request
proxy_handler = urllib.request.ProxyHandler({
'socks5': 'localhost:1080''http': 'https://58.240.60.10:81',
'https': 'https://222.170.17.74:3128'
})
opener = urllib.request.build_opener(proxy_handler)
response = opener.open('https://www.baidu.com')
print(response.read())

在這裏使用了 ProxyHandler ,ProxyHandler 函數接受一個字典類型的參數,其中key爲協議名稱,比如 http 還是 https 等,value爲代理鏈接(包含 host 名稱與端口號),也支持帶驗證的代理,可以添加多個代理。然後利用 build_opener() 方法利用這個 Handler 構造一個 Opener ,然後發送請求即可。

Cookie設置

獲取百度 Cookie 實例如下:

#! /usr/bin/env python3
import http.cookiejar, urllib.request
cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('https://www.baidu.com')
for item in cookie:
   print(item.name+"="+item.value)

輸出:

BAIDUID=37998CB10856532A8604B84ACFCAB6C0:FG=1
BIDUPSID=37998CB10856532A8604B84ACFCAB6C0
H_PS_PSSID=25576_1466_13289_21122_20928
PSTM=1516720556
BDSVRTM=0
BD_HOME=0

首先聲明一個CookieJar對象,接下來利用HTTPCookieProcessor構建一個 handler ,最後利用 build_opener 方法構建出 opener ,執行 open() 即可。

查看輸出可以發現每一條 Cookie 有相應的名稱和值。

文本存儲 Cookie 信息實例如下:

filename = 'cookie.txt'
cookie = http.cookiejar.MozillaCookieJar(filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('https://www.baidu.com')
cookie.save(ignore_discard=True, ignore_expires=True)

cookie.txt 文件內容爲:

# Netscape HTTP Cookie File
# https://curl.haxx.se/rfc/cookie_spec.html
# This is a generated file!  Do not edit.
.baidu.com  TRUE    /   FALSE   3664204558  BAIDUID 43896422C89528C1D912D69D7AA9CF49:FG=1
.baidu.com  TRUE    /   FALSE   3664204558  BIDUPSID    43896422C89528C1D912D69D7AA9CF49
.baidu.com  TRUE    /   FALSE       H_PS_PSSID  1458_21084_17001_20718
.baidu.com  TRUE    /   FALSE   3664204558  PSTM    1516720911
www.baidu.com   FALSE   /   FALSE       BDSVRTM 0
www.baidu.com   FALSE   /   FALSE       BD_HOME 0

相對單純輸出 Cookie ,這裏 CookieJar 換成 MozillaCookieJar(CookieJar 的子類) ,用於生成文件。MozillaCookieJar 可以用來處理 Cookie 以及和文件相關的事件,比如讀取和保存 Cookie ,同時它可以將 Cookie 保存成 Mozilla 型的格式。

此外,還有一個LWPCookieJar ,同樣可以讀取和保存 Cookie ,但是保存的格式和 MozillaCookieJar 的不一樣,它會保存成 libwww-perl 的 Set-Cookie3 文件格式的 Cookie 。

嘗試一下,修改聲明 cookie = http.cookiejar.LWPCookieJar(filename)
新cookie.txt 文件內容爲:

#LWP-Cookies-2.0
Set-Cookie3: BAIDUID="CDA35482887BF4DEAA078F12CD69DDD8:FG=1"; path="/"; domain=".baidu.com"; path_spec; domain_dot; expires="2086-02-10 18:47:45Z"; version=0
Set-Cookie3: BIDUPSID=CDA35482887BF4DEAA078F12CD69DDD8; path="/"; domain=".baidu.com"; path_spec; domain_dot; expires="2086-02-10 18:47:45Z"; version=0
Set-Cookie3: H_PS_PSSID=25641_1424_21108_17001; path="/"; domain=".baidu.com"; path_spec; domain_dot; discard; version=0
Set-Cookie3: PSTM=1516721618; path="/"; domain=".baidu.com"; path_spec; domain_dot; expires="2086-02-10 18:47:45Z"; version=0
Set-Cookie3: BDSVRTM=0; path="/"; domain="www.baidu.com"; path_spec; discard; version=0
Set-Cookie3: BD_HOME=0; path="/"; domain="www.baidu.com"; path_spec; discard; version=0

以下爲以 LWPCookieJar 格式爲例實現對 Cookie 文件的讀取與利用:

cookie = http.cookiejar.LWPCookieJar()
cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('https://www.baidu.com')
print(response.read().decode('utf-8'))

前提是先利用上面的方式生成了 LWPCookieJar 格式的 Cookie 文件 ,然後利用 load() 方法,傳入文件名稱,構建 handler 和 opener 並能夠正常輸出百度網頁的源代碼。

以上是關於 urllib.request 模塊的常用知識以及重點內容的總結, 還具體說明了 urllib.request,urlopen() 的詳細介紹以及用法。可以查看 python doc 。

下面是 urllib.request 模塊的其他 方法或者類的簡要介紹:
方法:
1. install_opener()

urllib.request.install_opener(opener)

安裝一個 OpenerDirector實例作爲全球默認的opener 。如果你想讓 urlopen 使用這個opener,那麼安裝一個opener是必要的;否則可以簡單地調用OpenerDirector.open()而不是urlopen()。這樣代碼不會檢查一個真實的 OpenerDirector 並且任何類的適當的接口都可以運作。

2. build_opener()

 urllib.request.build_opener([handler, …])

返回一個順序鏈的處理程序OpenerDirector的實例。處理程序可以是BaseHandler的實例,或者 BaseHandler 的子類(在這種情況下,必須調用沒有參數的構造函數)。下面這些類的實例將提前處理程序,除非處理程序包含它們,或者它們子類的實例:ProxyHandler(如果檢測到代理設置)、UnknownHandler、HTTPHandler、HTTPDefaultErrorHandler、HTTPRedirectHandler、FTPHandler、FileHandler、HTTPErrorProcessor。

如果 Python 安裝 SSL 支持(即如果 ssl 模塊可以被導入), HTTPSHandler 也將被添加。

一個 BaseHandler 子類也可以通過改變它的 handler_order 屬性來修改它再處理程序列表中的位置。

3. pathname2url()

urllib.request.pathname2url(path)

將路徑名轉換成路徑,從本地語法形式的路徑中使用一個URL的路徑組成部分。這不會產生一個完整的URL。它將返回引用 quote() 函數的值。

4. url2pathname()

urllib.request.url2pathname(path)

將路徑組件轉換爲本地路徑的語法。這個不接受一個完整的URL。這個函數使用 unquote() 解碼的通路。

5. getproxies()

urllib.request.getproxies()

這個 helper 函數返回一個日程表 dictionary 去代理服務器的 URL 映射。掃描指定的環境變量 _proxy 大小寫不敏感的方法,對所有的操作系統,當它不能找到它,從 Mac OS X 的 Mac OSX 系統配置和 Windows 系統註冊表中尋找代理信息。如果兩個大寫和小寫環境變量存在(或不一樣),小寫優先。

請注意,如果環境變量 REQUEST_METHOD 已被設置,這通常表明你在 CGI 腳本運行環境,此時環境變量 HTTP_PROXY(大寫 _PROXY) 將被忽略。這是因爲該變量可以被客戶端使用注射 “代理:” HTTP 頭。如果你需要使用一個 HTTP 代理在 CGI 環境中,要麼使用 ProxyHandler 明確,或者確保變量名小寫(或至少是 _proxy後綴)。

類:

urllib.request.Request(url,data=None,headers={}, origin_req_host=None, unverifiable=False, method=None)
  1. 這個類是一個抽象的 URL 請求。

  2. url 應該是一個字符串包含一個有效的 URL 。

  3. 數據必須是一個字節對象指定額外的數據發送到服務器 或 None。如果沒有這樣的數據是必要的,數據也可能是一個 iterable 對象而且在這種情況下必須在最開始時指定內容的長度。目前 HTTP 是唯一一個這樣請求數據的,當數據參數被提供時,HTTP 請求將會執行 POST 請求而不是 GET 請求。

  4. 數據應該是一個緩衝的在標準應用程序中以x-www-form-urlencoded的格式。 urllib.parse.urlencode() 函數接受一個映射或序列集合,並返回一個 ASCII 文本字符串的格式。它應該在被用作數據參數之前,被編碼爲字節。

  5. headers 應該是一個字典,如果 add_header() 被稱爲與每個鍵和值作爲參數。這通常是用來“惡搞” User-Agent 頭的值,因爲使用一個瀏覽器識別本身——一些常見HTTP服務器只允許請求來自瀏覽器而不是腳本。例如,Mozilla Firefox可能識別本身 “Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11”。而 urllib 默認的用戶代理字符串 是”Python-urllib/2.6”在Python 2.6()。

  6. 一個Content-Type header的例子: 用數據論證將發送一個字典 {“Content-Type”:”application/x-www-form-urlencoded”}。

  7. 最後兩個參數只是正確處理第三方 HTTP cookie:
    origin_req_host應該請求原始的主機交易,就像定義的 RFC 2965。它默認爲 http.cookiejar.request_host(self)。這是原始請求的主機名或 IP 地址,由用戶發起。例如。如果請求是一個圖像在 HTML文檔中,這應該是請求的請求主機包含圖像的頁面。

  8. 無法覈實的表明是否應該請求是無法覈實的,這由 RFC 2965 定義。它默認爲 False。一個無法覈實的請求的 URL 的用戶沒有允許的選擇。例如,如果請求是一個圖像在一個HTML文檔,和用戶沒有選擇通過圖像的自動抓取,這應該是正確的。

  9. 這個方法應該是一個字符串,表示將使用(如 headers 請求頭部信息)。如果提供,其值是存儲在 method 屬性和使用 get_method()。通過設置子類可能表明一個默認的方法 method類 本身的屬性。

urllib.request.OpenerDirector

OpenerDirector 類打開 url 並通過 BaseHandler 連接在一起。它管理處理程序的連接,和恢復錯誤。

urllib.request.BaseHandler

這是對於所有已註冊的處理程序的基類。

urllib.request.HTTPRedirectHandler

一個類來處理重定向。

urllib.request.HTTPCookieProcessor(cookiejar=None)

一個類來處理HTTP cookie。

urllib.request.ProxyHandler(proxies=None)

導致請求通過一個代理。如果代理是給定的,它必須是一個字典的代理協議名稱映射到 ur l。默認值是從環境變量的列表 _proxy 中讀取代理。如果沒有代理設置環境變量,那麼在 Windows 環境中代理設置了從註冊表部分的網絡設置,在 Mac OS X 環境代理信息檢索的 OS X 系統配置框架。
禁用一個代理傳遞一個空的字典。
no_proxy 環境變量可以被用來指定主機不能通過代理;如果設置,它應該是一個以逗號分隔的主機名後綴。可選 :port 附加爲例 cern.ch,ncsa.uiuc.edu,some.host:8080。

請注意 :HTTP_PROXY 如果一個變量將被忽略 REQUEST_METHOD 設置;參見文檔 getproxies()。

urllib.request.HTTPPasswordMgr

保持一個(realm, uri) -> (user, password) 映射的數據庫 。

urllib.request.HTTPPasswordMgrWithDefaultRealm

保持一個 (realm, uri) -> (user, password) 映射的數據庫 。如果沒有其他搜索領域,一個值爲 None 的領域 (realm) 被認爲是一個全方位領域。

urllib.request.HTTPPasswordMgrWithPriorAuth

保持一個 HTTPPasswordMgrWithDefaultRealm 變量 還有一個uri -> is_authenticated 映射的數據庫 。當發送身份認證可以馬上使用 BasicAuth handler 確認身份, 而不是等待 401 報錯響應。

urllib.request.AbstractBasicAuthHandler(password_mgr=None)

這是 mixin 類,處理遠程主機身份認證和代理。使用 is_authenticated 值對於一個給定的URI 來決定是否發送請求來進行身份認證。如果 s_authenticated 返回 True 則發送憑證。如果 is_authenticated 是 False ,則憑證不發送。如果 返回 401 錯誤響應信息,則身份認證失敗。如果身份驗證成功, update_authenticated 被稱爲設置 True。

urllib.request.HTTPBasicAuthHandler(password_mgr=None)

處理遠程主機的身份認證。

urllib.request.ProxyBasicAuthHandler(password_mgr=None)

處理身份認證與代理。

urllib.request.AbstractDigestAuthHandler(password_mgr=None)

這是 mixin 類,處理遠程主機身份認證和代理。

urllib.request.HTTPDigestAuthHandler(password_mgr=None)

實現遠程主機的身份認證。如果有password_mgr,應該是兼容HTTPPasswordMgr的;請參閱章節 HTTPPasswordMgr以獲取很多接口信息。Digest認證處理器和基本認證處理器都被加入,Digest認證處理器總是首先進行驗證。如果主機再次返回一個40X 響應,它發送到基本認證處理器進行處理。當出現除了 Digest 或基本身份的其他身份認證時,這個處理程序方法將提高 ValueError 3.3版本的變化:提高 ValueError不支持的身份驗證方案。

urllib.request.ProxyDigestAuthHandler(password_mgr=None)

處理代理身份的驗證。如果有password_mgr,應該是兼容HTTPPasswordMgr的;請參閱章節HTTPPasswordMgr 獲取更多接口信息。

urllib.request.HTTPHandler

處理HTTP URLs。

urllib.request.HTTPSHandler(debuglevel=0, context=None, check_hostname=None)

處理開放的 HTTPS URLs 。在 http.client.HTTPSConnection 中 context 和 check_hostname 有相同的意義 。

urllib.request.FileHandler

打開本地文件。

urllib.request.DataHandler

開放數據 URLs。

urllib.request.FTPHandler

開放的 FTP URLs。

urllib.request.CacheFTPHandler

打開 FTP URLS,保持打開的 FTP 連接緩存來減少延遲。

urllib.request.UnknownHandler

全方位類處理未知的 URLs。

urllib.request.HTTPErrorProcessor

HTTP 錯誤響應過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章