Scrapy學習筆記-基本庫的使用urllib

瞭解一下urllib庫,它是Python內置的HTTP 請求庫,也就是說不需要額外安裝即可使用它,包含如下4 個模塊。
在這裏插入圖片描述

發送請求

使用urllib的request模塊,我們可以方便地實現請求的發送並得到響應。本節就來看下它的具體用法。

urlopen

urllib.request模塊提供了最基本的構造HTTP請求的方法, 利用它可以模擬瀏覽器的一個請求發起過程, 同時它還帶有處理授權驗證( authenticaton )、重定向( redirection) 、瀏覽器Cookies 以及其他內容。
利用最基本的urlopen方法,可以完成最基本的簡單網頁的GET請求抓取

import urllib.request
response = urllib.request.urlopen('https://www.python.org')
print(type(response))
print(response.read().decode('utf-8'))

在這裏插入圖片描述
response是一個HTTPResponse類型的對象,主要包含read、readinto、getheader、getheaders、fileno等方法,以及msg、version、status、reason、debuglevel、closed等屬性。調用read方法可以得到返回的網頁內容,調用status 屬性可以得到返回結果的狀態碼

前兩個輸出分別輸出了響應的狀態碼和響應的頭信息,最後一個輸出通過調用getheader方法並傳遞一個參數Server 獲取了響應頭中的Server 值,結果是nginx ,意思是服務器是用Nginx搭建的。
在這裏插入圖片描述

在這裏插入圖片描述
data 參數是可選的。如果要添加該參數,並且如果它是字節流編碼格式的內容,即bytes類型,則需要通過bytes方法轉化。另外,如果傳遞了這個參數,則它的請求方式就不再是GET 方式,而是POST 方式
在這裏插入圖片描述
傳遞了一個參數word ,值是hello o 它需要被轉碼成bytes (字節流)類型。其中轉字節流採用了bytes方法,該方法的第一個參數需要是str (字符串)類型,需要用urllib.parse模塊裏的urlencode方法來將參數字典轉化爲字符串;第二個參數指定編碼格式,這裏指定爲utf8 。我們傳遞的參數州現在了form 字段中,這表明是模擬了表單提交的方式,以POST 方式傳輸數據。

timeout參數用於設置超時時間,單位爲秒,意思就是如果請求超出了設置的這個時間, 還沒有得到響應, 就會拋出異常。如果不指定該參數,就會使用全局默認時間。它支持HTTP , HTTPS 、FTP請求。
在這裏插入圖片描述
拋出了URLError異常,該異常屬於urllib.error模塊,錯誤原因是超時。因此,可以通過設置這個超時時間來控制一個網頁如果長時間未響應,就跳過它的抓取。這可以利用try except語句來實現。
在這裏插入圖片描述
這裏我們請求測試鏈接,設置超時時間是O l 秒,然後捕獲了URLError 異常,接着判斷異常是socket.timeout 類型(意思就是超時異常)。

context參數,它必須是ssl.SSLContext類型,用來指定SSL設置。cafile 和capath這兩個參數分別指定CA 證書和它的路徑,這個在請求HTTPS鏈接時會有用。cadefault參數現在已經棄用了,其默認值爲False 。

Request

利用urlopen方法可以實現最基本請求的發起,但這幾個簡單的參數並不足以構建一個完整的請求。如果請求中需要加入Headers 等信息,就可以利用更強大的Request類來構建。依然是用urlopen方法來發送這個請求,只不過這次該方法的參數不再是URL,而是一個Request類型的對象
在這裏插入圖片描述
在這裏插入圖片描述
第一個參數url用於請求URL ,這是必傳參數,其他都是可選參數。第二個參數data 如果要傳,必須傳bytes(字節流)類型的。如果它是字典,可以先用urllib.parse 模塊裏的urlencode()編碼。
第三個參數headers 是一個字典,它就是請求頭,我們可以在構造請求時通過headers 參數直接構造,也可以通過調用請求實例的add_ header方法添加。添加請求頭最常用的用法就是通過修改User-Agent 來僞裝瀏覽器,默認的User-Agent 是一Python-urllib ,我們可以通過修改它來僞裝瀏覽器。比如要僞裝火狐瀏覽器,你可以把它設置爲:Mozilla/s.o (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11
第四個參數origin_req_host 指的是請求方的host 名稱或者IP 地址。
第五個參數unverifiable 表示這個請求是否是無法驗證的,默認是False ,意思就是說用戶沒有足夠權限來選擇接收這個請求的結果。例如,我們請求一個HTML 文檔中的圖片,但是我們沒有向動抓取圖像的權限,這時unverifiable 的值就是True。
第六個參數method是一個字符串,用來指示請求使用的方法,比如GET 、POST 和PUT 等。
在這裏插入圖片描述
在這裏插入圖片描述

urllib.request模塊裏的BaseHandler 類,它是所有其他Handler 的父類,它提供了最基本的方法,例如default_open 、protocol_request 等。接下來,就有各種Handler子類繼承這個BaseHandler 類,舉例如下。
在這裏插入圖片描述
另一個比較重要的類就是OpenerDirector ,我們可以稱爲Opener 。我們之前用過urlopen這個方法,實際上它就是urllib 爲我們提供的一個Opener。那麼,爲什麼要引人Opener 呢?因爲需要實現更高級的功能。之前使用的Request 和urlopen相當於類庫爲你封裝好了極其常用的請求方法,利用它們可以完成基本的請求,但是現在不一樣了,我們需要實現更高級的功能,所以需要深入一層進行配置,使用更底層的實例來完成操作,所以這裏就用到了Opener 。
Opener 可以使用open方法,返回的類型和urlopen如出一轍。那麼,它和Handler 有什麼關係呢?簡而言之,就是利用Handler來構建Opener
驗證
在這裏插入圖片描述
首先實例化HTTPBasicAuthHandler 對象,其參數是HTTPPasswordMgrWithDefaultRealm 對象,它利用add_password 添加進去用戶名和密碼,這樣就建立了一個處理驗證的Handler。接下來,利用這個Handler 並使用build_opener方法構建一個Opener ,這個Opener 在發送請求時就相當於已經驗證成功了。接下來,利用Opener的open方法打開鏈接,就可以完成驗證了。
代理
在這裏插入圖片描述
這裏在本地搭建了一個代理,它運行在9743端口上。使用了ProxyHandler ,其參數是一個字典,鍵名是協議類型(比如HTTP 或者HTTPS 等),鍵值是代理鏈接,可以添加多個代理。

Cookies
將網站的Cookies 獲取下來
在這裏插入圖片描述在這裏插入圖片描述
聲明一個CookieJar對象。接下來,就需要利用HTTPCookieProcessor來構建一個Handler ,最後利用build_opener方法構建出Opener ,執行open函數即可。
輸出成文件格式,CookieJar 就需要換成問ozillaCookieJar ,它在生成文件時會用到,是CookieJar 的子類,可以用來處理Cookies 和文件相關的事件,比如讀取和保存Cookies ,可以將Cookies 保存成Mozilla 型瀏覽器的Cookies 格式。
LWPCookieJar 同樣可以讀取和保存Cookies ,但是保存的格式和MozillaCookieJar 不一樣,它會保存成libwww-perl(LWP)格式的Cookies 文件。
在這裏插入圖片描述
生成了Cookies 文件後,怎樣從文件中讀取並利用呢?以LWPCookieJar 格式爲例來看一下:
在這裏插入圖片描述
這裏調用load方法來讀取本地的Cookies 文件,獲取到了Cookies 的內容。不過前提是我們首先生成了LWPCookieJar格式的Cookies ,並保存成文件,然後讀取Cookies 之後使用同樣的方法構建Handler 和Opener 即可完成操作。

處理異常

urllib的error模塊定義了由request 模塊產生的異常。如果出現了問題, request模塊便會拋出error模塊中定義的異常。

URLError

URLError類來自urllib庫的error模塊,它繼承自OSError類,是error異常模塊的基類,由request模塊生的異常都可以通過捕獲這個類來處理。它具有一個屬性reason ,即返回錯誤的原因。
在這裏插入圖片描述
打開一個不存在的頁面照理來說應該會報錯,但是這時我們捕獲了URL Error 這個異常,運行結果如下:Not Found 程序沒有直接報錯,而是輸歸瞭如上內容,這樣通過如上操作,我們就可以避免程序異常終止,同時異常得到了有效處理。

HTTPError

它是URLError 的子類,專門用來處理HTTP 請求錯誤,比如認證請求失敗等。它有如下3 個屬性
code : 返回HTTP 狀態碼,比如404 表示網頁不存在, 500 表示服務器內部錯誤等。
reason :同父類一樣,用於返回錯誤的原因。
headers : 返回請求頭。
在這裏插入圖片描述
因爲URLError是HTTPError的父類,所以可以先選擇捕獲子類的錯誤,再去捕獲父類的錯誤,所以上述代碼更好的寫法如下:
在這裏插入圖片描述
這樣就可以做到先捕獲HTTPError ,獲取它的錯誤狀態碼、原因、headers 等信息。如果不是HTTPError 異常,就會捕獲URLError 異常,輸出錯誤原因。最後,用else 來處理正常的邏輯。
有時候, reason 屬性返回的不一定是字符串,也可能是一個對象
在這裏插入圖片描述
可以發現, reason 屬性的結果是socket.timeout 類。所以,這裏我們可以用isinstance方法來判斷它的類型,作出更詳細的異常判斷。

解析鏈接

urllib庫裏還提供了parse模塊,它定義了處理URL的標準接口,例如實現URL各部分的抽取、合併以及鏈接轉換。它支持如下協議的URL處理:file、ftp、gopher、hdl、http、https、imap、mailto、mms、news、nntp、prospero、rsync、rtsp、rtspu、sftp、sip、sips、snews、svn、svn+ssh、telnet和wais。
urlparse方法可以實現URL 的識別和分段
在這裏插入圖片描述
返回結果是一個ParseResult類型的對象,它包含6個部分,分別是scheme、netloc、path、params、query和fragment 。可以發現, urlparse方法將其拆分成了6 個部分。大體觀察可以發現,解析時有特定的分隔符。比如,😕/前面的就是scheme ,代表協議;第一個/符號前面便是netloc ,即域名,後面是path,即訪問路徑;分號;前面是params,代表參數;問號?後面是查詢條件query,一般用作GET類型的URL;井號#後面是錨點,用於直接定位頁面內部的下拉位置。
在這裏插入圖片描述
在這裏插入圖片描述
urlstring :這是必填項,即待解析的URL。scheme:它是默認的協議(比如http或https等)。假如這個鏈接沒有帶協議信息,會將這.個作爲默認的協議。allow_ fragments:即是否忽略fragment 。如果它被設置爲False,fragment 部分就會被忽略,它會被解析爲path、parameters或者query的一部分,而fragment部分爲空。
返回結果ParseResult實際上是一個元組,我們可以用索引順序來獲取,也可以用屬性名獲取
在這裏插入圖片描述

urlunparse實現URL的構造,接受的參數是一個可迭代對象,但是它的長度必須是6 , 否則會拋出參數數量不足或者過多的問題。
在這裏插入圖片描述

urlsplit和urlparse方法非常相似, 只不過它不再單獨解析params這一部分,只運回5個結果。params會合併到path中。返回結果是SplitResult , 它其實也是一個元組類型, 既可以用屬性獲取值,也可以用索引來獲取。
在這裏插入圖片描述
urlunsplit是將鏈接各個部分組合成完整鏈接的方法,傳人的參數也是一個可迭代對象,例如列表、元組等,唯一的區別是長度必須爲5
在這裏插入圖片描述
urljoin 提供一個base_url(基礎鏈接)作爲第一個參數,將新的鏈接作爲第二個參數,該方法會分析base_url的scheme 、netloc和path這3 個內容並對新鏈接缺失的部分進行補充,最後返回結果。

base_url提供了三項內容scheme、netloc和path。如果這3 項在新的鏈接裏不存在,就予以補充;如果新的鏈接存在,就使用新的鏈接的部分。而base_url中的params 、query和fragment是不起作用的。
在這裏插入圖片描述
urlencode 構造GET 請求參數
在這裏插入圖片描述
首先聲明瞭一個字典來將參數表示出來,然後調用urlencode方法將其序列化爲GET請求參數。
parse_qs GET 請求參數轉回字典
在這裏插入圖片描述
parse_qsl 將參數轉化爲元組組成的列表
在這裏插入圖片描述

quote 將內容轉化爲URL編碼的格式。URL中帶有中文參數時,有時可能會導致亂碼的問題,此時用這個方法可以將巾文字符轉化爲URL編碼
在這裏插入圖片描述
unquote URL 解碼

分析Robots協議

利用urllib的robotparser模塊,可以實現網站Robots協議的分析。robots.txt文件,放在網站的根目錄下,和網站的人口文件(比如index.php 、index.html 和index.jsp 等)放在一起。
禁止所有爬蟲訪問任何目錄的代碼如下:
在這裏插入圖片描述
允許所有爬蟲訪問任何目錄的代碼如下:
在這裏插入圖片描述
禁止所有爬蟲訪問網站某些目錄的代碼如下:
在這裏插入圖片描述
只允許某一個爬蟲訪問的代碼如下:
在這裏插入圖片描述
在這裏插入圖片描述
robotparser提供了一個類RobotFileParser,它可以根據某網站的robots.txt 文件來判斷一個爬取爬蟲是否有權限來爬取這個網頁。
該類用起來非常簡單,只需要在構造方法裏傳人robots.txt 的鏈接即可。當然,也可以在聲明時不傳人,默認爲空,最後再使用set_url方法設置一下也可。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

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