什么是 Urllib 庫?
urllib 庫 是Python內(nèi)置的 HTTP 請(qǐng)求庫。urllib 模塊提供的上層接口,使訪問 www 和 ftp 上的數(shù)據(jù)就像訪問本地文件一樣。
有以下幾種模塊:
1.urllib.request 請(qǐng)求模塊
urllib.error 異常處理模塊
urllib.parse url 解析模塊
urllib.robotparser robots.txt 解析模塊
Urllib 庫下的幾種模塊基本使用如下:
urllib.request
關(guān)于 urllib.request: urllib.request 模塊提供了最基本的構(gòu)造 HTTP (或其他協(xié)議如 FTP)請(qǐng)求的方法,利用它可以模擬瀏覽器的一個(gè)請(qǐng)求發(fā)起過程。利用不同的協(xié)議去獲取 URL 信息。它的某些接口能夠處理基礎(chǔ)認(rèn)證 ( Basic Authenticaton) 、redirections (HTTP 重定向)、 Cookies (瀏覽器 Cookies)等情況。而這些接口是由 handlers 和 openers 對(duì)象提供的。
一. urlopen
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
參數(shù)說明:
url:需要打開的網(wǎng)址; data: Post 提交的數(shù)據(jù), 默認(rèn)為 None ,當(dāng) data 不為 None 時(shí), urlopen() 提交方式為 Post; timeout:設(shè)置網(wǎng)站訪問超時(shí)時(shí)間
下面是一個(gè)請(qǐng)求實(shí)例:
import urllib.request
# 可以是 from urllib import request,語句等價(jià)
response = urllib.request.urlopen('https://www.baidu.com')
print("查看 response 響應(yīng)信息類型: ",type(response))
page = response.read()
print(page.decode('utf-8'))
說明: 直接使用 urllib.request 模塊中的 urlopen方法獲取頁面,其中 page 數(shù)據(jù)類型為 bytes 類型,經(jīng)過 decode 解碼 轉(zhuǎn)換成 string 類型。通過輸出結(jié)果可以 urlopen 返回對(duì)象是 HTTPResposne 類型對(duì)象。
urlopen 返回一個(gè)類文件對(duì)象,并提供了如下方法:
read() , readline() , readlines() , fileno() , close() :這些方法的使用方式與文件對(duì)象完全一樣;
info():返回一個(gè)httplib.HTTPMessage對(duì)象,表示遠(yuǎn)程服務(wù)器返回的頭信息;可以通過Quick Reference to Http Headers查看 Http Header 列表。
getcode():返回Http狀態(tài)碼。如果是http請(qǐng)求,200表示請(qǐng)求成功完成;404表示網(wǎng)址未找到;
geturl():返回獲取頁面的真實(shí) URL。在 urlopen(或 opener 對(duì)象)可能帶一個(gè)重定向時(shí),此方法很有幫助。獲取的頁面 URL 不一定跟真實(shí)請(qǐng)求的 URL 相同。
使用實(shí)例:
import urllib.request
response = urllib.request.urlopen('https://python.org/')
print("查看 response 的返回類型:",type(response))
print("查看反應(yīng)地址信息: ",response)
print("查看頭部信息1(http header):\n",response.info())
print("查看頭部信息2(http header):\n",response.getheaders())
print("輸出頭部屬性信息:",response.getheader("Server"))
print("查看響應(yīng)狀態(tài)信息1(http status):\n",response.status)
print("查看響應(yīng)狀態(tài)信息2(http status):\n",response.getcode())
print("查看響應(yīng) url 地址:\n",response.geturl())
page = response.read()
print("輸出網(wǎng)頁源碼:",page.decode('utf-8'))
關(guān)于 Post 數(shù)據(jù)
下面是一個(gè) Post 實(shí)例:
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 數(shù)如果要傳bytes(字節(jié)流)類型的,如果是一個(gè)字典,先用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)
注解:
如實(shí)例易知,在 urlopen 參數(shù) data 不為 None 時(shí),urlopen() 數(shù)據(jù)提交方式 為 Post。urllib.parse.urlencode()方法將參數(shù)字典轉(zhuǎn)化為字符串。
提交的網(wǎng)址是httpbin.org,它可以提供HTTP請(qǐng)求測試。 https://httpbin.org/post 這個(gè)地址可以用來測試 POST 請(qǐng)求,它可以輸出請(qǐng)求和響應(yīng)信息,其中就包含我們傳遞的 data 參數(shù)。
關(guān)于 timeout 參數(shù)
timeout參數(shù)可以設(shè)置超時(shí)時(shí)間,單位為秒,意思就是如果請(qǐng)求超出了設(shè)置的這個(gè)時(shí)間還沒有得到響應(yīng),就會(huì)拋出異常,如果不指定,就會(huì)使用全局默認(rèn)時(shí)間。它支持 HTTP 、 HTTPS 、 FTP 請(qǐng)求。
相關(guān)實(shí)例:
import urllib.request
response = urllib.request.urlopen("https://httpbin.org/get",timeout=1)
print(response.read().decode("utf-8"))
輸出結(jié)果:
"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"
}
我們?cè)囍otimeout一個(gè)更小的值,例如timeout=0.1,此時(shí)拋出 urllib.error.URLError 異常,錯(cuò)誤原因?yàn)?time out 。因?yàn)槌@硐?0.1 s 內(nèi)根本就不可能得到服務(wù)器響應(yīng)。所以通過設(shè)置參數(shù) timeout 的值對(duì)于應(yīng)對(duì)網(wǎng)頁響應(yīng)的速度具有一定的意義。同時(shí),可以通過設(shè)置這個(gè)超長時(shí)間來控制一個(gè)網(wǎng)頁如果長時(shí)間未響應(yīng)就跳過它的抓取(可以通過try-catch 語句)。
try-catch 實(shí)現(xiàn)異常處理:
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!
關(guān)于其他參數(shù)
Context 參數(shù),必須是 ssl.SSL.Context 類型,用來指定 SSL 設(shè)置。cafile、capath 兩個(gè)參數(shù)是指定 CA 證書和它的路徑,在請(qǐng)求 HTTPS 連接時(shí)可能用的上。
cadefault 參數(shù)已經(jīng)棄用,默認(rèn)為 False。
二. Request
urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
使用request()來包裝請(qǐng)求,再通過urlopen()獲取頁面。單純使用 urlopen 并不能足以構(gòu)建一個(gè)完整的請(qǐng)求,例如 對(duì)拉勾網(wǎng)的請(qǐng)求如果不加上 headers 等信息,就無法正常解析訪問網(wǎng)頁內(nèi)容。
下面是一個(gè)使用實(shí)例
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 的參數(shù)設(shè)置:
User-Agent :這個(gè)頭部可以攜帶如下幾條信息:瀏覽器名和版本號(hào)、操作系統(tǒng)名和版本號(hào)、默認(rèn)語言。這個(gè)數(shù)據(jù)可以從 網(wǎng)頁開發(fā)工具上的請(qǐng)求反應(yīng)信息中獲取(瀏覽器上一般按 F12 打開開發(fā)工具)。作用是用于偽裝瀏覽器。
Referer:可以用來防止盜鏈,有一些網(wǎng)站圖片顯示來源 https://***.com ,就是檢查 Referer 來鑒定的。
Connection:表示連接狀態(tài),記錄 Session 的狀態(tài)。
origin_req_host:請(qǐng)求方的 host 名稱或者 IP 地址。
unverifiable:指請(qǐng)求無法驗(yàn)證,默認(rèn)為 False。用戶并沒有足夠的權(quán)限來選擇接收這個(gè)請(qǐng)求結(jié)果,例如請(qǐng)求一個(gè) HTML 文檔中的圖片,但沒有自動(dòng)抓取圖像的權(quán)限,這時(shí) unverifiable 為 True。
method:指定請(qǐng)求使用的方法,例如 GET、POST、PUT 等。
三. Openers 和 Handlers
當(dāng)需要獲取一個(gè) URL 時(shí)需要使用一個(gè) opener (這是一個(gè)不容易理解的對(duì)象—-urllib.request.OpenerDirector的實(shí)例)。一般情況下通過 urlopen 使用默認(rèn)的 opener ,但允許自己創(chuàng)建不同的 opener 。Opener 會(huì)使用 handlers 。handler 承擔(dān)”重活”并知道如何以某個(gè)特定的協(xié)議(如http,ftp等)打開 URL、知道如何處理 URL的某些行為(比如 Http 重定向或是 Cookie等)。
引入 Opener(即 OpenerDirector 類)的目的是為了能夠?qū)崿F(xiàn)更高級(jí)的功能,一般情況下使用的 Request 、 urlopen() 相當(dāng)于類庫封裝好了的極其常用的請(qǐng)求方法,利用這兩個(gè)就可以完成基本的請(qǐng)求。但當(dāng)需要實(shí)現(xiàn)更高級(jí)的功能時(shí)就需要更高級(jí)的實(shí)例來完成操作。所以,這里就用到了比調(diào)用 urlopen() 的對(duì)象的更普遍的對(duì)象—-Opener 。
Opener 通過 Handler 構(gòu)建,可以使用 open() 方法,返回的類型和 urlopen() 相同。
OpenerDirector操作類是一個(gè)管理很多處理類(Handler)的類。這些 Handler 類都對(duì)應(yīng)處理相應(yīng)的協(xié)議,或者特殊功能。
分別有下面的處理類(即 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響應(yīng)錯(cuò)誤,錯(cuò)誤都會(huì)拋出 HTTPError 類型的異常。
- HTTPRedirectHandler :用于處理重定向。
- HTTPCookieProcessor: 用于處理 Cookie 。
- ProxyHandler :用于設(shè)置代理,默認(rèn)代理為空
- HTTPPasswordMgr : 用于管理密碼,它維護(hù)了用戶名密碼的表。
- HTTPBasicAuthHandler : 用于管理認(rèn)證,如果一個(gè)鏈接打開時(shí)需要認(rèn)證,那么可以用它來解決認(rèn)證問題。 另外還
有其他的 Handler ,可以參考官方文檔。
基本認(rèn)證(Basic Authentication)
什么是基本認(rèn)證?當(dāng)訪問網(wǎng)頁信息時(shí)被要求需要認(rèn)證(或授權(quán))時(shí),服務(wù)器會(huì)發(fā)送一個(gè)頭信息(如果驗(yàn)證失敗便返回 401 錯(cuò)誤代碼)請(qǐng)求認(rèn)證。它指定了一個(gè)realm(領(lǐng)域)。這個(gè)頭信息的形式看起來會(huì)像是:www-Authenticate:SCHEME realm="REALM",例如WWW-Authenticate: Basic realm="cPanel Users"
接著,客戶端應(yīng)該使用正確的用戶名和密碼重新請(qǐng)求(請(qǐng)求頭中應(yīng)該包含對(duì)應(yīng)的realm、用戶名以及用戶密碼),這就是“基礎(chǔ)認(rèn)證”。
通過創(chuàng)建一個(gè) HTTPBasicAuthHandler 并利用 opener 使用這個(gè) handler 可以簡化這個(gè)認(rèn)證過程。
HTTPBasicAuthHandler使用一個(gè)叫做密碼管理器(password manager)的對(duì)象處理 url 和 realm、用戶名和密碼之間的映射。如果你知道realm(領(lǐng)域)是什么(根據(jù)服務(wù)器發(fā)送的認(rèn)證 headers 可以得知),那么你便可以使用 HTTPPasswordMgr。人們往往不在乎realm是什么。這種情況下,最方便的是使用HTTPPasswordMgrWithDefaultRealm。它允許你為一個(gè)url指定一個(gè)默認(rèn)的用戶名和密碼。它會(huì)在你沒有給某個(gè)realm提供用戶名和密碼的時(shí)候起作用。這種情況下,需要將 add_password 方法的 realm 參數(shù)設(shè)置為 None。
頂層 URL (top-level URL)就是第一個(gè)需要認(rèn)證的 URL,只有是比你傳遞給.add_password() 的 URL更“深層”的 URL 也可以匹配得上。
下面是一個(gè)實(shí)例:
# -*- coding: utf-8 -*-
import urllib
# 創(chuàng)建一個(gè)密碼管理者
password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
# 添加用戶名和密碼
top_level_url = "https://example.com/foo/"`
# 如果知道 realm, 我們可以使用他代替 None.
password_mgr.add_password(None, top_level_url,'username','password')
# 創(chuàng)建了一個(gè)新的handler
handler = urllib.request.HTTPBasicAuthHandler(password_mgr)
# 創(chuàng)建 "opener"`(OpenerDirector 實(shí)例)
opener = urllib.request.build_opener(handler)
# 使用 opener 獲取一個(gè)URL
a_url = 'https://www.python.org/'`
x = opener.open(a_url)
print(x.read().decode("utf-8"))
# 安裝 opener.
# 現(xiàn)在所有調(diào)用 urllib.request.urlopen 將用我們的 opener.
urllib.request.install_opener(opener)
此處代碼為實(shí)例代碼,用于說明Handler和Opener的使用方法。在這里,首先實(shí)例化了一個(gè)HTTPPasswordMgrWithDefaultRealm 對(duì)象,然后利用 add_password() 添加進(jìn)用戶名和密碼,相當(dāng)于建立了一個(gè)處理認(rèn)證的處理器。接下來利用 urllib.request.build_opener() 方法來利用這個(gè)處理器構(gòu)建一個(gè) Opener ,那么這個(gè) Opener 在發(fā)送請(qǐng)求的時(shí)候就具備了認(rèn)證功能了。最后通過 Opener 的 open() 方法打開 URL,即可以完成認(rèn)證。
說明幾點(diǎn):
1.上面實(shí)例中,只將HTTPBasicAuthHandler提供給 build_opener 。
2.默認(rèn)情況下,opener可以處理一般情況的 handler—-ProxyHandler(已經(jīng)設(shè)置了代理環(huán)境變量如 http_proxy)、UnknownHandler、HTTPHandler、HTTPDefaultErrorHandler、HTTPRedirectHandler、FTPHandler、FileHandler、DataHandler、HTTPErrorProcessor。
實(shí)際上,toplevel_url 要么是一個(gè)完整的 URL(包括“http:”模式部分以及主機(jī)名和可選的端口號(hào))比如“https://example.com/”,要么是一個(gè)“authority”(即主機(jī)名和可選的端口號(hào))例如“example.com”或“example.com:8080”(后者包含了端口號(hào))。該“authority”如果出現(xiàn)的話,不能包含“用戶信息(userinfo)“元素——如“joe@password:example.com” 是不被允許的。
代理
urllib 可以通過 ProxyHandler 自動(dòng)檢測你的代理設(shè)置并使用它們。當(dāng)代理設(shè)置被檢測時(shí),它是普通 handler 的一部分。通常認(rèn)為這是好事,當(dāng)有些情況它也可能沒有用。一個(gè)不用定義代理設(shè)置并使用它們的是創(chuàng)建自己的 ProxyHandler。這個(gè)實(shí)現(xiàn)方法類似于創(chuàng)建一個(gè)基本認(rèn)證 handler。
下面是一個(gè)實(shí)例:
#! /usr/bin/env python3
import urllib.request
proxy_handler = urllib.request.ProxyHandler({
'socks5': 'localhost:1080',
'http': '[https://58.240.60.10:81](https://58.240.60.10:81/)',
'https': '[https://222.170.17.74:3128](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 函數(shù)接受一個(gè)字典類型的參數(shù),其中key為協(xié)議名稱,比如 http 還是 https 等,value為代理鏈接(包含 host 名稱與端口號(hào)),也支持帶驗(yàn)證的代理,可以添加多個(gè)代理。然后利用 build_opener() 方法利用這個(gè) Handler 構(gòu)造一個(gè) Opener ,然后發(fā)送請(qǐng)求即可。
Cookie設(shè)置
獲取百度 Cookie 實(shí)例如下:
#! /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
首先聲明一個(gè)CookieJar對(duì)象,接下來利用HTTPCookieProcessor構(gòu)建一個(gè) handler ,最后利用 build_opener 方法構(gòu)建出 opener ,執(zhí)行 open() 即可。
查看輸出可以發(fā)現(xiàn)每一條 Cookie 有相應(yīng)的名稱和值。
文本存儲(chǔ) Cookie 信息實(shí)例如下:
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 文件內(nèi)容為:
# 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
相對(duì)單純輸出 Cookie ,這里 CookieJar 換成 MozillaCookieJar(CookieJar 的子類) ,用于生成文件。*MozillaCookieJar *可以用來處理 Cookie 以及和文件相關(guān)的事件,比如讀取和保存 Cookie ,同時(shí)它可以將 Cookie 保存成 Mozilla 型的格式。
此外,還有一個(gè)*LWPCookieJar *,同樣可以讀取和保存 Cookie ,但是保存的格式和 MozillaCookieJar 的不一樣,它會(huì)保存成 libwww-perl 的 Set-Cookie3 文件格式的 Cookie 。
嘗試一下,修改聲明 cookie = http.cookiejar.LWPCookieJar(filename)
新cookie.txt 文件內(nèi)容為:
#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 格式為例實(shí)現(xiàn)對(duì) 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() 方法,傳入文件名稱,構(gòu)建 handler 和 opener 并能夠正常輸出百度網(wǎng)頁的源代碼。
以上是關(guān)于 urllib.request 模塊的常用知識(shí)以及重點(diǎn)內(nèi)容的總結(jié), 還具體說明了 urllib.request,urlopen() 的詳細(xì)介紹以及用法??梢圆榭?python doc 。
下面是 urllib.request 模塊的其他 方法或者類的簡要介紹:
方法:
1. install_opener()
urllib.request.install_opener(opener)
安裝一個(gè) OpenerDirector實(shí)例作為全球默認(rèn)的opener 。如果你想讓 urlopen 使用這個(gè)opener,那么安裝一個(gè)opener是必要的;否則可以簡單地調(diào)用OpenerDirector.open()而不是urlopen()。這樣代碼不會(huì)檢查一個(gè)真實(shí)的 OpenerDirector 并且任何類的適當(dāng)?shù)慕涌诙伎梢赃\(yùn)作。
2.build_opener()
urllib.request.build_opener([handler, …])
返回一個(gè)順序鏈的處理程序OpenerDirector的實(shí)例。處理程序可以是BaseHandler的實(shí)例,或者 BaseHandler 的子類(在這種情況下,必須調(diào)用沒有參數(shù)的構(gòu)造函數(shù))。下面這些類的實(shí)例將提前處理程序,除非處理程序包含它們,或者它們子類的實(shí)例:ProxyHandler(如果檢測到代理設(shè)置)、UnknownHandler、HTTPHandler、HTTPDefaultErrorHandler、HTTPRedirectHandler、FTPHandler、FileHandler、HTTPErrorProcessor。
如果 Python 安裝 SSL 支持(即如果 ssl 模塊可以被導(dǎo)入), HTTPSHandler 也將被添加。
一個(gè) BaseHandler 子類也可以通過改變它的 handler_order 屬性來修改它再處理程序列表中的位置。
3.pathname2url()
urllib.request.pathname2url(path)
將路徑名轉(zhuǎn)換成路徑,從本地語法形式的路徑中使用一個(gè)URL的路徑組成部分。這不會(huì)產(chǎn)生一個(gè)完整的URL。它將返回引用 quote() 函數(shù)的值。
4.url2pathname()
urllib.request.url2pathname(path)
將路徑組件轉(zhuǎn)換為本地路徑的語法。這個(gè)不接受一個(gè)完整的URL。這個(gè)函數(shù)使用 unquote() 解碼的通路。
5.getproxies()
urllib.request.getproxies()
這個(gè) helper 函數(shù)返回一個(gè)日程表 dictionary 去代理服務(wù)器的 URL 映射。掃描指定的環(huán)境變量 _proxy 大小寫不敏感的方法,對(duì)所有的操作系統(tǒng),當(dāng)它不能找到它,從 Mac OS X 的 Mac OSX 系統(tǒng)配置和 Windows 系統(tǒng)注冊(cè)表中尋找代理信息。如果兩個(gè)大寫和小寫環(huán)境變量存在(或不一樣),小寫優(yōu)先。
請(qǐng)注意,如果環(huán)境變量 REQUEST_METHOD 已被設(shè)置,這通常表明你在 CGI 腳本運(yùn)行環(huán)境,此時(shí)環(huán)境變量 HTTP_PROXY(大寫 _PROXY) 將被忽略。這是因?yàn)樵撟兞靠梢员豢蛻舳耸褂米⑸?“代理:” HTTP 頭。如果你需要使用一個(gè) HTTP 代理在 CGI 環(huán)境中,要么使用 ProxyHandler 明確,或者確保變量名小寫(或至少是 _proxy后綴)。
類:
urllib.request.Request(url,data=None,headers={}, origin_req_host=None, unverifiable=False, method=None)
1.這個(gè)類是一個(gè)抽象的 URL 請(qǐng)求。
2.url 應(yīng)該是一個(gè)字符串包含一個(gè)有效的 URL 。
3.數(shù)據(jù)必須是一個(gè)字節(jié)對(duì)象指定額外的數(shù)據(jù)發(fā)送到服務(wù)器 或 None。如果沒有這樣的數(shù)據(jù)是必要的,數(shù)據(jù)也可能是一個(gè) iterable 對(duì)象而且在這種情況下必須在最開始時(shí)指定內(nèi)容的長度。目前 HTTP 是唯一一個(gè)這樣請(qǐng)求數(shù)據(jù)的,當(dāng)數(shù)據(jù)參數(shù)被提供時(shí),HTTP 請(qǐng)求將會(huì)執(zhí)行 POST 請(qǐng)求而不是 GET 請(qǐng)求。
4.數(shù)據(jù)應(yīng)該是一個(gè)緩沖的在標(biāo)準(zhǔn)應(yīng)用程序中以x-www-form-urlencoded的格式。 urllib.parse.urlencode() 函數(shù)接受一個(gè)映射或序列集合,并返回一個(gè) ASCII 文本字符串的格式。它應(yīng)該在被用作數(shù)據(jù)參數(shù)之前,被編碼為字節(jié)。
5.headers 應(yīng)該是一個(gè)字典,如果 add_header() 被稱為與每個(gè)鍵和值作為參數(shù)。這通常是用來“惡搞” User-Agent 頭的值,因?yàn)槭褂靡粋€(gè)瀏覽器識(shí)別本身——一些常見HTTP服務(wù)器只允許請(qǐng)求來自瀏覽器而不是腳本。例如,Mozilla Firefox可能識(shí)別本身 “Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11”。而 urllib 默認(rèn)的用戶代理字符串 是”Python-urllib/2.6”在Python 2.6()。
6.一個(gè)Content-Type header的例子: 用數(shù)據(jù)論證將發(fā)送一個(gè)字典 {“Content-Type”:”application/x-www-form-urlencoded”}。
7.最后兩個(gè)參數(shù)只是正確處理第三方 HTTP cookie:
origin_req_host應(yīng)該請(qǐng)求原始的主機(jī)交易,就像定義的 RFC 2965。它默認(rèn)為 http.cookiejar.request_host(self)。這是原始請(qǐng)求的主機(jī)名或 IP 地址,由用戶發(fā)起。例如。如果請(qǐng)求是一個(gè)圖像在 HTML文檔中,這應(yīng)該是請(qǐng)求的請(qǐng)求主機(jī)包含圖像的頁面。
8.無法核實(shí)的表明是否應(yīng)該請(qǐng)求是無法核實(shí)的,這由 RFC 2965 定義。它默認(rèn)為 False。一個(gè)無法核實(shí)的請(qǐng)求的 URL 的用戶沒有允許的選擇。例如,如果請(qǐng)求是一個(gè)圖像在一個(gè)HTML文檔,和用戶沒有選擇通過圖像的自動(dòng)抓取,這應(yīng)該是正確的。
9.這個(gè)方法應(yīng)該是一個(gè)字符串,表示將使用(如 headers 請(qǐng)求頭部信息)。如果提供,其值是存儲(chǔ)在 method 屬性和使用 get_method()。通過設(shè)置子類可能表明一個(gè)默認(rèn)的方法 method類 本身的屬性。
urllib.request.OpenerDirector
OpenerDirector 類打開 url 并通過 BaseHandler 連接在一起。它管理處理程序的連接,和恢復(fù)錯(cuò)誤。
urllib.request.BaseHandler
這是對(duì)于所有已注冊(cè)的處理程序的基類。
urllib.request.HTTPRedirectHandler
一個(gè)類來處理重定向。
urllib.request.HTTPCookieProcessor(cookiejar=None)
一個(gè)類來處理HTTP cookie。
urllib.request.ProxyHandler(proxies=None)
導(dǎo)致請(qǐng)求通過一個(gè)代理。如果代理是給定的,它必須是一個(gè)字典的代理協(xié)議名稱映射到 ur l。默認(rèn)值是從環(huán)境變量的列表 _proxy 中讀取代理。如果沒有代理設(shè)置環(huán)境變量,那么在 Windows 環(huán)境中代理設(shè)置了從注冊(cè)表部分的網(wǎng)絡(luò)設(shè)置,在 Mac OS X 環(huán)境代理信息檢索的 OS X 系統(tǒng)配置框架。
禁用一個(gè)代理傳遞一個(gè)空的字典。
no_proxy 環(huán)境變量可以被用來指定主機(jī)不能通過代理;如果設(shè)置,它應(yīng)該是一個(gè)以逗號(hào)分隔的主機(jī)名后綴??蛇x :port 附加為例 cern.ch,ncsa.uiuc.edu,some.host:8080。
**請(qǐng)注意 **:HTTP_PROXY 如果一個(gè)變量將被忽略 REQUEST_METHOD 設(shè)置;參見文檔 getproxies()。
urllib.request.HTTPPasswordMgr
保持一個(gè)(realm, uri) -> (user, password) 映射的數(shù)據(jù)庫 。
urllib.request.HTTPPasswordMgrWithDefaultRealm
保持一個(gè) (realm, uri) -> (user, password) 映射的數(shù)據(jù)庫 。如果沒有其他搜索領(lǐng)域,一個(gè)值為 None 的領(lǐng)域 (realm) 被認(rèn)為是一個(gè)全方位領(lǐng)域。
urllib.request.HTTPPasswordMgrWithPriorAuth
保持一個(gè) HTTPPasswordMgrWithDefaultRealm 變量 還有一個(gè)uri -> is_authenticated 映射的數(shù)據(jù)庫 。當(dāng)發(fā)送身份認(rèn)證可以馬上使用 BasicAuth handler 確認(rèn)身份, 而不是等待 401 報(bào)錯(cuò)響應(yīng)。
urllib.request.AbstractBasicAuthHandler(password_mgr=None)
這是 mixin 類,處理遠(yuǎn)程主機(jī)身份認(rèn)證和代理。使用 is_authenticated 值對(duì)于一個(gè)給定的URI 來決定是否發(fā)送請(qǐng)求來進(jìn)行身份認(rèn)證。如果 s_authenticated 返回 True 則發(fā)送憑證。如果 is_authenticated 是 False ,則憑證不發(fā)送。如果 返回 401 錯(cuò)誤響應(yīng)信息,則身份認(rèn)證失敗。如果身份驗(yàn)證成功, update_authenticated 被稱為設(shè)置 True。
urllib.request.HTTPBasicAuthHandler(password_mgr=None)
處理遠(yuǎn)程主機(jī)的身份認(rèn)證。
urllib.request.ProxyBasicAuthHandler(password_mgr=None)
處理身份認(rèn)證與代理。
urllib.request.AbstractDigestAuthHandler(password_mgr=None)
這是 mixin 類,處理遠(yuǎn)程主機(jī)身份認(rèn)證和代理。
urllib.request.HTTPDigestAuthHandler(password_mgr=None)
實(shí)現(xiàn)遠(yuǎn)程主機(jī)的身份認(rèn)證。如果有password_mgr,應(yīng)該是兼容HTTPPasswordMgr的;請(qǐng)參閱章節(jié) HTTPPasswordMgr以獲取很多接口信息。Digest認(rèn)證處理器和基本認(rèn)證處理器都被加入,Digest認(rèn)證處理器總是首先進(jìn)行驗(yàn)證。如果主機(jī)再次返回一個(gè)40X 響應(yīng),它發(fā)送到基本認(rèn)證處理器進(jìn)行處理。當(dāng)出現(xiàn)除了 Digest 或基本身份的其他身份認(rèn)證時(shí),這個(gè)處理程序方法將提高 ValueError 3.3版本的變化:提高 ValueError不支持的身份驗(yàn)證方案。
urllib.request.ProxyDigestAuthHandler(password_mgr=None)
處理代理身份的驗(yàn)證。如果有password_mgr,應(yīng)該是兼容HTTPPasswordMgr的;請(qǐng)參閱章節(jié)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
開放數(shù)據(jù) URLs。
urllib.request.FTPHandler
開放的 FTP URLs。
urllib.request.CacheFTPHandler
打開 FTP URLS,保持打開的 FTP 連接緩存來減少延遲。
urllib.request.UnknownHandler
全方位類處理未知的 URLs。
urllib.request.HTTPErrorProcessor
HTTP 錯(cuò)誤響應(yīng)過程。