在這篇文章中,我們將分析一個網(wǎng)絡(luò)爬蟲。
網(wǎng)絡(luò)爬蟲是一個掃描網(wǎng)絡(luò)內(nèi)容并記錄其有用信息的工具。它能打開一大堆網(wǎng)頁,分析每個頁面的內(nèi)容以便尋找所有感興趣的數(shù)據(jù),并將這些數(shù)據(jù)存儲在一個數(shù)據(jù)庫中,然后對其他網(wǎng)頁進(jìn)行同樣的操作。
如果爬蟲正在分析的網(wǎng)頁中有一些鏈接,那么爬蟲將會根據(jù)這些鏈接分析更多的頁面。
搜索引擎就是基于這樣的原理實(shí)現(xiàn)的。
這篇文章中,我特別選了一個穩(wěn)定的、”年輕”的開源項(xiàng)目pyspider,它是由 binux 編碼實(shí)現(xiàn)的。
注:據(jù)認(rèn)為pyspider持續(xù)監(jiān)控網(wǎng)絡(luò),它假定網(wǎng)頁在一段時間后會發(fā)生變化,因此一段時間后它將會重新訪問相同的網(wǎng)頁。
概述
爬蟲pyspider主要由四個組件組成。包括調(diào)度程序(scheduler),抓取程序(fetcher),內(nèi)容處理程序(processor)以及一個監(jiān)控組件。
調(diào)度程序接受任務(wù)并決定該做什么。這里有幾種可能性,它可以丟棄一個任務(wù)(可能這個特定的網(wǎng)頁剛剛被抓取過了),或者給任務(wù)分配不同的優(yōu)先級。
當(dāng)各個任務(wù)的優(yōu)先級確定之后,它們被傳入抓取程序。它重新抓取網(wǎng)頁。這個過程很復(fù)雜,但邏輯上比較簡單。
當(dāng)網(wǎng)絡(luò)上的資源被抓取下來,內(nèi)容處理程序就負(fù)責(zé)抽取有用的信息。它運(yùn)行一個用戶編寫的Python腳本,這個腳本并不像沙盒一樣被隔離。它的職責(zé)還包括捕獲異常或日志,并適當(dāng)?shù)毓芾硭鼈儭?/p>
最后,爬蟲pyspider中有一個監(jiān)控組件。
爬蟲pyspider提供一個異常強(qiáng)大的網(wǎng)頁界面(web ui),它允許你編輯和調(diào)試你的腳本,管理整個抓取過程,監(jiān)控正在進(jìn)行的任務(wù),并最終輸出結(jié)果。
項(xiàng)目和任務(wù)
在pyspider中,我們有項(xiàng)目和任務(wù)的概念。
一個任務(wù)指的是一個需要從網(wǎng)站檢索并進(jìn)行分析的單獨(dú)頁面。
一個項(xiàng)目指的是一個更大的實(shí)體,它包括爬蟲涉及到的所有頁面,分析網(wǎng)頁所需要的python腳本,以及用于存儲數(shù)據(jù)的數(shù)據(jù)庫等等。
在pyspider中我們可以同時運(yùn)行多個項(xiàng)目。
代碼結(jié)構(gòu)分析
根目錄
在根目錄中可以找到的文件夾有:
data,空文件夾,它是存放由爬蟲所生成的數(shù)據(jù)的地方。 docs,包含該項(xiàng)目文檔,里邊有一些markdown代碼。 pyspider,包含項(xiàng)目實(shí)際的代碼。 test,包含相當(dāng)多的測試代碼。 這里我將重點(diǎn)介紹一些重要的文件: .travis.yml,一個很棒的、連續(xù)性測試的整合。你如何確定你的項(xiàng)目確實(shí)有效?畢竟僅在你自己的帶有固定版本的庫的機(jī)器上進(jìn)行測試是不夠的。 Dockerfile,同樣很棒的工具!如果我想在我的機(jī)器上嘗試一個項(xiàng)目,我只需要運(yùn)行Docker,我不需要手動安裝任何東西,這是一個使開發(fā)者參與到你的項(xiàng)目中的很好的方式。 LICENSE,對于任何開源項(xiàng)目都是必需的,(如果你自己有開源項(xiàng)目的話)不要忘記自己項(xiàng)目中的該文件。 requirements.txt,在Python世界中,該文件用于指明為了運(yùn)行該軟件,需要在你的系統(tǒng)中安裝什么Python包,在任何的Python項(xiàng)目中該文件都是必須的。 run.py,該軟件的主入口點(diǎn)。 setup.py,該文件是一個Python腳本,用于在你的系統(tǒng)中安裝pyspider項(xiàng)目。新聞熱點(diǎn)
疑難解答
圖片精選