天天看點

Python爬蟲常用庫之urllib詳解

以下為個人在學習過程中做的筆記總結之爬蟲常用庫urllib

urlib庫為python3的HTTP内置請求庫

urilib的四個子產品:

urllib.request:用于擷取網頁的響應内容

urllib.error:異常處理子產品,用于處理異常的子產品

urllib.parse:用于解析url

urllib.robotparse:用于解析robots.txt,主要用于看哪些網站不能進行爬取,不過少用

1urllib.request

urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,cadefault=False,context=None)

url:為請求網址

data:請求時需要發送的參數

timeout:逾時設定,在該時間範圍内傳回請求内容就不會報錯

示例代碼:

可以使用上面的代碼對一些網站進行請求了,但是當需要一些反爬網站時,這就不行了,這時我們需要适當地增加請求頭進行請求,這時就需要使用複雜一點的代碼了,這時我們需要用到Request對象

代碼示例:

這個我添加了請求頭進行請求,使我發送的請求更加接近浏覽器的行為。可以對應一些反爬網站了

如果網站需要進行登陸,這時需要用到post方法,用上面的也是可以的。代碼如下:

這裡我用到了data的參數把登陸需要的參數傳進去,還加了個請求方法Method

parse.urlencode()後面有講

這裡還有另外一種添加請求頭的方法

Request.add_header(): 參數有兩個,分别為請求頭對應的鍵和值,這種方法一次隻能添加一個請求頭,添加多個需要用到循環或者直接用前面的方法添加多個請求頭

在登陸了網站之後,我們需要用到cookie來儲存登陸資訊,這時就需要擷取cookie了。urllib擷取cookie比較麻煩。

代碼示例如下:

單純地列印沒什麼用,我們需要把他存入檔案來儲存,下次使用時再次加載cookie來登陸

儲存cookie為檔案:

另一種儲存方法:

這兩種儲存格式都是不一樣的,需要儲存的内容一樣。

儲存可以了,這時就需要用到加載了,當然也可以。代碼如下:

這樣就可以實作不用密碼進行登陸了。

cookie小總結:在操作cookie時,都是分五步,如下:

進行導包,至關重要的一步,不導包直接出錯。

擷取cookie處理對象,使用cookiejar包

建立cookie處理器,使用request.HTTPCookieJarProcessor()

利用cookie處理器建構opener,使用request.build_opener()

進行請求網站,用opener.open(),這個不能用request.urlopen()

如果有時你在同一ip連續多次發送請求,會有被封ip的可能,這時我們還需要用到代理ip進行爬取,代碼如下:

可以看到越複雜的請求都需要用到request.build_opener(),這個方法有點重要,請記住哈

2urllib.error

将上面的使用代理ip的請求進行異常處理,如下:

因為有時這個ip或許也被封了,有可能會抛出異常,是以我們為了讓程式運作下去進而進行捕捉程式

error.URLError: 這個是url的一些問題,這個異常隻有一個reason屬性

error.HTTPError:這個是error.URLError的子類,是以在與上面的混合使用時需要将這個異常放到前面,這個異常是一些請求錯誤,有三個方法,.reason(), .code(), .headers(),是以在捕捉異常時通常先使用這個

3urllib.parse

解析url:urllib.parse.urlparse(url, scheme='', allow_fragments=True)

簡單的使用:

可以看出加了scheme參數和沒加的傳回結果是有差別的。而當scheme協定加了,而前面的url也包含協定,一般會忽略後面的scheme參數

既然後解析url,那當然也有反解析url,就是把元素串連成一個url

urlparse()接收一個清單的參數,而且清單的長度是有要求的,是必須六個參數以上,要不會抛出異常

urllib.parse.urljoin():這個是将第二個參數的url缺少的部分用第一個參數的url補齊

urllib.parse.urlencode():這個方法是将字典類型的參數轉為請求為get方式的字元串

4結語

還有個urllib.robotparse庫少用,就不說了,留給以後需要再去查文檔吧。

上面的隻是我在學習過程中的總結,如果有什麼錯誤的話,歡迎在留言區指出,還有就是需要檢視更多用法的請檢視文檔https://docs.python.org/3/library/urllib.html

需要代碼的可以去我的github上面fork,給個star也行!

github:https://github.com/SergioJune/gongzhonghao_code/blob/master/python3_spider/urllib_test.py

學習過程中看的大多是崔慶才大佬的視訊:https://edu.hellobi.com/course/157

from:https://mp.weixin.qq.com/s?__biz=MzI5NDY1MjQzNA==&mid=2247485940&idx=1&sn=3fabf8c9bb52395675cd71db65cc9109&chksm=ec5ed689db295f9f01f9eb56b95a25fe8221e516969a7ec30794e41fd51fbe582add5002decd&mpshare=1&scene=23&srcid=0329fazECXVxm2F0SylQ9Waw%23rd