摘要:如果要添加該參數(shù),并且如果它是字節(jié)流編碼格式的內(nèi)容,即類型,則需要通過(guò)方法轉(zhuǎn)化。通過(guò)的格式將字典進(jìn)行字節(jié)流的編碼,將編碼后的字節(jié)流數(shù)據(jù)傳輸?shù)街付ㄟ@里存在一個(gè),要進(jìn)行指定方式解碼。第二個(gè)參數(shù)如果要傳,必須傳字節(jié)流類型的。
請(qǐng)求頭中的內(nèi)容:
Date: 標(biāo)識(shí) 響應(yīng)產(chǎn)生 的時(shí)間 。
Last-Modified: 指定資源的最后修改時(shí)間。
Content-Encoding: 指定 響應(yīng) 內(nèi)容的編碼 。
Server: 包含服務(wù)器的信息,比如名稱、版本號(hào)等。
Content-Type: 文檔類型,指定返回的數(shù)據(jù)類型是什么,如 text/html代表返回 HTML文檔,
application/x-javascript !J!U代表返回 JavaScript文件, image/jpeg則代表返回圖片 。
Set-Cookie: 設(shè)置 Cookies。 響應(yīng)頭 中的 Set-Cookie 告訴瀏覽器需要將此內(nèi)容放在 Cookies中, 下次請(qǐng)求攜帶 Cookies請(qǐng)求。
Expires: 指定響應(yīng)的過(guò)期時(shí)間 , 可以使代理服務(wù)器或?yàn)g覽器將加載的內(nèi)容更新到緩存。如果再次訪問(wèn)時(shí),就可以直接從緩存中加載,降低服務(wù)器負(fù)載,縮短加載時(shí)間。
1.urllib.request模塊request: 最基本的HTTP請(qǐng)求模塊,可以用來(lái)模擬發(fā)送請(qǐng)求。就像在瀏覽器里輸入網(wǎng)址然后回車一樣,只需要給庫(kù)方法傳入 URL 以及額外的參數(shù),就可以模擬實(shí)現(xiàn)這個(gè)過(guò)程了 ,同時(shí)它還帶有處理授權(quán)驗(yàn)證( authenticaton )、重定向( redirection)、瀏覽器 Cookies 以及其他內(nèi)容。
error: 異常處理模塊,如果出現(xiàn)請(qǐng)求錯(cuò)誤,我們可以捕獲這些異常,然后進(jìn)行重試或其他操作以保證程序不會(huì)意外終止 。
parse: 一個(gè)工具模塊,提供了許多 URL處理方法,比如拆分,解析,合并等。
robotparser:主要是用來(lái)識(shí)別網(wǎng)站的 robots.txt文件,然后判斷哪些網(wǎng)站可以爬,哪些網(wǎng)站不可以爬,它其實(shí)用得比較少 。
urllib.request.urlopen() 為最基本HTTP請(qǐng)求的方法
import urllib.request response= urllib.request.urlopen("https://www.python.org") print(response.read().decode ("utf-8")) //打印出網(wǎng)頁(yè)的源代碼 print(type(response)) //說(shuō)明該對(duì)象類型為HTTPResponse類型。 print(response.status) //200 print(response.getheaders()) // [("Server", "nginx"), ("Content-Type", "text/html; charset=utf-8"), ("X-Frame-Options", "DENY"), ("Via", "1.1 vegur"), ("Via", "1.1 varnish"), ("Content-Length", "48995"), ("Accept-Ranges", "bytes"), ("Date", "Mon, 13 May 2019 09:23:37 GMT"), ("Via", "1.1 varnish"), ("Age", "3595"), ("Connection", "close"), ("X-Served-By", "cache-iad2139-IAD, cache-tyo19927-TYO"), ("X-Cache", "HIT, HIT"), ("X-Cache-Hits", "1, 6071"), ("X-Timer", "S1557739417.434556,VS0,VE0"), ("Vary", "Cookie"), ("Strict-Transport-Security", "max-age=63072000; includeSubDomains")] print(response.getheader("Server")) //nginx
HTTPResposne類型的對(duì)象,主要包含
read()、 readinto()、 getheader(name)、getheaders()、 fileno()等方法,以及 msg、 version、status、reason、debuglevel、closed等屬性。
如果想給鏈接傳遞一些參數(shù),該怎么實(shí)現(xiàn)呢?首先看一下urlopen()函數(shù)的 API:
urllib.request.urlopen(url, data=None, timeout=
? data參數(shù)
data 參數(shù)是可選的。 如果要添加該參數(shù),并且如果它是字節(jié)流編碼格式的內(nèi)容,即 bytes 類型, 則需要通過(guò) bytes()方法轉(zhuǎn)化。 另外,如果傳遞了這個(gè)參數(shù),則它的請(qǐng)求方式就不再是 GET方式,而是POST方式。
import urllib data = bytes(urllib.parse.urlencode({"word":"hello"}), encoding="utf8") //通過(guò)utf8的格式將字典進(jìn)行字節(jié)流的編碼, response= urllib.request.urlopen("http://httpbin.org/post", data=data) //將編碼后的字節(jié)流數(shù)據(jù)傳輸?shù)街付║RL print(response.read().decode("utf-8"))//這里存在一個(gè)bug,要進(jìn)行指定方式解碼。
Result:
{ "args": {}, "data": "", "files": {}, "form": { "word": "hello" }, "headers": { "Accept-Encoding": "identity", "Content-Length": "10", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "Python-urllib/3.6" }, "json": null, "origin": "171.81.189.140, 171.81.189.140", "url": "https://httpbin.org/post" }
? timeout參數(shù)
timeout參數(shù)用于設(shè)置超時(shí)時(shí)間,單位為秒,意思就是如果請(qǐng)求超出了設(shè)置的這個(gè)時(shí)間,還沒(méi)有得到響應(yīng),就會(huì)拋出異常。如果不指定該參數(shù),就會(huì)使用全局默認(rèn)時(shí)間。它支持HTTP,HTTPS,FTP請(qǐng)求。
import socket import urllib try: response = urllib.request.urlopen("http://httpbin.org/get", timeout=0.1) //如果時(shí)間超過(guò)0.1S不響應(yīng)就報(bào)錯(cuò)。 except urllib.error.URLError as e: if isinstance(e.reason,socket.timeout): print("TIME OUT!")
? 其他參數(shù)
除了data參數(shù)和timeout參數(shù)外,還有context參數(shù),它必須是 ssl.SSLContext類型,用來(lái)指定SSL 設(shè)置。此外,cafile和 capath這兩個(gè)參數(shù)分別指定 CA證書(shū)和它的路徑,這個(gè)在請(qǐng)求 HTTPS鏈接時(shí)會(huì)有用。
cadefault參數(shù)現(xiàn)在已經(jīng)棄用了,其默認(rèn)值為 False。
import urllib.request request = urllib.request.Request("https://python.org") response = urllib .request.urlopen(request) print(response.read().decode ("utf-8"))
依然是用 urlopen()方法來(lái)發(fā)送這個(gè)請(qǐng)求,只不過(guò)該方法的參數(shù)不再是 URL, 而是一個(gè) Request 類型的對(duì)象。通過(guò)構(gòu)造這個(gè)數(shù)據(jù)結(jié)構(gòu),一方面我們可以將請(qǐng)求獨(dú)立成一個(gè)對(duì)象,另 一方面可更加豐富和靈活地配置參數(shù) 。
class urllib. request. Request (url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
第一個(gè)參數(shù)url用于請(qǐng)求URL,這是必傳參數(shù),其余可選。
第二個(gè)參數(shù) data 如果要傳,必須傳 bytes (字節(jié)流)類型的。如果它是字典,可以先用 urllib.parse模塊里的urlencode()編碼。將字典里面所有的鍵值轉(zhuǎn)化為query-string格式(key=value&key=value),并且將中文轉(zhuǎn)碼。
第三個(gè)參數(shù) headers是一個(gè)字典,它就是請(qǐng)求頭,我們可以在構(gòu)造請(qǐng)求時(shí)通過(guò) headers參數(shù)直 接構(gòu)造,也可以通過(guò)調(diào)用請(qǐng)求實(shí)例的 add_header()方法添加。
添加請(qǐng)求頭最常用的用法就是通過(guò)修改 User-Agent 來(lái)偽裝瀏覽器,默認(rèn)的 User-Agent 是Python-urllib,我們可以通過(guò)修改它來(lái)偽裝瀏覽器 。 比如要偽裝火狐瀏覽器,你可以把它設(shè)置為 :Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:66.0) Gecko/20100101 Firefox/66.0
第四個(gè)參數(shù) origin_req_host指的是請(qǐng)求方的host名稱或者IP地址。
第五個(gè)參數(shù) unverifiable表示這個(gè)請(qǐng)求是否是無(wú)法驗(yàn)證 的,默認(rèn)是 False,意思就是說(shuō)用戶沒(méi)有足夠權(quán)限來(lái)選擇接收這個(gè)請(qǐng)求的結(jié)果。 例如,我們請(qǐng)求一個(gè) HTML文檔中的圖片,但是我 們沒(méi)有向動(dòng)抓取圖像的權(quán)限,這時(shí)unverifiable 的值就是True。
第六個(gè)參數(shù) method是一個(gè)字符串 ,用來(lái)指示請(qǐng)求使用的方法,比如 GET、 POST和 PUT等
from urllib import parse,request url = "http://httpbin.org/post" headers = { "User-Agent":"Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)", "Host" :"httpbin.org" } dict={ "name":"Gremey" } data= bytes(parse.urlencode(dict), encoding="utf-8") #req = request.Request(url=url, data=data, headers=headers, method="POST") //上面是直接寫(xiě)好headers傳遞參數(shù)傳遞給對(duì)象,下面是多帶帶的通過(guò)對(duì)象的方法傳遞 req=request.Request(url=url, data=data, method="POST") req.add_header("User-Agent","Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)") response = request.urlopen(req) print(response.read().decode("utf-8"))3. 高級(jí)用法
在上面的過(guò)程中,我們雖然可以構(gòu)造請(qǐng)求,但是對(duì)于一些更高級(jí)的操作(比如 Cookies處理 、 代理設(shè)置等),該如何處理?
就需要更強(qiáng)大的工具 Handler 登場(chǎng)了。簡(jiǎn)而言之,我們可以把它理解為各種處理器,有專門(mén)處理登錄驗(yàn)證的,有處理 Cookies 的,有處理代理設(shè)置的。利用它們,我們幾乎可以做到 HTTP請(qǐng)求中所有的事。
urllib .request 模塊里的 BaseHandler類,它是所有其他 Handler 的父類,它提 供了最基本的方法,例如 default_open()、 protocol_request()等。
接下來(lái),就有各種 Handler 子類繼承這個(gè) BaseHandler類,舉例如下 。
HITPDefaultErrorHandler:用于處理HTTP響應(yīng)錯(cuò)誤,錯(cuò)誤都會(huì)拋出 HTTPError類型的異常。
HTTPRedirectHandler:用于處理重定向。
HTTPCookieProcessor: 用于處理 Cookies。
ProxyHandler:用于設(shè)置代理 , 默認(rèn)代理為空 。
HπPPasswordMgr:用于管理密碼,它維護(hù)了用戶名和密碼的表。
HTTPBasicAuthHandler: 用于管理認(rèn)證,如果一個(gè)鏈接打開(kāi)時(shí)需要認(rèn)證,那么可以用它來(lái)解決認(rèn)證問(wèn)題。
另一個(gè)比較重要的類就是 OpenerDirector,我們可以稱為 Opener。 我們之前用過(guò) urlopen()這個(gè)方法,實(shí)際上它就是urllib為我們提供的一個(gè)Opener。
那么,為什么要引人Opener 呢?因?yàn)樾枰獙?shí)現(xiàn)更高級(jí)的功能。之前使用的 Request 和 urlopen() 相當(dāng)于類庫(kù)為你封裝好了極其常用的請(qǐng)求方法,利用它們可以完成基本的請(qǐng)求,但是現(xiàn)在不一樣了,我們需要實(shí)現(xiàn)更高級(jí)的功能,所以需要深入一層進(jìn)行配置,使用更底層的實(shí)例來(lái)完成操作,所以這里就用到了Opener。
Opener可以使用 open()方法,返回的類型和urlopen()如出一轍。 那么,它和 Handler 有什么關(guān) 系呢?簡(jiǎn)而言之,就是利用 Handler來(lái)構(gòu)建 Opener。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/43914.html
摘要:以下這些項(xiàng)目,你拿來(lái)學(xué)習(xí)學(xué)習(xí)練練手。當(dāng)你每個(gè)步驟都能做到很優(yōu)秀的時(shí)候,你應(yīng)該考慮如何組合這四個(gè)步驟,使你的爬蟲(chóng)達(dá)到效率最高,也就是所謂的爬蟲(chóng)策略問(wèn)題,爬蟲(chóng)策略學(xué)習(xí)不是一朝一夕的事情,建議多看看一些比較優(yōu)秀的爬蟲(chóng)的設(shè)計(jì)方案,比如說(shuō)。 (一)如何學(xué)習(xí)Python 學(xué)習(xí)Python大致可以分為以下幾個(gè)階段: 1.剛上手的時(shí)候肯定是先過(guò)一遍Python最基本的知識(shí),比如說(shuō):變量、數(shù)據(jù)結(jié)構(gòu)、語(yǔ)法...
摘要:針對(duì)的初學(xué)者,從無(wú)到有的語(yǔ)言如何入門(mén),主要包括了的簡(jiǎn)介,如何下載,如何安裝,如何使用終端,等各種開(kāi)發(fā)環(huán)境進(jìn)行開(kāi)發(fā),中的語(yǔ)法和基本知識(shí)概念和邏輯,以及繼續(xù)深入學(xué)習(xí)的方法。 ...
摘要:時(shí)間永遠(yuǎn)都過(guò)得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過(guò)去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
摘要:我的決定是學(xué)人工智能,當(dāng)時(shí)對(duì)這個(gè)比較感興趣。從機(jī)器學(xué)習(xí)學(xué)到深度學(xué)習(xí)再學(xué)回機(jī)器學(xué)習(xí)。面試,成功地去公司從事機(jī)器學(xué)習(xí)深度學(xué)習(xí)方面的基礎(chǔ)工作。這個(gè)系列不僅僅以學(xué)習(xí)為目的,目的是為了達(dá)到機(jī)器學(xué)習(xí)的工作入門(mén)標(biāo)準(zhǔn)。 每個(gè)字都是經(jīng)驗(yàn)所得,都是站在一個(gè)零基礎(chǔ)的人的角度寫(xiě)的,純手打+網(wǎng)上優(yōu)秀資源整合,希望大家能每個(gè)字都認(rèn)真看。 接下來(lái)文章會(huì)側(cè)重在以下幾方面 1、零基礎(chǔ)如何進(jìn)行人工智能的自學(xué)(以找工作為目...
閱讀 2137·2023-04-25 18:49
閱讀 1840·2019-08-30 14:02
閱讀 2643·2019-08-29 17:24
閱讀 3323·2019-08-28 18:10
閱讀 2926·2019-08-28 18:03
閱讀 488·2019-08-26 12:01
閱讀 3309·2019-08-26 11:31
閱讀 1409·2019-08-26 10:29