本文轉載:靜覓 ? [Python3網絡爬蟲開發(fā)實戰(zhàn)] 2.3-爬蟲的基本原理
我們可以把互聯(lián)網比作一張大網妖枚,而爬蟲(即網絡爬蟲)便是在網上爬行的蜘蛛。把網的節(jié)點比作一個個網頁凹联,爬蟲爬到這就相當于訪問了該頁面裳瘪,獲取了其信息洞渤。可以把節(jié)點間的連線比作網頁與網頁之間的鏈接關系西轩,這樣蜘蛛通過一個節(jié)點后,可以順著節(jié)點連線繼續(xù)爬行到達下一個節(jié)點膀跌,即通過一個網頁繼續(xù)獲取后續(xù)的網頁遭商,這樣整個網的節(jié)點便可以被蜘蛛全部爬行到,網站的數(shù)據(jù)就可以被抓取下來了捅伤。
- 爬蟲概述
簡單來說劫流,爬蟲就是獲取網頁并提取和保存信息的自動化程序,下面概要介紹一下丛忆。
(1) 獲取網頁
爬蟲首先要做的工作就是獲取網頁祠汇,這里就是獲取網頁的源代碼。源代碼里包含了網頁的部分有用信息熄诡,所以只要把源代碼獲取下來可很,就可以從中提取想要的信息了。
前面講了請求和響應的概念凰浮,向網站的服務器發(fā)送一個請求我抠,返回的響應體便是網頁源代碼苇本。所以,最關鍵的部分就是構造一個請求并發(fā)送給服務器菜拓,然后接收到響應并將其解析出來瓣窄,那么這個流程怎樣實現(xiàn)呢?總不能手工去截取網頁源碼吧纳鼎?
不用擔心俺夕,Python提供了許多庫來幫助我們實現(xiàn)這個操作,如urllib贱鄙、requests等劝贸。我們可以用這些庫來幫助我們實現(xiàn)HTTP請求操作,請求和響應都可以用類庫提供的數(shù)據(jù)結構來表示逗宁,得到響應之后只需要解析數(shù)據(jù)結構中的Body部分即可映九,即得到網頁的源代碼,這樣我們可以用程序來實現(xiàn)獲取網頁的過程了疙剑。
(2) 提取信息
獲取網頁源代碼后氯迂,接下來就是分析網頁源代碼,從中提取我們想要的數(shù)據(jù)言缤。首先嚼蚀,最通用的方法便是采用正則表達式提取,這是一個萬能的方法管挟,但是在構造正則表達式時比較復雜且容易出錯轿曙。
另外,由于網頁的結構有一定的規(guī)則僻孝,所以還有一些根據(jù)網頁節(jié)點屬性导帝、CSS選擇器或XPath來提取網頁信息的庫,如Beautiful Soup穿铆、pyquery您单、lxml等。使用這些庫荞雏,我們可以高效快速地從中提取網頁信息虐秦,如節(jié)點的屬性、文本值等凤优。
提取信息是爬蟲非常重要的部分悦陋,它可以使雜亂的數(shù)據(jù)變得條理清晰,以便我們后續(xù)處理和分析數(shù)據(jù)筑辨。
(3) 保存數(shù)據(jù)
提取信息后俺驶,我們一般會將提取到的數(shù)據(jù)保存到某處以便后續(xù)使用。這里保存形式有多種多樣棍辕,如可以簡單保存為TXT文本或JSON文本暮现,也可以保存到數(shù)據(jù)庫还绘,如MySQL和MongoDB等,也可保存至遠程服務器栖袋,如借助SFTP進行操作等蚕甥。
(4) 自動化程序
說到自動化程序,意思是說爬蟲可以代替人來完成這些操作栋荸。首先,我們手工當然可以提取這些信息凭舶,但是當量特別大或者想快速獲取大量數(shù)據(jù)的話晌块,肯定還是要借助程序。爬蟲就是代替我們來完成這份爬取工作的自動化程序帅霜,它可以在抓取過程中進行各種異常處理匆背、錯誤重試等操作,確保爬取持續(xù)高效地運行身冀。
- 能抓怎樣的數(shù)據(jù)
在網頁中我們能看到各種各樣的信息钝尸,最常見的便是常規(guī)網頁,它們對應著HTML代碼搂根,而最常抓取的便是HTML源代碼珍促。
另外,可能有些網頁返回的不是HTML代碼剩愧,而是一個JSON字符串(其中API接口大多采用這樣的形式)猪叙,這種格式的數(shù)據(jù)方便傳輸和解析,它們同樣可以抓取仁卷,而且數(shù)據(jù)提取更加方便穴翩。
此外,我們還可以看到各種二進制數(shù)據(jù)锦积,如圖片芒帕、視頻和音頻等。利用爬蟲丰介,我們可以將這些二進制數(shù)據(jù)抓取下來背蟆,然后保存成對應的文件名。
另外基矮,還可以看到各種擴展名的文件淆储,如CSS、JavaScript和配置文件等家浇,這些其實也是最普通的文件本砰,只要在瀏覽器里面可以訪問到,就可以將其抓取下來钢悲。
上述內容其實都對應各自的URL点额,是基于HTTP或HTTPS協(xié)議的舔株,只要是這種數(shù)據(jù),爬蟲都可以抓取还棱。
- JavaScript渲染頁面
有時候载慈,我們在用urllib或requests抓取網頁時,得到的源代碼實際和瀏覽器中看到的不一樣珍手。
這是一個非常常見的問題“煺。現(xiàn)在網頁越來越多地采用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節(jié)點里面只有一個id為container的節(jié)點稚补,但是需要注意在body節(jié)點后引入了app.js童叠,它便負責整個網站的渲染。
在瀏覽器中打開這個頁面時课幕,首先會加載這個HTML內容厦坛,接著瀏覽器會發(fā)現(xiàn)其中引入了一個app.js文件,然后便會接著去請求這個文件乍惊,獲取到該文件后杜秸,便會執(zhí)行其中的JavaScript代碼,而JavaScript則會改變HTML中的節(jié)點污桦,向其添加內容亩歹,最后得到完整的頁面。
但是在用urllib或requests等庫請求當前頁面時凡橱,我們得到的只是這個HTML代碼小作,它不會幫助我們去繼續(xù)加載這個JavaScript文件,這樣也就看不到瀏覽器中的內容了稼钩。
這也解釋了為什么有時我們得到的源代碼和瀏覽器中看到的不一樣顾稀。
因此,使用基本HTTP請求庫得到的源代碼可能跟瀏覽器中的頁面源代碼不太一樣坝撑。對于這樣的情況静秆,我們可以分析其后臺Ajax接口,也可使用Selenium巡李、Splash這樣的庫來實現(xiàn)模擬JavaScript渲染抚笔。
后面,我們會詳細介紹如何采集JavaScript渲染的網頁侨拦。
本節(jié)介紹了爬蟲的一些基本原理殊橙,這可以幫助我們在后面編寫爬蟲時更加得心應手。