一般來(lái)說(shuō),獲取數(shù)據(jù)使用 urllib庫(kù)獲取頁(yè)面。
獲取頁(yè)面數(shù)據(jù)的幾個(gè)知識(shí)點(diǎn):
對(duì)每一個(gè)頁(yè)面,調(diào)用 askURL函數(shù)獲取頁(yè)面內(nèi)容;
定義一個(gè)獲取頁(yè)面的函數(shù)askURL,傳入一個(gè)url函數(shù),表示網(wǎng)址。
urllib.Request生成請(qǐng)求:rullib.urlopen發(fā)送請(qǐng)求獲取響應(yīng),read獲取頁(yè)面內(nèi)容。
在訪(fǎng)問(wèn)頁(yè)面時(shí)經(jīng)常會(huì)出現(xiàn)錯(cuò)誤,為了程序正常運(yùn)行,要加入異常獲取try...excepy...語(yǔ)句
也就是說(shuō),想要快樂(lè)玩耍,必須要明白 urllib庫(kù) 如何使用。
新建個(gè) py 文件,敲幾行代碼了解下urllib庫(kù)。
這個(gè)的意思就是,通過(guò) urlopen 方法打開(kāi)相應(yīng)網(wǎng)頁(yè),并把網(wǎng)頁(yè)返回給定義變量。
讀取結(jié)果就是網(wǎng)頁(yè)的源代碼。
這里切記要對(duì)獲取的網(wǎng)頁(yè)源碼進(jìn)行 utf-8 解析。
話(huà)說(shuō),感覺(jué)這個(gè)跟之前學(xué)到的 requests 的作用差不多啊。
這種獲取網(wǎng)頁(yè)的方式叫做獲取 get 請(qǐng)求。
這個(gè)課程有個(gè)小缺點(diǎn),就是因?yàn)槭敲嫦虼髮W(xué)生的,所以之前他應(yīng)該是有跟這幫孩子講過(guò)網(wǎng)頁(yè)的一些相關(guān)知識(shí)的,所以有時(shí)候涉及到網(wǎng)頁(yè)的一些內(nèi)容,他會(huì)直接拿來(lái)就用。
有時(shí)候會(huì)讓我們這種小白一臉懵逼。
但是問(wèn)題不大,畢竟作為大學(xué)老師,都知道大部分學(xué)生是啥水平,所以以前講過(guò)的內(nèi)容再用的時(shí)候,也不敢用的太多,淺嘗輒止而已,最多就是用幾個(gè)概念罷了。
對(duì)我們來(lái)說(shuō),偶爾碰到幾個(gè)不懂或者沒(méi)聽(tīng)過(guò)的詞,也不怕。
畢竟,每個(gè)宅男碰到問(wèn)題,都有一個(gè)最忠誠(chéng)的女朋友幫我們解決問(wèn)題--度娘。
post請(qǐng)求另一個(gè)獲取網(wǎng)頁(yè)的方式叫做 post 請(qǐng)求, post方式就是訪(fǎng)問(wèn)網(wǎng)址的時(shí)候可以給服務(wù)器發(fā)送一個(gè)表單,在里面把用戶(hù)名、密碼加密。
即模擬用戶(hù)真實(shí)登錄時(shí)使用。
這里為了方便,使用專(zhuān)門(mén)測(cè)試用的網(wǎng)址:httpbin.org
這里需要使用 urllib 的 parse 方法,將下面的 bytes 中的鍵值對(duì)進(jìn)行解析。
使用 bytes 將數(shù)據(jù)變?yōu)樽止?jié)文件進(jìn)行封裝。
鍵值對(duì)中一般放入用戶(hù)名、密碼以及cookie信息。
這里有意思的是圖中的最后一行:"User-Agent": "Python-urllib/3.8"
也就是說(shuō),直接赤果果的告訴服務(wù)器:喂,老兄,哥是用Python訪(fǎng)問(wèn)的,不是用瀏覽器訪(fǎng)問(wèn)的,換句話(huà)說(shuō),我跟你一樣,都不是個(gè)人!
所以以前總聽(tīng)人家說(shuō),爬蟲(chóng)必須要偽裝巴拉巴拉什么的,我估計(jì)應(yīng)該主要原因就是在這里。
你得讓服務(wù)器從你的訪(fǎng)問(wèn)信息里面讀出了,哦,這是通過(guò)瀏覽器訪(fǎng)問(wèn)的,也就是說(shuō),是個(gè)活生生的人,所以,讓他進(jìn)來(lái)吧。
有時(shí)候網(wǎng)速可能不好,也有的時(shí)候?qū)Ψ桨l(fā)現(xiàn)我方是爬蟲(chóng),不想讓我方訪(fǎng)問(wèn)。
這兩種情況都叫做超時(shí)。
網(wǎng)站或程序此時(shí)會(huì)卡死。
這里使用 timeout 可以進(jìn)行設(shè)定時(shí)間。
更重要的是,使用 try...excepy...語(yǔ)句 進(jìn)行異常監(jiān)測(cè)。
也就是說(shuō),對(duì)于超時(shí),要有一個(gè)計(jì)劃性的準(zhǔn)備。
如果在一個(gè)指定的時(shí)間內(nèi)(如3秒、5秒等),服務(wù)器還沒(méi)有反應(yīng),那就應(yīng)該進(jìn)行結(jié)束這次循環(huán),或者不要爬取這個(gè)網(wǎng)頁(yè)的操作。