概述:有了前面的基礎,本篇就來看看爬蟲的基本原理吧!html
蟲子有不少種,爲何咱們把爬蟲看作蜘蛛呢?由於咱們能夠把網頁看作網的節點,把網頁之間的連接關係看作節點之間的連線。這樣是否是很像蜘蛛網?爬蟲爬過一個節點後,又能夠順着節點連線爬到下一個節點(經過連接獲取其餘網頁),周而復始,就能爬到全部節點。前端
簡單來講,爬蟲就是獲取網頁,從中提取信息、保存數據的自動化程序。正則表達式
咱們說的「獲取網頁」,就是指獲取網頁的源代碼。數據庫
咱們前面講過,向網站服務器發送一個請求,返回的響應體就是網頁源代碼。那麼這部分的關鍵就是,如何構建一個請求併發給服務器,而後接收並解析響應。瀏覽器
咱們能夠利用 Python 提供的庫(如 urllib、requests 等)來實現 HTTP 請求操做,請求和響應均可以用類庫提供的數據結構來表示,獲得相應以後,咱們只須要解析數據結構中的 Body 部分便可(這就是源代碼)。服務器
拿到源代碼後,就要分析源代碼,從中提取有用數據。經常使用方法有兩種:數據結構
提取到有用信息後,須要保存數據,以供後續使用。一般作法有如下三種:併發
爬蟲能夠自動在抓取過程當中進行異常處理、錯誤重試等操做,自動化程度高,尤爲適用於數據量大、對速度要求高的使用場景。app
只要是基於 HTTP 或 HTTPS 協議,具備對應的 URL 的數據,都可以抓取模塊化
最多見的常規網頁對應 HTML 代碼,這也是咱們最常抓取的內容。
有些網頁返回的不是 HTML 代碼,而是 JSON 字符串。API 接口大多采用這樣的形式。
如圖片、音頻、視頻等。
如 CSS、JavaScript、配置文件等。
有時咱們使用 urllib 或 requests 抓取到的網頁源代碼和實際在瀏覽器中看到的不同。這是由於如今的網頁愈來愈多地採用 Ajax 和前端模塊化工具來狗圈,網頁多是由 JavaScript 渲染出來的,原始的 HTML 代碼只是一個空殼。
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8」> 5 <title>This is a Oemo</title> 6 </head> 7 <body> 8 <div id=」container」 > 9 </div> 10 </body> 11 <script src=」app.js 」></script> 12 </html>
以上代碼的 body 中,只有一個 id 爲 container 的節點,可是 body 後飲用了 app.js,它負責整個網站的渲染。瀏覽器打開這個頁面時,首先加載 HTML 內容,接下來瀏覽器發現引入了 app.js 文件,因而繼續請求這個文件。獲取到文件後,執行其中的 JavaScript 代碼,由此改變 HTML 的節點,向其中添加內容,獲得完整界面。
使用 urllib 或 requests 庫請求頁面時,只能獲得 HTML 代碼,不會繼續加載 JavaScript 文件,天然也就沒法看到瀏覽器中的內容了。
因爲使用基本 HTTP 請求庫獲得的源代碼和瀏覽器中的頁面源代碼不一致,咱們能夠分析其後臺 Ajax 接口,也可使用 Selenium、Splash 等庫來實現模擬 JavaScript 渲染。