什么是網(wǎng)絡(luò)爬蟲?網(wǎng)絡(luò)爬蟲(Web crawler),是一種按照一定的規(guī)則,自動地抓取萬維網(wǎng)信息的程序或者腳本,它們被廣泛用于互聯(lián)網(wǎng)搜索引擎或其他類似網(wǎng)站,可以自動采集所有其能夠訪問到的頁面內(nèi)容,以獲取或更新這些網(wǎng)站的內(nèi)容和檢索方式。
內(nèi)容一般分為兩部分,非結(jié)構(gòu)化的文本,或結(jié)構(gòu)化的文本。
1. 關(guān)于非結(jié)構(gòu)化的數(shù)據(jù)
1.1 HTML文本(包含JavaScript代碼)
HTML文本基本上是傳統(tǒng)爬蟲過程中最常見的,也就是大多數(shù)時候會遇到的情況,例如抓取一個網(wǎng)頁,得到的是HTML,然后需要解析一些常見的元素,提取一些關(guān)鍵的信息。HTML其實理應(yīng)屬于結(jié)構(gòu)化的文本組織,但是又因為一般我們需要的關(guān)鍵信息并非直接可以得到,需要進行對HTML的解析查找,甚至一些字符串操作才能得到,所以還是歸類于非結(jié)構(gòu)化的數(shù)據(jù)處理中。
常見解析方式如下:
·CSS選擇器
現(xiàn)在的網(wǎng)頁樣式比較多,所以一般的網(wǎng)頁都會有一些CSS的定位,例如class,id等等,或者我們根據(jù)常見的節(jié)點路徑進行定位,例如騰訊首頁的財經(jīng)部分。
·XPATH
XPATH是一種頁面元素的路徑選擇方法,利用Chrome可以快速得到,如:
1.2 一段文本
一篇文章,或者一句話,我們的初衷是提取有效信息,所以如果是滯后處理,可以直接存儲,如果是需要實時提取有用信息,常見的處理方式如下:
分詞
根據(jù)抓取的網(wǎng)站類型,使用不同詞庫,進行基本的分詞,然后變成詞頻統(tǒng)計,類似于向量的表示,詞為方向,詞頻為長度。
NLP
自然語言處理,進行語義分析,用結(jié)果表示,例如正負面等。
2. 關(guān)于結(jié)構(gòu)化的數(shù)據(jù)
結(jié)構(gòu)化的數(shù)據(jù)是最好處理,一般都是類似JSON格式的字符串,直接解析JSON數(shù)據(jù)就可以了,提取JSON的關(guān)鍵字段即可。
3、爬蟲爬取網(wǎng)頁的基本步驟
1) 人工給定一個URL作為入口,從這里開始爬取。
萬維網(wǎng)的可視圖呈蝴蝶型,網(wǎng)絡(luò)爬蟲一般從蝴蝶型左邊結(jié)構(gòu)出發(fā)。這里有一些門戶網(wǎng)站的主頁,而門戶網(wǎng)站中包含大量有價值的鏈接。
2) 用運行隊列和完成隊列來保存不同狀態(tài)的鏈接。
對于大型數(shù)據(jù)量而言,內(nèi)存中的隊列是不夠的,通常采用數(shù)據(jù)庫模擬隊列。用這種方法既可以進行海量的數(shù)據(jù)抓取,還可以擁有斷點續(xù)抓功能。
3) 線程從運行隊列讀取隊首URL,如果存在,則繼續(xù)執(zhí)行,反之則停止爬取。
4) 每處理完一個URL,將其放入完成隊列,防止重復(fù)訪問。
5) 每次抓取網(wǎng)頁之后分析其中的URL(URL是字符串形式,功能類似指針),將經(jīng)過過濾的合法鏈接寫入運行隊列,等待提取。
6) 重復(fù)步驟 3)、4)、5)。
4、主過程組成
在網(wǎng)絡(luò)爬蟲的系統(tǒng)框架中,主過程由控制器,解析器,資源庫三部分組成。控制器的主要工作是負責給多線程中的各個爬蟲線程分配工作任務(wù)。解析器的主要工作是下載網(wǎng)頁,進行頁面的處理,主要是將一些JS腳本標簽、CSS代碼內(nèi)容、空格字符、HTML標簽等內(nèi)容處理掉,爬蟲的基本工作是由解析器完成。資源庫是用來存放下載到的網(wǎng)頁資源,一般都采用大型的數(shù)據(jù)庫存儲,如Oracle數(shù)據(jù)庫,并對其建立索引。
【控制器】
控制器是網(wǎng)絡(luò)爬蟲的中央控制器,它主要是負責根據(jù)系統(tǒng)傳過來的URL鏈接,分配一線程,然后啟動線程調(diào)用爬蟲爬取網(wǎng)頁的過程。
【解析器】
解析器是負責網(wǎng)絡(luò)爬蟲的主要部分,其負責的工作主要有:下載網(wǎng)頁的功能,對網(wǎng)頁的文本進行處理,如過濾功能,抽取特殊HTML標簽的功能,分析數(shù)據(jù)功能。
【資源庫】
主要是用來存儲網(wǎng)頁中下載下來的數(shù)據(jù)記錄的容器,并提供生成索引的目標源。中大型的數(shù)據(jù)庫產(chǎn)品有:Oracle、Sql Server等。
5、補充:
開源爬蟲小知識
﹡DataparkSearch是一個在GNU GPL許可下發(fā)布的爬蟲搜索引擎。
﹡GNU Wget是一個在GPL許可下,使用C語言編寫的命令行式的爬蟲。它主要用于網(wǎng)絡(luò)服務(wù)器和FTP服務(wù)器的﹡鏡像。
﹡Heritrix是一個互聯(lián)網(wǎng)檔案館級的爬蟲,設(shè)計的目標為對大型網(wǎng)絡(luò)的大部分內(nèi)容的定期存檔快照,是使用java編寫的。
﹡HTTrack用網(wǎng)絡(luò)爬蟲創(chuàng)建網(wǎng)絡(luò)站點鏡像,以便離線觀看。它使用C語言編寫,在GPL許可下發(fā)行。
﹡ICDL Crawler是一個用C++編寫,跨平臺的網(wǎng)絡(luò)爬蟲。它僅僅使用空閑的CPU資源,在ICDL標準上抓取整個站點。
﹡JSpider是一個在GPL許可下發(fā)行的,高度可配置的,可定制的網(wǎng)絡(luò)爬蟲引擎。
﹡LLarbin由Sebastien Ailleret開發(fā);
﹡Methabot是一個使用C語言編寫的高速優(yōu)化的,使用命令行方式運行的,在2-clause BSD許可下發(fā)布的網(wǎng)頁檢索器。它的主要的特性是高可配置性,模塊化;它檢索的目標可以是本地文件系統(tǒng),HTTP或者FTP。
﹡Nutch是一個使用java編寫,在Apache許可下發(fā)行的爬蟲。它可以用來連接Lucene的全文檢索套件;
﹡Pavuk是一個在GPL許可下發(fā)行的,使用命令行的WEB站點鏡像工具,可以選擇使用X11的圖形界面。與wget和httprack相比,他有一系列先進的特性,如以正則表達式為基礎(chǔ)的文件過濾規(guī)則和文件創(chuàng)建規(guī)則。
﹡WebSPHINX(Miller and Bharat, 1998)是一個由java類庫構(gòu)成的,基于文本的搜索引擎。它使用多線程進行網(wǎng)頁檢索,html解析,擁有一個圖形用戶界面用來設(shè)置開始的種子URL和抽取下載的數(shù)據(jù);
﹡WIRE-網(wǎng)絡(luò)信息檢索環(huán)境(Baeza-Yates 和 Castillo, 2002)是一個使用C++編寫,在GPL許可下發(fā)行的爬蟲,內(nèi)置了幾種頁面下載安排的策略,還有一個生成報告和統(tǒng)計資料的模塊,所以,它主要用于網(wǎng)絡(luò)特征的描述;
﹡Ruya是一個在廣度優(yōu)先方面表現(xiàn)優(yōu)秀,基于等級抓取的開放源代碼的網(wǎng)絡(luò)爬蟲。在英語和日語頁面的抓取表現(xiàn)良好,它在GPL許可下發(fā)行,并且完全使用Python編寫。按照robots.txt有一個延時的單網(wǎng)域延時爬蟲。
﹡Universal Information Crawler快速發(fā)展的網(wǎng)絡(luò)爬蟲,用于檢索存儲和分析數(shù)據(jù);
﹡Agent Kernel,當一個爬蟲抓取時,用來進行安排,并發(fā)和存儲的java框架。
未來,最貴的東西將是數(shù)據(jù)。所以,掌握爬蟲技術(shù)非常重要。