爬蟲之urllib庫的使用

  • 2019 年 10 月 7 日
  • 筆記

昨天在了解了網頁基本的請求和響應之後,今天我們來了解下python內置HTTP請求庫urllib庫的使用。

首先什麼是庫?

簡單的說就是別人寫好的東西,你拿來調用就可以實現基本的操作。比如電視你只用看,不用知道他是如何成像的。

urllib庫之request(用來模擬HTTP請求)模組

request的第一個方法urlopen()

我們以淘寶為例寫上這樣一段程式碼:

read()是返回得到的內容,decode('utf8')是編碼格式。

返回的結果如下:

如果我們不想獲取頁面,只想獲取請求的狀態碼或者頭資訊只需要

print(html.status)獲取狀態碼,print(html.getheaders())獲取頭資訊,可能你會說那莫多方法我怎麼知道他有什麼方法,此時只需要print(dir(html))一下,所有的方法,屬性盡收眼底。那我怎麼知道他是幹什麼的呢?help()一下就知道。

接下來我們來說一下urlopen()方法的參數:

我們利用上面說的去看一下有什麼參數:

得到如下結果:

卧槽?怎麼全英文???無奈,苦逼的我只好打開Google翻譯。。。

data參數:

data參數是幹什麼的?我們知道我們在登錄的時候的會填寫帳號密碼,那麼我們模擬登錄的時候也要填寫,這個參數就是做這個的!值得注意的是當我們添加了這個參數之後請求方式就不再是GET,而是POST請求。並且data參數是位元組流編碼格式我們需要轉化一下。

httpbin.org/post是一個請求測試網站,如下我們可以看到我們傳遞的參數已經在裡面了。

timeout參數:

tomeout參數是設置超時時間的,如果超出這個時間未得到響應就會拋出超時異常。下面我們來練習一下:

iisinstance()函數用來判斷是否是超時,socket.timeout就是超時異常,而e.reason是捕捉的異常,做一個判斷。

結果如下:

其他參數用到的時候再說,目前不需要了解吧。

request的第二個方法Request()

同樣以淘寶為例:

結果和上面的結果是一樣的,我們可以發現只是請求的對象發生了改變,這有什麼用了?這樣會讓我們更靈活的添加參數或者配置,沒什麼其他卵用,來說一下Request的參數吧。

help一下:

url,data和上面的一樣,headers表示請求頭,是一個字典,我們在爬取網站的時候通常會加上一個User-Agent參數,防止被識別為爬蟲,修改它,偽裝成瀏覽器。origin_reg_host是指請求的ip或者host,unverifiable是是否有抓取的許可權沒有為True,否者是False,mothod為請求方式。

我們試著去添加多個參數:

結果:

也可以用方法去添加,這個就自己去試吧。

error模組

1,URLError類

昨天我們導入包的方式感覺很煩,每次寫都會很長

想要變得簡單點可以這樣寫:

隨便輸入一個網址,並沒有直接報錯。

2,HTTPError類(針對HTTP請求錯誤的類,使用方式和上面的一樣)

結果:

  • reason:返回錯誤原因
  • code:返回狀態碼
  • headers:返回請求頭資訊

這裡只針對爬蟲用到的來說一下。

parse模組

paese模組總的來說就是對url的操作,各種解析和合併等

拆分的有:

  • urlparse()
  • urlsplit()

結果:

urlsplit()和urlparse()一樣,不同是是urlsplit()的結果將parsms合併到了path里

合併的有:

  • urlunparse()合併的列表長度必須為6個
  • urlunsplit()合併的列表長度變成了5個

結果:

urlunsplit()的寫法也一樣只是變成了長度變成了5。

序列化和反序列化(我的理解是轉化成符合某種格式)

urlencode():將字典轉化為get請求的編碼格式

parse_qs():將GET請求的參數轉化成字典

結果 :

當url中有漢字時我們需要轉化成url的編碼格式quote()轉化回來unquote()

結果:

其實上面講的有三個模組,request請求模組,parse對url的處理模組和error異常處理模組。