您好,登錄后才能下訂單哦!
網絡爬蟲的原理是什么?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
互聯網上,公開數據(各種網頁)都是以http(或加密的http即https)協議傳輸的。所以,我們這里介紹的爬蟲技術都是基于http(https)協議的爬蟲。
在Python的模塊海洋里,支持http協議的模塊是相當豐富的,既有官方的urllib,也有大名鼎鼎的社區(第三方)模塊 requests。它們都很好的封裝了http協議請求的各種方法,因此,我們只需要熟悉這些模塊的用法,不再進一步討論http協議本身。
認識瀏覽器和服務器
大家對瀏覽器應該一點都不陌生,可以說,只要上過網的人都知道瀏覽器。可是,明白瀏覽器各種原理可不一定多哦。
作為要開發爬蟲,是一定一定要明白瀏覽器的工作原理的。這是你寫爬蟲的必備工具,別無他。
不知道大家在面試的時候,有沒有遇到這么一個非常宏觀而又處處細節的解答題:
請說說從你在瀏覽器地址欄輸入網站到你看到網頁中間都發生了什么?
這真是一個考驗知識面的題啊,經驗老道的既可以滔滔不絕的講上三天三夜,也可以提煉出幾分鐘的精華講個大概。而大家恐怕對整個過程就一知半解了。
巧的是,對這個問題理解的越透徹,越對寫爬蟲有幫助。換句話說,爬蟲是一個考驗綜合技能的領域。那么,準備好迎接這個綜合技能挑戰了嗎?
廢話不多說,我們就從解答這個題目開始,認識瀏覽器和服務器,看看這中間有哪些知識是爬蟲要用到的。
前面也說過,這個問題可以講上三天三夜,但我們沒那么多時間,其中一些細節就略過,把大致流程結合爬蟲講一講,分成三部分:
瀏覽器發出請求
服務器做出響應
瀏覽器接收響應
1. 瀏覽器發出請求
在瀏覽器地址欄輸入網址后回車,瀏覽器請服務器提出網頁請求,也就是告訴服務器,我要看你的某個網頁。
上面短短一句話,蘊藏了無數玄機啊,讓我不得不費點口舌一一道來。主要講述:
網址是不是有效的?
服務器在哪里?
瀏覽器向服務器發送了些什么?
服務器返回了些什么?
1) 網址是不是有效的?
首先,瀏覽器要判斷你輸入的網址(URL)是否合法有效。對應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]
用圖更形象的表現處理就是這樣的:
要判斷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函數把URL分析成了6部分:
scheme://netloc/path;params?query#fragment
需要主要的是 netloc 并不等同于 URL 語法定義中的host
2) 服務器在哪里?
上面URL定義中的host,就是互聯網上的一臺服務器,它可以是一個IP地址,但通常是我們所說的域名。域名通過DNS綁定到一個(或多個)IP地址上。瀏覽器要訪問某個域名的網站就要先通過DNS服務器解析域名,得到真實的IP地址。
這里的域名解析一般是由操作系統完成的,爬蟲不需要關心。然而,當你寫一個大型爬蟲,像Google、百度搜索引擎那樣的爬蟲的時候,效率變得很主要,爬蟲就要維護自己的DNS緩存。
大型爬蟲要維護自己的DNS緩存
3) 瀏覽器向服務器發送些什么?
瀏覽器獲得了網站服務器的IP地址,就可以向服務器發送請求了。這個請求就是遵循http協議的。寫爬蟲需要關心的就是http協議的headers。
可能已經從圖中看出來些端倪,發送的http請求頭是類似一個字典的結構:
authority: 就是訪問的目標機器;
method: http請求的方法有很多:
GET
HEAD
POST
PUT
DELETE
CONNECT
OPTIONS
TRACE
PATCH
一般,爬蟲使用最多的是GET和POST
path: 訪問的網站的路徑
scheme: 請求的協議類型,這里是https
accept: 能夠接受的回應內容類型(Content-Types)
accept-encoding: 能夠接受的編碼方式列表
accept-language: 能夠接受的回應內容的自然語言列表
cache-control: 指定在這次的請求/響應鏈中的所有緩存機制 都必須 遵守的指令
cookie: 之前由服務器通過 Set- Cookie發送的一個 超文本傳輸協議Cookie
這是爬蟲很關心的一個東東,登錄信息都在這里。
upgrade-insecuree-requests: 非標準請求字段,可忽略之。
user-agent: 瀏覽器身份標識
這也是爬蟲很關心的部分。比如,你需要得到手機版頁面,就要設置瀏覽器身份標識為手機瀏覽器的user-agent。
通過設置headers跟服務器溝通
4) 服務器返回了些什么?
如果我們在瀏覽器地址欄輸入一個網頁網址(不是文件下載地址),回車后,很快就看到了一個網頁,里面包含排版文字、圖片、視頻等數據,是一個豐富內容格式的頁面。然而,我通過瀏覽器查看源代碼,看到的卻是一對文本格式的html代碼。
沒錯,就是一堆的代碼,卻讓瀏覽器給渲染成了漂亮的網頁。這對代碼里面有:
css: 瀏覽器根據它來排版,安排文字、圖片等的位置;
JavaScript: 瀏覽器運行它可以讓用戶和網頁交互;
圖片等鏈接: 瀏覽器再去下載這些鏈接,最終渲染成網頁。
而我們想要爬取的信息就藏在html代碼中,我們可以通過解析方法提取其中我們想要的內容。如果html代碼里面沒有我們想要的數據,但是在網頁里面卻看到了,那就是瀏覽器通過ajax請求異步加載(偷偷下載)了那部分數據。
這個時候,我們就要通過觀察瀏覽器的加載過程來發現具體是哪個ajax請求加載了我們需要的數據。
關于網絡爬蟲的原理是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。