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