1. 程式人生 > >909422229_資料爬蟲:爬蟲的基本原理介紹

909422229_資料爬蟲:爬蟲的基本原理介紹

一、什麼是爬蟲

爬蟲:請求網站並提取資料的自動化程式

百科:網路爬蟲(又被稱為網頁蜘蛛,網路機器人,在FOAF社群中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動地抓取全球資訊網資訊的程式或者指令碼。另外一些不常使用的名字還有螞蟻、自動索引、模擬程式或者蠕蟲。

如果我們把網際網路比作一張大的蜘蛛網,資料便是存放於蜘蛛網的各個節點,而爬蟲就是一隻小蜘蛛,

沿著網路抓取自己的獵物(資料)爬蟲指的是:向網站發起請求,獲取資源後分析並提取有用資料的程式;

從技術層面來說就是 通過程式模擬瀏覽器請求站點的行為,把站點返回的HTML程式碼/JSON資料/二進位制資料(圖片、視訊) 爬到本地,進而提取自己需要的資料,存放起來使用;

二、爬蟲基本流程

  1. 發起請求:通過HTTP庫向目標站點發起請求,即傳送一個Request,請求可以包含額外的headers等資訊,等待伺服器響應。
  2. 獲取響應內容:如果伺服器能正常響應,會得到一個Response,Response的內容便是所要獲取的頁面內容,型別可能有HTML,Json字串,二進位制資料(如圖片視訊)等型別。
  3. 解析內容:得到的內容可能是HTML,可以用正則表示式、網頁解析庫進行解析。可能是Json,可以直接轉為Json物件解析,可能是二進位制資料,可以做儲存或者進一步的處理。
  4. 儲存資料:儲存形式多樣,可以存為文字,也可以儲存至資料庫,或者儲存特定格式的檔案。

三、Request和Response

  1. Request:瀏覽器就傳送訊息給該網址所在的伺服器,這個過程叫做HTTP Request
  2. Response:伺服器收到瀏覽器傳送的訊息後,能夠根據瀏覽器傳送訊息的內容,做相應處理,然後把訊息回傳給瀏覽器。這個過程叫做HTTP Response。瀏覽器收到伺服器的Response資訊後,會對資訊進行相應處理,然後展示。

四、Request詳解

  1. 請求方式:主要有GET、POST兩種型別,另外還有HEAD、PUT、DELETE、OPTIONS等。
  2. 請求URL:URL全稱統一資源定位符,如一個網頁文件、一張圖片、一個視訊等都可以用URL唯一來確定。
  3. 請求頭:包含請求時的頭部資訊,如User-Agent、Host、Cookies等資訊。
  4. 請求體:請求時額外攜帶的資料如表單提交時的表單資料

五、Response詳解

  1. 響應狀態:有多種響應狀態,如200代表成功、301跳轉、404找不到頁面、502伺服器錯誤
  2. 響應頭:如內容型別、內容長度、伺服器資訊、設定Cookie等等。
  3. 響應體:最主要的部分,包含了請求資源的內容,如網頁HTML、圖片二進位制資料等。

六、能抓取哪些資料

  1. 網頁文字:如HTML文件、Json格式文字等。
  2. 圖片:獲取到的是二進位制檔案,儲存為圖片格式。
  3. 視訊:同為二進位制檔案,儲存為視訊格式即可。
  4. And so on:只要是能請求到的,都能獲取。

七、解析方式

  1. 直接處理
  2. Json解析
  3. 正則表示式
  4. BeautifulSoup
  5. PyQuery
  6. XPath

八、抓取中出現的問題

問:為什麼我抓到的和瀏覽器看到的不一樣?

答:網頁通過瀏覽器的解析,載入CSS與JS等檔案對網頁進行解析渲染,達到我們看到絢麗的網頁,而我們抓到的檔案只是一些程式碼,css檔案無法呼叫,使得樣式不能表現出來,那麼網頁就會出現錯位等等問題。

問:怎樣解決JavaScript渲染的問題?

答:分析Ajax請求、Selenium/WebDriver、Splash、PyV8、Ghost.py等庫

九、優秀爬蟲的特性

優秀爬蟲的特性對於不同的應用來說,可能實現的方式各有差異,但是實用的爬蟲都應該具備以下特性。

01高效能

網際網路的網頁數量是海量的。所以爬蟲的效能至關重要,這裡的效能主要是指爬蟲下載網頁的抓取速度,常見的評價方式是以爬蟲每秒能夠下載的網頁數量作為效能指標,單位時間能夠下載的網頁數量越多,爬蟲的效能越高。

要提高爬蟲的效能,在設計時程式訪問磁碟的操作方法及具體實現時資料結構的選擇很關鍵,比如對於待抓取URL佇列和已抓取URL佇列,因為URL數量非常大,不同實現方式效能表現迥異,所以高效的資料結構對於爬蟲效能影響很大。

02可擴充套件性

即使單個爬蟲的效能很高,要將所有網頁都下載到本地,仍然需要相當長的時間週期,為了能夠儘可能縮短抓取週期,爬蟲系統應該有很好地可擴充套件性,即很容易通過增加抓取伺服器和爬蟲數量來達到此目的。

目前實用的大型網路爬蟲一定是分散式執行的,即多臺伺服器專做抓取,每臺伺服器部署多個爬蟲,每個爬蟲多執行緒執行,通過多種方式增加併發性。對於巨型的搜尋引擎服務商來說,可能還要在全球範圍、不同地域分別部署資料中心,爬蟲也被分配到不同的資料中心,這樣對於提高爬蟲系統的整體效能是很有幫助的。

03健壯性

爬蟲要訪問各種型別的網站伺服器,可能會遇到很多種非正常情況,比如網頁HTML編碼不規範, 被抓取伺服器突然宕機,甚至爬蟲陷阱等。爬蟲對各種異常情況能否正確處理非常重要,否則可能會不定期停止工作,這是無法忍受的。

從另外一個角度來講,假設爬蟲程式在抓取過程中死掉,或者爬蟲所在的伺服器宕機,健壯的爬蟲應能做到,再次啟動爬蟲時,能夠恢復之前抓取的內容和資料結構,而不是每次都需要把所有工作完全從頭做起,這也是爬蟲健壯性的一種體現。

04友好性

爬蟲的友好性包含兩方面的含義:一是保護網站的部分私密性,另一是減少被抓取網站的網路負載。爬蟲抓取的物件是各型別的網站,對於網站所有者來說,有些內容並不希望被所有人搜到,所以需要設定協議,來告知爬蟲哪些內容是不允許抓取的。目前有兩種主流的方法可達到此目的:爬蟲禁抓協議和網頁禁抓標記。

爬蟲禁抓協議指的是由網站所有者生成一個指定的檔案robot.txt,並放在網站伺服器的根目錄下,這個檔案指明瞭網站中哪些目錄下的網頁是不允許爬蟲抓取的。具有友好性的爬蟲在抓取該網站的網頁前,首先要讀取robot.txt檔案,對於禁止抓取的網頁不進行下載。

網頁禁抓標記一般在網頁的HTML程式碼里加入meta name="robots”標記,content欄位指出允許或者不允許爬蟲的哪些行為。可以分為兩種情形,一種是告知爬蟲不要索引該網頁內容,以noindex作為標記;另外一種情形是告知爬蟲不要抓取網頁所包含的連結,以nofollow作為標記。通過這種方式,可以達到對網頁內容的一種隱私保護。

遵循以上協議的爬蟲可以被認為是友好的,這是從保護私密性的角度來考慮的。另外一種友好性則是,希望爬蟲對某網站的訪問造成的網路負載較低。爬蟲一般會根據網頁的連結連續獲取某網站的網頁,如果爬蟲訪問網站頻率過高,會給網站伺服器造成很大的訪問壓力,有時候甚至會影響網站的正常訪問,造成類似DOS攻擊的效果,為了減少網站的網路負載,友好性的爬蟲應該在抓取策略部署時考慮每個被抓取網站的負載,在儘可能不影響爬蟲效能的情況下,減少對單一站點短期內的高頻訪問。

十、儲存資料

  1. 文字:純文字、Json、Xml等。
  2. 關係型資料庫:如MySQL、Oracle、SQL Server等具有結構化表結構形式儲存。
  3. 非關係型資料庫:如MongoDB、Redis等Key-Value形式儲存。
  4. 二進位制檔案:如圖片、視訊、音訊等等直接儲存成特定格式即可