網絡爬蟲的原理

互聯網上,公開數據(各類網頁)都是以http(或加密的http即https)協議傳輸的。因此,咱們這裏介紹的爬蟲技術都是基於http(https)協議的爬蟲。css

在Python的模塊海洋裏,支持http協議的模塊是至關豐富的,既有官方的urllib,也有大名鼎鼎的社區(第三方)模塊 requests。它們都很好的封裝了http協議請求的各類方法,所以,咱們只須要熟悉這些模塊的用法,再也不進一步討論http協議自己。 html

認識瀏覽器和服務器

你們對瀏覽器應該一點都不陌生,能夠說,只要上過網的人都知道瀏覽器。但是,明白瀏覽器各類原理的人可不必定多。python

做爲要開發爬蟲的小夥伴,是必定必定要明白瀏覽器的工做原理的。這是你寫爬蟲的必備工具,別無他。web

你們在面試的時候,有沒有遇到這麼一個很是宏觀而又到處細節的解答題:面試

  • 請說說從你在瀏覽器地址欄輸入網站到你看到網頁中間都發生了什麼?

這真是一個考驗知識面的題啊,經驗老道的老猿既能夠口若懸河的講上三天三夜,也能夠提煉出幾分鐘的精華講個大概。你們恐怕對整個過程就只知其一;不知其二了。ajax

巧的是,對這個問題理解的越透徹,越對寫爬蟲有幫助。換句話說,爬蟲是一個考驗綜合技能的領域。那麼,你們準備好迎接這個綜合技能挑戰了嗎?django

廢話很少說,咱們就從解答這個題目開始,認識瀏覽器和服務器,看看這中間有哪些知識是爬蟲要用到的。編程

前面也說過,這個問題能夠講上三天三夜,但咱們沒那麼多時間,其中一些細節就略過,把大體流程結合爬蟲講一講,分紅三部分:瀏覽器

  1. 瀏覽器發出請求
  2. 服務器作出響應
  3. 瀏覽器接收響應

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,下面是訪問 en.wikipedia.org/wiki/URL 時瀏覽器發送的請求 headers:

可能已經從圖中看出來些端倪,發送的http請求頭是相似一個字典的結構:

  • authority: 就是訪問的目標機器;
  • method: http請求的方法有不少:
    • GET
    • HEAD
    • POST
    • PUT
    • DELETE
    • CONNECT
    • OPTIONS
    • TRACE
    • PATCH 通常,爬蟲使用最多的是GETPOST
  • 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請求加載了咱們須要的數據。

若是你依然在編程的世界裏迷茫,不知道本身的將來規劃,能夠加入咱們的Python學習扣qun:784758214,看看前輩們是如何學習的!交流經驗! 本身是一名高級python開發工程師,從基礎的python腳本到web開發、爬蟲、django、人工智能、數據挖掘等,零基礎到項目實戰的資料都有整理。 送給每一位python的小夥伴!分享一些學習的方法和須要注意的小細節,這裏是python學習者彙集地

點擊:python技術分享

相關文章
相關標籤/搜索