溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

網(wǎng)絡(luò)爬蟲的原理是什么

發(fā)布時間:2020-09-24 11:12:22 來源:億速云 閱讀:183 作者:Leah 欄目:編程語言

網(wǎng)絡(luò)爬蟲的原理是什么?針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

互聯(lián)網(wǎng)上,公開數(shù)據(jù)(各種網(wǎng)頁)都是以http(或加密的http即https)協(xié)議傳輸?shù)摹K?,我們這里介紹的爬蟲技術(shù)都是基于http(https)協(xié)議的爬蟲。

在Python的模塊海洋里,支持http協(xié)議的模塊是相當(dāng)豐富的,既有官方的urllib,也有大名鼎鼎的社區(qū)(第三方)模塊 requests。它們都很好的封裝了http協(xié)議請求的各種方法,因此,我們只需要熟悉這些模塊的用法,不再進一步討論http協(xié)議本身。

認(rèn)識瀏覽器和服務(wù)器

大家對瀏覽器應(yīng)該一點都不陌生,可以說,只要上過網(wǎng)的人都知道瀏覽器??墒?,明白瀏覽器各種原理可不一定多哦。

作為要開發(fā)爬蟲,是一定一定要明白瀏覽器的工作原理的。這是你寫爬蟲的必備工具,別無他。

不知道大家在面試的時候,有沒有遇到這么一個非常宏觀而又處處細節(jié)的解答題:

請說說從你在瀏覽器地址欄輸入網(wǎng)站到你看到網(wǎng)頁中間都發(fā)生了什么?

這真是一個考驗知識面的題啊,經(jīng)驗老道的既可以滔滔不絕的講上三天三夜,也可以提煉出幾分鐘的精華講個大概。而大家恐怕對整個過程就一知半解了。

巧的是,對這個問題理解的越透徹,越對寫爬蟲有幫助。換句話說,爬蟲是一個考驗綜合技能的領(lǐng)域。那么,準(zhǔn)備好迎接這個綜合技能挑戰(zhàn)了嗎?

廢話不多說,我們就從解答這個題目開始,認(rèn)識瀏覽器和服務(wù)器,看看這中間有哪些知識是爬蟲要用到的。

前面也說過,這個問題可以講上三天三夜,但我們沒那么多時間,其中一些細節(jié)就略過,把大致流程結(jié)合爬蟲講一講,分成三部分:

瀏覽器發(fā)出請求

服務(wù)器做出響應(yīng)

瀏覽器接收響應(yīng)

1. 瀏覽器發(fā)出請求

在瀏覽器地址欄輸入網(wǎng)址后回車,瀏覽器請服務(wù)器提出網(wǎng)頁請求,也就是告訴服務(wù)器,我要看你的某個網(wǎng)頁。

上面短短一句話,蘊藏了無數(shù)玄機啊,讓我不得不費點口舌一一道來。主要講述:

網(wǎng)址是不是有效的?

服務(wù)器在哪里?

瀏覽器向服務(wù)器發(fā)送了些什么?

服務(wù)器返回了些什么?

1) 網(wǎng)址是不是有效的?

首先,瀏覽器要判斷你輸入的網(wǎng)址(URL)是否合法有效。對應(yīng)URL,小猿們并不陌生吧,以http(s)開頭的那一長串的字符,但是你知道它還可以以ftp, mailto, file, data, irc開頭嗎?下面是它最完整的語法格式:

URI = scheme:[//authority]path[?query][#fragment]
# 其中, authority 又是這樣的:
authority = [userinfo@]host[:port]
# userinfo可以同時包含user name和password,以:分割
userinfo = [user_name:password]

用圖更形象的表現(xiàn)處理就是這樣的:

網(wǎng)絡(luò)爬蟲的原理是什么

要判斷URL的合法性

Python里面可以用urllib.parse來進行URL的各種操作

In [1]: import urllib.parse 

In [2]: url = 'http://dachong:the_password@www.yuanrenxue.com/user/info?page=2'

In [3]: zz = urllib.parse.urlparse(url)
Out[4]: ParseResult(scheme='http', netloc='dachong:the_password@www.yuanrenxue.com', 
path='/user/info', params='', query='page=2', fragment='')

我們看到,urlparse函數(shù)把URL分析成了6部分:

scheme://netloc/path;params?query#fragment

需要主要的是 netloc 并不等同于 URL 語法定義中的host

2) 服務(wù)器在哪里?

上面URL定義中的host,就是互聯(lián)網(wǎng)上的一臺服務(wù)器,它可以是一個IP地址,但通常是我們所說的域名。域名通過DNS綁定到一個(或多個)IP地址上。瀏覽器要訪問某個域名的網(wǎng)站就要先通過DNS服務(wù)器解析域名,得到真實的IP地址。

這里的域名解析一般是由操作系統(tǒng)完成的,爬蟲不需要關(guān)心。然而,當(dāng)你寫一個大型爬蟲,像Google、百度搜索引擎那樣的爬蟲的時候,效率變得很主要,爬蟲就要維護自己的DNS緩存。

大型爬蟲要維護自己的DNS緩存

3) 瀏覽器向服務(wù)器發(fā)送些什么?

瀏覽器獲得了網(wǎng)站服務(wù)器的IP地址,就可以向服務(wù)器發(fā)送請求了。這個請求就是遵循h(huán)ttp協(xié)議的。寫爬蟲需要關(guān)心的就是http協(xié)議的headers。

網(wǎng)絡(luò)爬蟲的原理是什么

可能已經(jīng)從圖中看出來些端倪,發(fā)送的http請求頭是類似一個字典的結(jié)構(gòu):

authority: 就是訪問的目標(biāo)機器;

method: http請求的方法有很多:

GET

HEAD

POST

PUT

DELETE

CONNECT

OPTIONS

TRACE

PATCH

一般,爬蟲使用最多的是GET和POST

path: 訪問的網(wǎng)站的路徑

scheme: 請求的協(xié)議類型,這里是https

accept: 能夠接受的回應(yīng)內(nèi)容類型(Content-Types)

accept-encoding: 能夠接受的編碼方式列表

accept-language: 能夠接受的回應(yīng)內(nèi)容的自然語言列表

cache-control: 指定在這次的請求/響應(yīng)鏈中的所有緩存機制 都必須 遵守的指令

cookie: 之前由服務(wù)器通過 Set- Cookie發(fā)送的一個 超文本傳輸協(xié)議Cookie

這是爬蟲很關(guān)心的一個東東,登錄信息都在這里。

upgrade-insecuree-requests: 非標(biāo)準(zhǔn)請求字段,可忽略之。

user-agent: 瀏覽器身份標(biāo)識

這也是爬蟲很關(guān)心的部分。比如,你需要得到手機版頁面,就要設(shè)置瀏覽器身份標(biāo)識為手機瀏覽器的user-agent。

通過設(shè)置headers跟服務(wù)器溝通

4) 服務(wù)器返回了些什么?

如果我們在瀏覽器地址欄輸入一個網(wǎng)頁網(wǎng)址(不是文件下載地址),回車后,很快就看到了一個網(wǎng)頁,里面包含排版文字、圖片、視頻等數(shù)據(jù),是一個豐富內(nèi)容格式的頁面。然而,我通過瀏覽器查看源代碼,看到的卻是一對文本格式的html代碼。

沒錯,就是一堆的代碼,卻讓瀏覽器給渲染成了漂亮的網(wǎng)頁。這對代碼里面有:

css: 瀏覽器根據(jù)它來排版,安排文字、圖片等的位置;

JavaScript: 瀏覽器運行它可以讓用戶和網(wǎng)頁交互;

圖片等鏈接: 瀏覽器再去下載這些鏈接,最終渲染成網(wǎng)頁。

而我們想要爬取的信息就藏在html代碼中,我們可以通過解析方法提取其中我們想要的內(nèi)容。如果html代碼里面沒有我們想要的數(shù)據(jù),但是在網(wǎng)頁里面卻看到了,那就是瀏覽器通過ajax請求異步加載(偷偷下載)了那部分?jǐn)?shù)據(jù)。

這個時候,我們就要通過觀察瀏覽器的加載過程來發(fā)現(xiàn)具體是哪個ajax請求加載了我們需要的數(shù)據(jù)。

關(guān)于網(wǎng)絡(luò)爬蟲的原理是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI