第03讲. 原理探究,了解爬虫的基本原理
1.爬蟲(chóng)概述
我們可以把互聯(lián)網(wǎng)比作一張大網(wǎng),而爬蟲(chóng)(即網(wǎng)絡(luò)爬蟲(chóng))便是在網(wǎng)上爬行的蜘蛛。如果把網(wǎng)的節(jié)點(diǎn)比作一個(gè)個(gè)網(wǎng)頁(yè),爬蟲(chóng)爬到這就相當(dāng)于訪問(wèn)了該頁(yè)面,獲取了其信息。可以把節(jié)點(diǎn)間的連線比作網(wǎng)頁(yè)與網(wǎng)頁(yè)之間的鏈接關(guān)系,這樣蜘蛛通過(guò)一個(gè)節(jié)點(diǎn)后,可以順著節(jié)點(diǎn)連線繼續(xù)爬行到達(dá)下一個(gè)節(jié)點(diǎn),即通過(guò)一個(gè)網(wǎng)頁(yè)繼續(xù)獲取后續(xù)的網(wǎng)頁(yè),這樣整個(gè)網(wǎng)的節(jié)點(diǎn)便可以被蜘蛛全部爬行到,網(wǎng)站的數(shù)據(jù)就可以被抓取下來(lái)了。
簡(jiǎn)單來(lái)說(shuō),爬蟲(chóng)就是獲取網(wǎng)頁(yè)并提取和保存信息的自動(dòng)化程序,下面概要介紹一下。
2.獲取網(wǎng)頁(yè)
爬蟲(chóng)首先要做的工作就是獲取網(wǎng)頁(yè),這里就是獲取網(wǎng)頁(yè)的源代碼。
源代碼里包含了網(wǎng)頁(yè)的部分有用信息,所以只要把源代碼獲取下來(lái),就可以從中提取想要的信息了。
前面講了請(qǐng)求和響應(yīng)的概念,向網(wǎng)站的服務(wù)器發(fā)送一個(gè)請(qǐng)求,返回的響應(yīng)體便是網(wǎng)頁(yè)源代碼。所以,最關(guān)鍵的部分就是構(gòu)造一個(gè)請(qǐng)求并發(fā)送給服務(wù)器,然后接收到響應(yīng)并將其解析出來(lái),那么這個(gè)流程怎樣實(shí)現(xiàn)呢?總不能手工去截取網(wǎng)頁(yè)源碼吧?
不用擔(dān)心,Python 提供了許多庫(kù)來(lái)幫助我們實(shí)現(xiàn)這個(gè)操作,如 urllib、requests 等。我們可以用這些庫(kù)來(lái)幫助我們實(shí)現(xiàn) HTTP 請(qǐng)求操作,請(qǐng)求和響應(yīng)都可以用類庫(kù)提供的數(shù)據(jù)結(jié)構(gòu)來(lái)表示,得到響應(yīng)之后只需要解析數(shù)據(jù)結(jié)構(gòu)中的 Body 部分即可,即得到網(wǎng)頁(yè)的源代碼,這樣我們可以用程序來(lái)實(shí)現(xiàn)獲取網(wǎng)頁(yè)的過(guò)程了。
3.提取信息
獲取網(wǎng)頁(yè)源代碼后,接下來(lái)就是分析網(wǎng)頁(yè)源代碼,從中提取我們想要的數(shù)據(jù)。首先,最通用的方法便是采用正則表達(dá)式提取,這是一個(gè)萬(wàn)能的方法,但是在構(gòu)造正則表達(dá)式時(shí)比較復(fù)雜且容易出錯(cuò)。
另外,由于網(wǎng)頁(yè)的結(jié)構(gòu)有一定的規(guī)則,所以還有一些根據(jù)網(wǎng)頁(yè)節(jié)點(diǎn)屬性、CSS 選擇器或 XPath 來(lái)提取網(wǎng)頁(yè)信息的庫(kù),如 Beautiful Soup、pyquery、lxml 等。使用這些庫(kù),我們可以高效快速地從中提取網(wǎng)頁(yè)信息,如節(jié)點(diǎn)的屬性、文本值等。
提取信息是爬蟲(chóng)非常重要的部分,它可以使雜亂的數(shù)據(jù)變得條理清晰,以便我們后續(xù)處理和分析數(shù)據(jù)。
4.保存數(shù)據(jù)
提取信息后,我們一般會(huì)將提取到的數(shù)據(jù)保存到某處以便后續(xù)使用。這里保存形式有多種多樣,如可以簡(jiǎn)單保存為 TXT 文本或 JSON 文本,也可以保存到數(shù)據(jù)庫(kù),如 MySQL 和 MongoDB 等,還可保存至遠(yuǎn)程服務(wù)器,如借助 SFTP 進(jìn)行操作等。
5.自動(dòng)化程序
說(shuō)到自動(dòng)化程序,意思是說(shuō)爬蟲(chóng)可以代替人來(lái)完成這些操作。首先,我們手工當(dāng)然可以提取這些信息,但是當(dāng)量特別大或者想快速獲取大量數(shù)據(jù)的話,肯定還是要借助程序。爬蟲(chóng)就是代替我們來(lái)完成這份爬取工作的自動(dòng)化程序,它可以在抓取過(guò)程中進(jìn)行各種異常處理、錯(cuò)誤重試等操作,確保爬取持續(xù)高效地運(yùn)行。
6.能抓怎樣的數(shù)據(jù)
在網(wǎng)頁(yè)中我們能看到各種各樣的信息,最常見(jiàn)的便是常規(guī)網(wǎng)頁(yè),它們對(duì)應(yīng)著 HTML 代碼,而最常抓取的便是 HTML 源代碼。
另外,可能有些網(wǎng)頁(yè)返回的不是 HTML 代碼,而是一個(gè) JSON 字符串(其中 API 接口大多采用這樣的形式),這種格式的數(shù)據(jù)方便傳輸和解析,它們同樣可以抓取,而且數(shù)據(jù)提取更加方便。
此外,我們還可以看到各種二進(jìn)制數(shù)據(jù),如圖片、視頻和音頻等。利用爬蟲(chóng),我們可以將這些二進(jìn)制數(shù)據(jù)抓取下來(lái),然后保存成對(duì)應(yīng)的文件名。
另外,還可以看到各種擴(kuò)展名的文件,如 CSS、JavaScript 和配置文件等,這些其實(shí)也是最普通的文件,只要在瀏覽器里面可以訪問(wèn)到,就可以將其抓取下來(lái)。
上述內(nèi)容其實(shí)都對(duì)應(yīng)各自的 URL,是基于 HTTP 或 HTTPS 協(xié)議的,只要是這種數(shù)據(jù),爬蟲(chóng)都可以抓取。
7.JavaScript 渲染頁(yè)面
有時(shí)候,我們?cè)谟?urllib 或 requests 抓取網(wǎng)頁(yè)時(shí),得到的源代碼實(shí)際和瀏覽器中看到的不一樣。
這是一個(gè)非常常見(jiàn)的問(wèn)題。現(xiàn)在網(wǎng)頁(yè)越來(lái)越多地采用 Ajax、前端模塊化工具來(lái)構(gòu)建,整個(gè)網(wǎng)頁(yè)可能都是由 JavaScript 渲染出來(lái)的,也就是說(shuō)原始的 HTML 代碼就是一個(gè)空殼,例如:
<!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 節(jié)點(diǎn)里面只有一個(gè) id 為 container 的節(jié)點(diǎn),但是需要注意在 body 節(jié)點(diǎn)后引入了 app.js,它便負(fù)責(zé)整個(gè)網(wǎng)站的渲染。
在瀏覽器中打開(kāi)這個(gè)頁(yè)面時(shí),首先會(huì)加載這個(gè) HTML 內(nèi)容,接著瀏覽器會(huì)發(fā)現(xiàn)其中引入了一個(gè) app.js 文件,然后便會(huì)接著去請(qǐng)求這個(gè)文件,獲取到該文件后,便會(huì)執(zhí)行其中的 JavaScript 代碼,而 JavaScript 則會(huì)改變 HTML 中的節(jié)點(diǎn),向其添加內(nèi)容,最后得到完整的頁(yè)面。
但是在用 urllib 或 requests 等庫(kù)請(qǐng)求當(dāng)前頁(yè)面時(shí),我們得到的只是這個(gè) HTML 代碼,它不會(huì)幫助我們?nèi)ダ^續(xù)加載這個(gè) JavaScript 文件,這樣也就看不到瀏覽器中的內(nèi)容了。
這也解釋了為什么有時(shí)我們得到的源代碼和瀏覽器中看到的不一樣。
因此,使用基本 HTTP 請(qǐng)求庫(kù)得到的源代碼可能跟瀏覽器中的頁(yè)面源代碼不太一樣。對(duì)于這樣的情況,我們可以分析其后臺(tái) Ajax 接口,也可使用 Selenium、Splash 這樣的庫(kù)來(lái)實(shí)現(xiàn)模擬 JavaScript 渲染。
后面,我們會(huì)詳細(xì)介紹如何采集 JavaScript 渲染的網(wǎng)頁(yè)。本節(jié)介紹了爬蟲(chóng)的一些基本原理,這可以幫助我們?cè)诤竺婢帉?xiě)爬蟲(chóng)時(shí)更加得心應(yīng)手。
總結(jié)
以上是生活随笔為你收集整理的第03讲. 原理探究,了解爬虫的基本原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 第04讲: 基础探究,Session 与
- 下一篇: 第01讲:必知必会,掌握 HTTP 基本