上一篇文章: Python3網絡爬蟲實戰---1六、Web網頁基礎
下一篇文章: Python3網絡爬蟲實戰---1八、Session和Cookies
爬蟲,即網絡爬蟲,咱們能夠把互聯網就比做一張大網,而爬蟲即是在網上爬行的蜘蛛,咱們能夠把網的節點比作一個個網頁,爬蟲爬到這就至關於訪問了該頁面獲取了其信息,節點間的連線能夠比作網頁與網頁之間的連接關係,這樣蜘蛛經過一個節點後能夠順着節點連線繼續爬行到達下一個節點,即經過一個網頁繼續獲取後續的網頁,這樣整個網的節點即可以被蜘蛛所有爬行到,這樣網站的數據就能夠被抓取下來了。html
可能上面的說明仍是難以具體地描述爬蟲到底是個什麼,簡單來講,爬蟲就是獲取網頁並提取和保存信息的自動化程序,接下來對各個點進行說明:前端
爬蟲首先要作的工做就是獲取網頁,在這裏獲取網頁即獲取網頁的源代碼,源代碼裏面必然包含了網頁的部分有用的信息,因此只要把源代碼獲取下來了,就能夠從中提取咱們想要的信息了。正則表達式
在前面咱們講到了 Request 和 Response 的概念,咱們向網站的服務器發送一個 Request,返回的 Response 的 Body 即是網頁源代碼。因此最關鍵的部分就是構造一個 Request 併發送給服務器,而後接收到 Response 並將其解析出來,那這個流程能夠怎樣來實現呢?總不能手工去截取網頁源碼把?數據庫
不用擔憂,Python 裏面提供了許多庫來幫助咱們實現這個操做,如 Urllib、Requests 等,咱們能夠用這些庫來幫助咱們實現 HTTP 請求操做,Request 和 Response 均可以用類庫提供的數據結構來表示,獲得 Response 以後只須要解析數據結構中的 Body 部分便可,即獲得網頁的源代碼,這樣咱們能夠用程序來實現獲取網頁的過程了。
提取信息segmentfault
咱們在第一步獲取了網頁源代碼以後,接下來的工做就是分析網頁源代碼,從中提取咱們想要的數據,首先最通用的方法即是採用正則表達式提取,這是一個萬能的方法,可是在構造正則表達式的時候比較複雜且容易出錯。瀏覽器
另外因爲網頁的結構是有必定規則的,因此還有一些根據網頁節點屬性、CSS 選擇器或 XPath 來提取網頁信息的庫,如 BeautifulSoup、PyQuery、LXML 等,使用這些庫能夠高效快速地從中提取網頁信息,如節點的屬性、文本值等內容。服務器
提取信息是爬蟲很是重要的部分,它可使雜亂的數據變得清晰條理,以便於咱們後續在對數據進行處理和分析。網絡
提取信息以後咱們通常會將提取到的數據保存到某處以便後續數據處理使用。保存形式有多種多樣,如能夠簡單保存爲 TXT 文本或 Json 文本,也能夠保存到數據庫,如 MySQL、MongoDB 等,也可保存至遠程服務器,如藉助 Sftp 進行操做等。數據結構
說到自動化程序,意思便是說爬蟲能夠代替人來完成這些操做。首先咱們手工固然是能夠提取這些信息的,可是當量特別大或者想快速獲取大量數據的話,確定仍是藉助於程序。因此爬蟲就是代替咱們來完成這份爬取數據的工做的自動化程序,它能夠在抓取過程當中進行各類異常處理、錯誤重試等操做,確保爬取持續高效地運行。併發
在網頁中咱們能看到各類各樣的信息,最多見的即是常規網頁,其都對應着 HTML 代碼,而最多見的抓取即是抓取 HTML 源代碼。
另外可能有些網頁返回的不是 HTML 代碼,而是返回一個 Json 字符串,API 接口大多采用這樣的形式,方便數據的傳輸和解析,這種數據一樣能夠抓取,並且數據提取更加方便。
此外咱們還能夠看到各類二進制數據,如圖片、視頻、音頻等等,咱們能夠利用爬蟲將它們的二進制數據抓取下來,而後保存成對應的文件名便可。
另外咱們還能夠看到各類擴展名的文件,如 CSS、JavaScript、配置文件等等,這些其實也是最普通的文件,只要在瀏覽器裏面訪問到,咱們就能夠將其抓取下來。
以上的內容其實都對應着各自的URL,是基於 HTTP 或 HTTPS 協議的,只要是這種數據爬蟲均可以進行抓取。
有時候咱們在用 Urllib 或 Requests 抓取網頁時,獲得的源代碼實際和瀏覽器中看到的是不同的。
這個問題是一個很是常見的問題,如今網頁愈來愈多地採用 Ajax、前端模塊化工具來構建網頁,整個網頁可能都是由 JavaScript 渲染出來的,意思就是說原始的 HTML 代碼就是一個空殼,例如:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>This is a Demo</title> </head> <body> <div id="container"> </div> </body> <script src="app.js"></script> </html>
body 節點裏面只有一個 id 爲 container 的節點,可是注意到在 body 節點後引入了一個 app.js,這個便負責了整個網站的渲染。
在瀏覽器打開這個頁面時,首先會加載這個 HTML 內容,接着瀏覽器會發現其中裏面引入了一個 app.js 文件,而後瀏覽器便會接着去請求這個文件,獲取到該文件以後便會執行其中的 JavaScript 代碼,而 JavaScript 則會改變 HTML 中的節點,向內添加內容,最後獲得完整的頁面。
可是在用 Urllib 或 Requests 等庫來請求當前頁面時,咱們獲得的只是這個 HTML 代碼,它不會幫助咱們去繼續加載這個 JavaScript 文件,這樣也就看不到瀏覽器中看到的內容了。
這也解釋了爲何有時咱們獲得的源代碼和瀏覽器中看到的是不同的。
因此使用基本 HTTP 請求庫獲得的結果源代碼可能跟瀏覽器中的頁面源代碼不太同樣。對於這樣的狀況,咱們能夠分析其後臺 Ajax 接口,也可以使用 Selenium、Splash 這樣的庫來實現模擬 JavaScript 渲染,這樣咱們即可以爬取 JavaScript 渲染的網頁的內容了。
在後文咱們會詳細介紹對於 JavaScript 渲染的網頁的採集方法。
本節介紹了爬蟲的一些基本原理,瞭解瞭如上內容能夠幫助咱們在後面編寫爬蟲的時候更加駕輕就熟。
上一篇文章: Python3網絡爬蟲實戰---1六、Web網頁基礎
下一篇文章: Python3網絡爬蟲實戰---1八、Session和Cookies