一種基于多線程的網(wǎng)絡(luò)爬蟲(chóng)系統(tǒng)及其網(wǎng)頁(yè)爬取方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種基于多線程的網(wǎng)絡(luò)爬蟲(chóng)系統(tǒng),具體地涉及一種網(wǎng)頁(yè)爬取速度快、效率高的基于多線程的網(wǎng)絡(luò)爬蟲(chóng)系統(tǒng)及其網(wǎng)頁(yè)爬取方法。
【背景技術(shù)】
[0002]網(wǎng)絡(luò)爬蟲(chóng)就像是互聯(lián)網(wǎng)這張網(wǎng)上爬來(lái)爬去的蜘蛛。通過(guò)網(wǎng)頁(yè)的鏈接地址,網(wǎng)絡(luò)爬蟲(chóng)通過(guò)從網(wǎng)站首頁(yè)讀取內(nèi)容、尋找到進(jìn)入下一個(gè)網(wǎng)頁(yè)的其他鏈接。通過(guò)這樣的循環(huán)反復(fù),網(wǎng)絡(luò)爬蟲(chóng)抓取完這個(gè)網(wǎng)站的所有需要的網(wǎng)頁(yè)。
[0003]爬蟲(chóng)程序能夠自動(dòng)地獲取網(wǎng)頁(yè)。在搜索引擎中它有負(fù)責(zé)因特網(wǎng)中網(wǎng)頁(yè)下載的主要的功能,在引擎中起到關(guān)鍵的作用。從爬蟲(chóng)程序來(lái)看,對(duì)搜索結(jié)構(gòu)都會(huì)產(chǎn)生直接影響的是它所采用的實(shí)現(xiàn)策略以及運(yùn)行效率。每個(gè)搜索引擎有著不同的需求,從而要選擇進(jìn)行最佳爬行策略。這樣才能將網(wǎng)絡(luò)信息搜索的完美完成。因此,搜索爬蟲(chóng)程序體現(xiàn)了它的優(yōu)致和效率,才能將獲取的信息展現(xiàn)的更準(zhǔn)確更及時(shí)。
[0004]每個(gè)爬蟲(chóng)都有不同的應(yīng)用場(chǎng)景,因此有不同種類的爬蟲(chóng)擁有不同的功能,可以將爬蟲(chóng)分為3種類型:
a)批量型爬蟲(chóng):如果針對(duì)的網(wǎng)頁(yè)是已知的并且范圍是確定的,那么可以使用批量型爬蟲(chóng),當(dāng)爬蟲(chóng)完成了爬取所要求的網(wǎng)頁(yè)的時(shí)候,既可以停止抓取了。具體目標(biāo)可能有所不同,也可能是只要達(dá)到特定的網(wǎng)頁(yè)量就可以了,也可能是只要在特定的時(shí)間之內(nèi)完成抓取就可以了等等。
[0005]b)增量型爬蟲(chóng):這一類網(wǎng)絡(luò)爬蟲(chóng)與上面介紹的爬蟲(chóng)的不同點(diǎn)在于,它會(huì)一直去爬取網(wǎng)頁(yè)。如果抓取到的網(wǎng)頁(yè)發(fā)生變化,這個(gè)爬蟲(chóng)也會(huì)立刻進(jìn)行爬取,因?yàn)樵谡麄€(gè)網(wǎng)絡(luò)中的網(wǎng)頁(yè)在每時(shí)每刻都在發(fā)生變化,突然發(fā)生添加網(wǎng)頁(yè)、網(wǎng)頁(yè)被刪掉或者網(wǎng)頁(yè)內(nèi)容被修改,這些操作都是用來(lái)滿足用戶體驗(yàn)的,但是對(duì)于增量型爬蟲(chóng)需要及時(shí)更新它所爬取到的東西,所以在處于這個(gè)過(guò)程當(dāng)中,不需要重新去抓取新的網(wǎng)頁(yè),而是去更新被爬取的網(wǎng)頁(yè)。這種爬蟲(chóng)適用于通用的商業(yè)搜索引擎。
[0006]c)垂直型爬蟲(chóng):這類網(wǎng)絡(luò)爬蟲(chóng)是依照網(wǎng)頁(yè)自身的內(nèi)容來(lái)爬取的,它一般爬取一些圍繞某個(gè)主題的網(wǎng)頁(yè)的內(nèi)容進(jìn)行爬取或者圍繞某個(gè)所需要的行業(yè)的網(wǎng)頁(yè)來(lái)爬取,它只要去爬取僅僅某一個(gè)行業(yè)的相關(guān)網(wǎng)頁(yè),就不用了解其他行業(yè)的任何信息。這類爬蟲(chóng)需要關(guān)注的焦點(diǎn)在于:如何因?yàn)橄到y(tǒng)資源的有限,我們不能把所有的資源都利用到爬取所有的網(wǎng)頁(yè),從里面再去尋找我們所需要的資源這樣就大大減少了資源的利用率啦,所以我們需要爬蟲(chóng)能夠做到盡快盡可能去尋找到與這個(gè)主題最匹配的網(wǎng)頁(yè),最好不要去抓取那些完全沒(méi)必要的網(wǎng)頁(yè),從而便可以節(jié)省資源。所以這樣的爬蟲(chóng)就會(huì)局限在垂直搜索網(wǎng)站或者垂直行業(yè)網(wǎng)站。
[0007]網(wǎng)絡(luò)爬蟲(chóng)的實(shí)現(xiàn)方法是由應(yīng)用的不同屬性來(lái)設(shè)定的,但是它們都有共同的特性,應(yīng)該具備四種不同的特性。
[0008]a)高性能,這里的性能是指爬蟲(chóng)在某個(gè)特定時(shí)間內(nèi)爬取互聯(lián)網(wǎng)上的網(wǎng)頁(yè)數(shù)量,一般的評(píng)價(jià)方法是將每一秒網(wǎng)絡(luò)爬蟲(chóng)能夠下載的網(wǎng)頁(yè)數(shù)越多,那么這個(gè)網(wǎng)絡(luò)爬蟲(chóng)的性能就越高。因?yàn)閁RL的數(shù)量非常大,所以不一樣的實(shí)現(xiàn)方法就會(huì)使得爬蟲(chóng)的性能會(huì)使得性能差別很大,所以要選擇好的數(shù)據(jù)結(jié)構(gòu),這樣才會(huì)產(chǎn)生高性能。
[0009]b)可擴(kuò)展性,爬蟲(chóng)系統(tǒng)的可擴(kuò)展性是指在網(wǎng)頁(yè)數(shù)量龐大的情況下,還需要能縮短網(wǎng)絡(luò)爬蟲(chóng)的抓取的周期,就是要能夠很容易通過(guò)抓取服務(wù)器和爬蟲(chóng)的數(shù)量來(lái)達(dá)到這個(gè)性會(huì)K。
[0010]C)健壯性,其實(shí)這個(gè)在所有的系統(tǒng)當(dāng)中都是所要求的,就是用來(lái)面度很多種非正常的情況,例如爬蟲(chóng)爬得太深,會(huì)導(dǎo)致棧溢出,所以要求爬蟲(chóng)能夠?qū)Ω鞣N各樣的異常情況能夠正確處理就顯得至關(guān)重要了,這種健壯性使得爬蟲(chóng)程序能夠做到在出現(xiàn)故障的時(shí)候,重新啟動(dòng)爬蟲(chóng)之后,使得之前爬取的網(wǎng)頁(yè)內(nèi)容和結(jié)構(gòu)還能出現(xiàn),而不是重新再來(lái)。
[0011]d)友好性,其中有兩個(gè)層次的意義,一是指維護(hù)網(wǎng)站用戶的信息安全,二是減少?zèng)]有用的大量爬蟲(chóng)對(duì)網(wǎng)站的爬取。很多東西對(duì)于網(wǎng)站所有人來(lái)說(shuō)是不希望被搜索到的,因此要有對(duì)應(yīng)的算法,來(lái)選擇哪些東西是不允許被抓取的。
[0012]但是,現(xiàn)有的基于多線程的網(wǎng)絡(luò)爬蟲(chóng)系統(tǒng),普遍存在爬取速度慢,效率低下的問(wèn)題,而且程序非常復(fù)雜,不易維護(hù)。
【發(fā)明內(nèi)容】
[0013]針對(duì)上述技術(shù)問(wèn)題,本發(fā)明目的是:提供一種基于多線程的網(wǎng)絡(luò)爬蟲(chóng)系統(tǒng)及其網(wǎng)頁(yè)爬取方法,利用信號(hào)與插槽機(jī)制,先輸入與正則表達(dá)式匹配的網(wǎng)址,產(chǎn)生了這個(gè)發(fā)送獲取網(wǎng)頁(yè)的請(qǐng)求的信號(hào),然后根據(jù)這個(gè)信號(hào)觸發(fā)了槽函數(shù),獲取所匹配的東西,最后得到包含關(guān)鍵字的具體信息;爬去速度快,效率高。
[0014]本發(fā)明的技術(shù)方案是:
一種基于多線程的基于多線程的網(wǎng)絡(luò)爬蟲(chóng)系統(tǒng),其特征在于,包括URL處理模塊、網(wǎng)頁(yè)爬取模塊、網(wǎng)頁(yè)分析模塊和網(wǎng)頁(yè)存儲(chǔ)模塊;
所述URL處理模塊,通過(guò)URL類處理獲得每個(gè)URL的主機(jī)名,端口號(hào),文件名;
所述網(wǎng)頁(yè)爬取模塊,對(duì)網(wǎng)頁(yè)內(nèi)容進(jìn)行分塊抓取,并將抓取的網(wǎng)頁(yè)保存至?xí)捍婺K;
所述網(wǎng)頁(yè)分析模塊,提取URL,對(duì)URL進(jìn)行重定向,對(duì)URL進(jìn)行判重處理,刪除重復(fù)的URL;所述網(wǎng)頁(yè)存儲(chǔ)模塊,在存儲(chǔ)文件時(shí)判斷是否存在該文件,如果不存在,則直接爬取該文件;如果存在并且此次爬取網(wǎng)頁(yè)所獲得的內(nèi)容比上一次爬取的多,則覆蓋原來(lái)的文件;否則,丟棄該文件。
[0015]優(yōu)選的,所述URL處理模塊處理包括如下步驟:
a)URL的文件成員在最后以‘\0’結(jié)尾;若該文件成員沒(méi)有路徑,將路徑變成
b)若在URL的文件成員中包含特殊字符,將該特殊字符之前的所以字符作為文件,將該特殊字符之后的所有字符刪除;
c)如果在URL中沒(méi)有表示端口號(hào),則將端口成員的值設(shè)置為80;
d)如果URL沒(méi)有主機(jī)名的屬性,則將主機(jī)名成員的值默認(rèn)為初始URL的主機(jī)名。
[0016]優(yōu)選的,使用信號(hào)與槽在對(duì)象間建立通信,用于發(fā)送請(qǐng)求和接收回復(fù)。
[0017]優(yōu)選的,所述網(wǎng)頁(yè)分析模塊在獲取到URL后利用正則表達(dá)式對(duì)URL進(jìn)行驗(yàn)證判斷,包括以下步驟:
(I)首先根據(jù)文本的輸入框輸入的網(wǎng)址進(jìn)行驗(yàn)證判斷,如果網(wǎng)址為空或者長(zhǎng)度為O,則輸出錯(cuò)誤提示信息,利用QMessageBox輸出提示信息;
(2)利用正則表達(dá)式驗(yàn)證是否是以http為協(xié)議的網(wǎng)址,如果不匹配,輸出錯(cuò)誤提示信息;若匹配,則請(qǐng)求獲取網(wǎng)頁(yè)內(nèi)容;所述正則表達(dá)式為按照一個(gè)已知的字符串模式去匹配獲取的字符串。
[0018]優(yōu)選的,還包括關(guān)鍵字匹配查找模塊,用于對(duì)輸入的文本進(jìn)行驗(yàn)證,對(duì)符合要求的信息存儲(chǔ)于列表中,并且進(jìn)行一一對(duì)應(yīng),按照序號(hào)遞增;根據(jù)列表中每個(gè)信息項(xiàng)對(duì)文本中作是否包含的判斷,若包含則將文本存放進(jìn)界面的表格布局的布局項(xiàng)中,并且將序號(hào)遞增。
[0019]優(yōu)選的,所述網(wǎng)頁(yè)分析模塊對(duì)所讀取的html信息進(jìn)行解析,利用正則表達(dá)式處理,獲取所有的處理信息數(shù)目,并且刪除空白和特殊字符;將網(wǎng)頁(yè)的信息以換行符為依據(jù)分隔形成列表項(xiàng),將該列表項(xiàng)的長(zhǎng)度作為序號(hào);然后一一插入到表單當(dāng)中。
[0020]本發(fā)明還公開(kāi)了一種基于多線程的網(wǎng)絡(luò)爬蟲(chóng)系統(tǒng)的網(wǎng)頁(yè)爬取方法,包括以下步驟:
SO 1:使用多線程搜索URL;
S02:對(duì)網(wǎng)頁(yè)內(nèi)容進(jìn)行分塊抓取,并將抓取的網(wǎng)頁(yè)保存至?xí)捍婺K;
S03:對(duì)所讀取的html信息進(jìn)行解析,利用正則表達(dá)式處理,獲取所有的處理信息數(shù)目,并且刪除空白和特殊字符;將網(wǎng)頁(yè)的信息以換行符為依據(jù)分隔形成列表項(xiàng),將該列表項(xiàng)的長(zhǎng)度作為序號(hào);然后一一插入到表單當(dāng)中;
S04:利用寬度優(yōu)先搜索來(lái)進(jìn)行遍歷訪問(wèn),以網(wǎng)頁(yè)中某個(gè)超鏈接為初始點(diǎn),不斷訪問(wèn)從這個(gè)鏈接以后的超鏈接,該層超鏈接被訪問(wèn)完后,再依訪問(wèn)下一層的超鏈接;
S05:在存儲(chǔ)文件時(shí)判斷是否存在該文件,如果不存在,則直接爬取該文件;如果存在并且此次爬取網(wǎng)頁(yè)所獲得的內(nèi)容比上一次爬取的多,則覆蓋原來(lái)的文件;否則,丟棄該文件。[0021 ]與現(xiàn)有技術(shù)相比,本發(fā)明的優(yōu)點(diǎn)是:
1.本發(fā)明根據(jù)輸入的網(wǎng)址,得到這個(gè)網(wǎng)址中所有URL格式信息,其中用到正則表達(dá)式,將URL的信息分離,得到需要的信息,然后再根據(jù)關(guān)鍵字信息,可以獲取到所有關(guān)于關(guān)鍵字的所有分離字段信息。利用適合這個(gè)程序的高效算法,寬度優(yōu)先搜索遍歷,保存了待訪問(wèn)的網(wǎng)頁(yè)鏈接列表,以及已經(jīng)訪問(wèn)過(guò)的網(wǎng)頁(yè)鏈接列表,放入文件當(dāng)中。與此同時(shí)記錄了訪問(wèn)每個(gè)網(wǎng)頁(yè)鏈接所需要的時(shí)間以及編號(hào),使得在有限的時(shí)間內(nèi)訪問(wèn)到了最多的網(wǎng)頁(yè)地址,并且在其中運(yùn)用協(xié)程提高了并發(fā)的效率。
【附圖說(shuō)明】
[0022]下面結(jié)合附圖及實(shí)施例對(duì)本發(fā)明作進(jìn)一步描述:
圖1為本發(fā)明基于多線程的網(wǎng)絡(luò)爬蟲(chóng)系統(tǒng)的結(jié)構(gòu)示意圖;
圖2為本發(fā)明基于多線程的網(wǎng)絡(luò)爬蟲(chóng)系統(tǒng)的多線程爬去網(wǎng)頁(yè)的示意圖;
圖3為本發(fā)明基于多線程的網(wǎng)絡(luò)爬蟲(chóng)系統(tǒng)的運(yùn)行流程圖。
【具體實(shí)施方式】
[0023]為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚明了,下面結(jié)合【具體實(shí)施方式】并參照附圖,對(duì)本發(fā)明進(jìn)一步詳細(xì)說(shuō)明。應(yīng)該理解,這些描述只是示例性的,而并非要限制