這篇文章主要介紹了Python爬蟲(chóng)進(jìn)階之如何使用urllib庫(kù),具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)建站長(zhǎng)期為1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為瑯琊企業(yè)提供專業(yè)的成都網(wǎng)站制作、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè),瑯琊網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
python的數(shù)據(jù)類(lèi)型:1. 數(shù)字類(lèi)型,包括int(整型)、long(長(zhǎng)整型)和float(浮點(diǎn)型)。2.字符串,分別是str類(lèi)型和unicode類(lèi)型。3.布爾型,Python布爾類(lèi)型也是用于邏輯運(yùn)算,有兩個(gè)值:True(真)和False(假)。4.列表,列表是Python中使用最頻繁的數(shù)據(jù)類(lèi)型,集合中可以放任何數(shù)據(jù)類(lèi)型。5. 元組,元組用”()”標(biāo)識(shí),內(nèi)部元素用逗號(hào)隔開(kāi)。6. 字典,字典是一種鍵值對(duì)的集合。7. 集合,集合是一個(gè)無(wú)序的、不重復(fù)的數(shù)據(jù)組合。
python爬蟲(chóng)因其效率高開(kāi)發(fā)迅速的優(yōu)勢(shì)受到廣大程序員的青睞,python爬蟲(chóng)的使用依賴于本身各種庫(kù)的功能,其中urllib庫(kù)是python中的一個(gè)http請(qǐng)求庫(kù),含有四個(gè)模塊,有著不同的功能,使用方法也有很多,本文向大家介紹urllib庫(kù)的四個(gè)模塊和四種使用方法:1、獲取某個(gè)網(wǎng)站的方式;2、超時(shí)處理;3、簡(jiǎn)單解析-響應(yīng)頭;4、將爬蟲(chóng)偽裝成服務(wù)器發(fā)出請(qǐng)求。
一、urllib庫(kù)是什么?
urllib是python中的一個(gè)http請(qǐng)求庫(kù),借助urllib,我們可以向?yàn)g覽器發(fā)出請(qǐng)求,只需向urllib庫(kù)中的方法傳入url和一些參數(shù)即可。
urllib庫(kù)中包含以下模塊:
1、urllib.request
http請(qǐng)求模塊,用于模擬向?yàn)g覽器發(fā)出請(qǐng)求的過(guò)程;
2、urllib.error
異常處理模塊,當(dāng)利用urllib.request模擬向?yàn)g覽器發(fā)出請(qǐng)求時(shí),如果出現(xiàn)請(qǐng)求錯(cuò)誤,可以利用此模塊捕獲異常信息,然后進(jìn)行重試或其他操作,以保證程序不會(huì)意外終止;
3、urllib.parse
包含了針對(duì)url的許多處理方法,如url拆分、url解析、url合并等;
4、urllib.robotparser
robots.txt解析模塊,主要用于識(shí)別網(wǎng)站的robots.txt文件,判斷哪些網(wǎng)站可以爬,那些網(wǎng)站不可爬。此模塊不太經(jīng)常被使用。
二、Python爬蟲(chóng)中常用的urllib方法
首先需要導(dǎo)入urllib模塊,如下
import urllib.request import urllib.parse # 解析器,將鍵值對(duì)按utf-8或其他形式解析
1、獲取某個(gè)網(wǎng)站的方式
(1)獲取一個(gè)get請(qǐng)求
response = urllib.request.urlopen("http://www.baidu.com") print(response.read().decode("utf-8")) # 第二行的輸出是對(duì)獲取到的對(duì)象response的信息-網(wǎng)頁(yè)源碼進(jìn)行utf-8的解碼
(2)獲取pose請(qǐng)求
data = bytes(urllib.parse.urlencode({"hello": "world"}), encoding='utf-8') # 一般模擬用戶登錄時(shí)使用此種方式,在{}內(nèi)加上cookie內(nèi)容 response = urllib.request.urlopen("https://baidu.com", data=data) print(response.read().decode("utf-8"))
采用post訪問(wèn)時(shí)需要傳遞表單信息,通過(guò)表單的封裝才能訪問(wèn)post,代碼中bytes將信息轉(zhuǎn)換為二進(jìn)制包。
當(dāng)需要模擬瀏覽器發(fā)出請(qǐng)求時(shí),必須用post形式來(lái)封裝數(shù)據(jù)(用data封裝),否則有405報(bào)錯(cuò)。
2、超時(shí)處理
當(dāng)要訪問(wèn)的服務(wù)器排斥爬蟲(chóng),或鏈接是死鏈接、網(wǎng)絡(luò)不好等情況出現(xiàn)時(shí),頁(yè)面在一定的時(shí)間內(nèi)會(huì)沒(méi)有反應(yīng),這時(shí)可以設(shè)置一個(gè)時(shí)間限制,避免一直等待。
response = urllib.request.urlopen("https://baidu.com", timeout=0.1) print(response.read().decode("utf-8"))
若訪問(wèn)超時(shí)會(huì)出現(xiàn)如下報(bào)錯(cuò),可以利用異常處理結(jié)束循環(huán)或者停止爬取該網(wǎng)頁(yè),向其他網(wǎng)頁(yè)發(fā)送get請(qǐng)求。
try: response = urllib.request.urlopen("http://www.baidu.com",timeout=0.1) print(response.read().decode("utf-8")) except urllib.error.URLError as e: print("time out!")
3、簡(jiǎn)單解析-響應(yīng)頭
網(wǎng)絡(luò)爬蟲(chóng)有時(shí)會(huì)返回一些錯(cuò)誤信息,此時(shí)我們可以返回響應(yīng)狀態(tài)碼來(lái)大致判斷報(bào)錯(cuò)類(lèi)型。
response = urllib.request.urlopen("http://www.baidu.com") print(response.status) # 返回狀態(tài)碼-200、404、418等 print(response.getheaders()) # 返回頭部所有信息
常見(jiàn)的狀態(tài)碼如418報(bào)錯(cuò)是因?yàn)樵L問(wèn)的服務(wù)器發(fā)現(xiàn)該請(qǐng)求是一個(gè)爬蟲(chóng),也即爬蟲(chóng)時(shí)常見(jiàn)的反爬機(jī)制,此時(shí)可改用requests庫(kù)、添加header信息等方法解決。
4、將爬蟲(chóng)偽裝成服務(wù)器發(fā)出請(qǐng)求
# 訪問(wèn)反爬的網(wǎng)址 url = "http://www.douban.com" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36" } req = urllib.request.Request(url=url, headers=headers, method="POST") # req是請(qǐng)求對(duì)象而非響應(yīng)對(duì)象 response = urllib.request.urlopen(req) html = response.read().decode("utf-8") print(html)
代碼中的headers來(lái)自瀏覽器頁(yè)面,在chrome中進(jìn)入想訪問(wèn)的瀏覽頁(yè)面,點(diǎn)擊F12或右鍵檢查-Network中,即可查到User-Agent信息,粘貼到代碼中(需注意大小寫(xiě)及空格,代碼中的格式要和瀏覽器信息一致)。
user-agent的作用是告訴所訪問(wèn)的服務(wù)器,我們是何種類(lèi)型的機(jī)器(瀏覽器),若只用User-Agent會(huì)返回百度驗(yàn)證界面,可加入Cookie返回所要爬取的結(jié)果頁(yè)面
三、爬蟲(chóng)頻率過(guò)快導(dǎo)致失敗
現(xiàn)在很多網(wǎng)站對(duì)異常用戶訪問(wèn)網(wǎng)站頻次過(guò)高設(shè)置了安全訪問(wèn)機(jī)制。在這個(gè)時(shí)候,如果你想繼續(xù)訪問(wèn)這個(gè)網(wǎng)站,HTTP代理ip非常重要。當(dāng)前ip地址有限,可以更改新的ip地址,保證爬蟲(chóng)的順利進(jìn)行。
推薦使用優(yōu)質(zhì)的代理ip資源,保證爬蟲(chóng)程序的順利進(jìn)行。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Python爬蟲(chóng)進(jìn)階之如何使用urllib庫(kù)”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!