有時(shí)我們發(fā)送的網(wǎng)絡(luò)請(qǐng)求可能會(huì)被服務(wù)器拒絕這可能是該網(wǎng)站設(shè)置了反爬蟲機(jī)制來(lái)防止用戶惡意采集信息,但這不代表我們不能訪問(wèn)該網(wǎng)站,我們可以模擬服務(wù)器的頭部信息去訪問(wèn)。
1. 請(qǐng)求headers處理
我們首先打開(kāi)我們要訪問(wèn)的網(wǎng)站,然后根據(jù)瀏覽器的打開(kāi)方式進(jìn)入檢查頁(yè)面,例如谷歌瀏覽器可以直接按F12或者Ctrl+Shift+I,進(jìn)入下要頁(yè)面:
找到document文件并單擊,如下圖頁(yè)面:
這個(gè)就為我們的頭部信息,也就是我們當(dāng)前訪問(wèn)此網(wǎng)站的用戶信息,我們復(fù)制一下然后開(kāi)始使用它,代碼如下:
import requests url = 'https://www.baidu.com/' headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}#頭部信息 r = requests.get(url,headers = headers)#發(fā)送網(wǎng)絡(luò)請(qǐng)求 print(r.text)#以文本形式輸出網(wǎng)頁(yè)源碼
輸出為網(wǎng)站的html源碼,如下圖:
這種方式類似于我們模擬了一個(gè)用戶去訪問(wèn)該網(wǎng)站,等同于手動(dòng)在打開(kāi)瀏覽器去訪問(wèn)。
2. 網(wǎng)絡(luò)超時(shí)
我們?cè)诎l(fā)送網(wǎng)絡(luò)請(qǐng)求的時(shí)候避免不了超時(shí)現(xiàn)象的發(fā)生,如果我們不設(shè)置一個(gè)超時(shí)時(shí)間,那么系統(tǒng)會(huì)因?yàn)樗L(zhǎng)時(shí)間未響應(yīng)而無(wú)法打開(kāi)網(wǎng)頁(yè)。
超時(shí)又分為連接超時(shí)和讀取超時(shí)。
連接超時(shí)就是在程序默認(rèn)的等待時(shí)間內(nèi)沒(méi)有得到服務(wù)器的響應(yīng)。
我們來(lái)看個(gè)例子:
import datetime import requests url = 'http://www.google.com.hk' print(datetime.datetime.now()) try: r = requests.get(url, timeout = 5).text print('獲得響應(yīng)') except requests.exceptions.RequestException as s: print('連接超時(shí)') print(s) print(datetime.datetime.now())
輸出結(jié)果為:
2020-02-19 21:09:06.084353 連接超時(shí) HTTPConnectionPool(host='www.google.com.hk', port=80): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x0383A298>, 'Connection to www.google.com.hk timed out. (connect timeout=5)')) 2020-02-19 21:09:11.125962
由于國(guó)內(nèi)的服務(wù)器無(wú)法正常訪問(wèn)谷歌,所以出現(xiàn)連接超時(shí)的現(xiàn)象,其中關(guān)鍵語(yǔ)句為:
r = requests.get(url, timeout = 5).text
我們?cè)谶@條語(yǔ)句中設(shè)置超時(shí)限定時(shí)間。
我們?cè)賮?lái)看一下讀取超時(shí),讀取超時(shí)就是指客戶端等待服務(wù)器發(fā)送請(qǐng)求的時(shí)間,也就是指連接成功之后服務(wù)器返回響應(yīng)之間等待的時(shí)間,為了防止服務(wù)器響應(yīng)速度過(guò)慢而導(dǎo)致等待時(shí)間過(guò)長(zhǎng),我們可以設(shè)置讀取時(shí)間,超過(guò)了規(guī)定時(shí)間即為讀取超時(shí),它的用法和連接超時(shí)類似,關(guān)鍵語(yǔ)句為:
r = requests.get(url, timeout=(5,10)).text
在這里15即為讀取限制時(shí)間,如果超過(guò)即為讀取超時(shí)。
3. 總結(jié)
本節(jié)的內(nèi)容能夠幫助我們高效的進(jìn)行爬蟲操作,模擬瀏覽器頭部信息的訪問(wèn)方式在爬蟲中會(huì)經(jīng)常用到,各個(gè)瀏覽器對(duì)應(yīng)的方式可能不同,大家可以通過(guò)自己的瀏覽器去找到相應(yīng)的信息去解讀。
C語(yǔ)言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語(yǔ)言學(xué)練課程
解決困擾你多年的C語(yǔ)言疑難雜癥特性的C語(yǔ)言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會(huì)語(yǔ)法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程