Python3 urllib庫的使用

什么是 Urllib 庫?

urllib 庫 是Python內(nèi)置的 HTTP 請(qǐng)求庫。urllib 模塊提供的上層接口,使訪問 www 和 ftp 上的數(shù)據(jù)就像訪問本地文件一樣。

有以下幾種模塊:

1.urllib.request 請(qǐng)求模塊

  1. urllib.error 異常處理模塊

  2. urllib.parse url 解析模塊

  3. 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)、UnknownHandlerHTTPHandler、HTTPDefaultErrorHandler、HTTPRedirectHandlerFTPHandler、FileHandlerDataHandler、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 換成 MozillaCookieJarCookieJar 的子類) ,用于生成文件。*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è)置)、UnknownHandlerHTTPHandler、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.HTTPSConnectioncontextcheck_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)過程。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容