高訪問情況下的爬蟲封禁方法
【專利摘要】本發(fā)明提供一種高訪問情況下的爬蟲封禁方法,用于在高訪問量情況下快速的判斷一個訪問者是否在訪問黑名單中并且實(shí)施封禁,并且有效地維護(hù)名單庫的正確性。本發(fā)明涉及以下步驟:提取請求的ip或者id信息;名單庫預(yù)先導(dǎo)入到內(nèi)存中,在高訪問量的情況下只有通過內(nèi)存查找才能滿足低響應(yīng)時間的要求,通過在內(nèi)存的名單庫中查找判斷id是否在黑名單中;對于是黑名單的拒絕訪問;考慮到名單庫會不斷變動,而且在訪問量太大的時候應(yīng)用會部署到不同服務(wù)器中,對于怎樣保證不同服務(wù)器中名單庫的一致性,增加了服務(wù)模塊定時進(jìn)行名單一致性維護(hù)。本發(fā)明結(jié)合了共享內(nèi)存使用名單庫和增加服務(wù)附件模塊的方法,減少了爬取判定的響應(yīng)時間。
【專利說明】
高訪問情況下的爬蟲封禁方法
技術(shù)領(lǐng)域
[0001]本發(fā)明涉及互聯(lián)網(wǎng)領(lǐng)域,具體涉及服務(wù)器端高并發(fā)壓力下實(shí)現(xiàn)對爬蟲封禁,并不影響用戶的使用體驗(yàn)的解決策略。
【背景技術(shù)】
[0002]隨著網(wǎng)絡(luò)技術(shù)的發(fā)展和網(wǎng)絡(luò)數(shù)據(jù)、網(wǎng)絡(luò)用戶的急速增加,網(wǎng)絡(luò)服務(wù)器所承擔(dān)的壓力也越來越大。隨著網(wǎng)絡(luò)信息的增加,用于獲取、收集信息的網(wǎng)絡(luò)爬蟲也隨著急劇增多。網(wǎng)絡(luò)爬蟲極大地提高了信息獲取的速度,這一方面給人們到來了極大的方便。包括現(xiàn)在的搜索引擎google、baidu為人們提供了功能強(qiáng)大的信息搜索,人們可以方便快速的獲取想要的信息。這些都是建立在網(wǎng)絡(luò)爬蟲對互聯(lián)網(wǎng)信息收集的基礎(chǔ)上,在這一方面網(wǎng)絡(luò)爬蟲發(fā)揮了極重要的作用。
[0003]但是爬蟲的大量增加也有一些不利的影響。存在一些設(shè)計不合理的爬蟲對網(wǎng)站的爬取強(qiáng)度特別大,對服務(wù)器造成了巨大的負(fù)擔(dān),會影響到正常用戶的使用體驗(yàn)。此外惡意爬蟲還會造成數(shù)據(jù)泄露,一些公司不希望具有競爭關(guān)系的對手公司爬取自己的數(shù)據(jù),如果數(shù)據(jù)被輕易的爬取公司是沒有競爭力的。基于以上的原因?qū)ε老x進(jìn)行適當(dāng)?shù)姆饨欠浅1匾摹?br>
【發(fā)明內(nèi)容】
[0004]本發(fā)明的目的在于克服現(xiàn)有技術(shù)中存在的不足,提供一種高訪問情況下的爬蟲封禁方法,實(shí)現(xiàn)有效的封禁爬蟲,降低封禁爬蟲時對系統(tǒng)響應(yīng)的影響。封禁爬蟲對于降低服務(wù)器壓力和保護(hù)數(shù)據(jù)具有極大的價值。但是爬蟲的封禁不應(yīng)該占用太多服務(wù)器時間,否則在降低服務(wù)器壓力方面就得不償失了。本發(fā)明通過在內(nèi)存中維護(hù)名單庫,并通過共享內(nèi)存實(shí)現(xiàn)在不同進(jìn)程之間共享,降低了判斷爬蟲的時間。同時添加服務(wù)模塊實(shí)現(xiàn)不同服務(wù)器中名單庫的一致性維護(hù),并使名單操作更靈活。本發(fā)明采用的技術(shù)方案是:
一種高訪問情況下的爬蟲封禁方法,包括:
在服務(wù)器上建立和維護(hù)名單庫,將所有要封禁的爬蟲加入到名單庫的黑名單中,對正規(guī)爬蟲和服務(wù)器內(nèi)部使用的爬蟲加入到名單庫的白名單中;
將名單庫中的名單存儲在內(nèi)存中并建立hash表索引;
將建立好hash索引的名單庫映射到同一服務(wù)器不同進(jìn)程的地址空間中;
當(dāng)一個請求到達(dá)服務(wù)器時,提取請求中的用戶id或者IP地址,一個進(jìn)程查詢內(nèi)存中名單庫中名單(包括黑名單和白名單),當(dāng)用戶id或IP地址在名單庫的黑名單中時,拒絕訪問或延遲返回數(shù)據(jù)或返回劣質(zhì)數(shù)據(jù)。
[0005]進(jìn)一步地,同一臺服務(wù)器中,不同進(jìn)程之間使用共享內(nèi)存來維護(hù)多個進(jìn)程之間名單庫的一致性;一個進(jìn)程在查詢名單時首先對名單庫上讀鎖,以防止該進(jìn)程在查詢名單時,其它進(jìn)程對名單庫進(jìn)行增加、刪除、修改操作。
[0006]進(jìn)一步地,為了維護(hù)多臺服務(wù)器中名單庫的一致性,單獨(dú)設(shè)立一個服務(wù)模塊,所有服務(wù)器對名單庫進(jìn)行更新操作時,操作不直接發(fā)送給服務(wù)器上的名單庫,而是發(fā)送到服務(wù)模塊,通過服務(wù)模塊轉(zhuǎn)發(fā)該操作到服務(wù)模塊中注冊的所有服務(wù)器中;
服務(wù)模塊還定時對所有注冊至服務(wù)模塊的服務(wù)器中的名單進(jìn)行定時的全量更新。
[0007]更進(jìn)一步地,
服務(wù)模塊包括名單請求處理邏輯模塊,名單庫本地數(shù)據(jù)庫備份;服務(wù)模塊具體進(jìn)行下述操作:
1)當(dāng)名單操作請求到達(dá)名單請求處理邏輯模塊時,名單請求處理邏輯模塊判斷請求類型;
2)如果是刪除名單條目的請求,首先到名單庫本地數(shù)據(jù)庫中查看該名單條目是否存在;如果存在則刪除名單庫本地數(shù)據(jù)庫中本條名單條目,同時根據(jù)名單請求處理邏輯模塊中記錄的遠(yuǎn)程服務(wù)器列表給全部遠(yuǎn)程服務(wù)器發(fā)送刪除該條名單條目的請求;如果不在名單庫本地數(shù)據(jù)庫中,不做任何操作;
3)如果是添加名單條目的請求,同樣首先到名單庫本地數(shù)據(jù)庫中查看該名單條目是否存在;如果不存在則在名單庫本地數(shù)據(jù)庫中添加該條名單條目,同時根據(jù)名單請求處理邏輯模塊中記錄的遠(yuǎn)程服務(wù)器列表給全部遠(yuǎn)程服務(wù)器發(fā)送添加該名單條目的請求;如果存在不做任何操作。
[0008]更進(jìn)一步地,
所述服務(wù)模塊還定時對所有注冊至服務(wù)模塊的服務(wù)器中的名單進(jìn)行定時的全量更新,具體包括:
定期地,
1)服務(wù)模塊讀取遠(yuǎn)程服務(wù)器中的全部名單庫到本地;
2)遍歷讀取到名單庫中所有的名單條目,對于每一個名單條目查看本地數(shù)據(jù)庫,如果不在本地數(shù)據(jù)庫中向遠(yuǎn)程服務(wù)器發(fā)送刪除該名單條目的請求;
3)遍歷本地數(shù)據(jù)庫的所有名單條目,對于每一個名單條目查看是否在遠(yuǎn)程服務(wù)器上名單庫中,如果不存在向遠(yuǎn)程服務(wù)器發(fā)送添加該名單條目的請求。
[0009]本發(fā)明的優(yōu)點(diǎn)在于:本發(fā)明通過在內(nèi)存中設(shè)置名單庫,并通過共享內(nèi)存實(shí)現(xiàn)進(jìn)程間名單庫共享,實(shí)現(xiàn)了名單的快速查詢。在封禁策略必不可少的情況下有效地實(shí)現(xiàn)了封禁并且占用服務(wù)器響應(yīng)時間極少。通過設(shè)置服務(wù)模塊將應(yīng)該是服務(wù)器中處理的邏輯分離出來,處理上更靈活并且有效的解決了多臺服務(wù)器部署中各臺服務(wù)器名單庫一致性的問題。
【附圖說明】
[0010]圖1為本發(fā)明的總體結(jié)構(gòu)框圖。
[0011]圖2為本發(fā)明遠(yuǎn)程服務(wù)器的執(zhí)行流程。
[0012]圖3為本發(fā)明服務(wù)模塊的結(jié)構(gòu)框圖。
[0013]圖4為本發(fā)明服務(wù)模塊的執(zhí)行流程圖。
【具體實(shí)施方式】
[0014]下面結(jié)合具體附圖和實(shí)施例對本發(fā)明作進(jìn)一步說明。
[0015]為了封禁爬蟲必須建立名單庫,將所有要封禁的爬蟲加入到名單庫的黑名單中,對某些正規(guī)爬蟲如百度、google或者公司內(nèi)部使用的爬蟲加入到名單庫的白名單中;
為了快速查詢請求的用戶id(賬號)或IP地址是否在名單中,采用了將名單庫中名單存儲在內(nèi)存中并建立hash(哈希)表索引。一般情況下將名單存儲到數(shù)據(jù)庫中,但是當(dāng)訪問量特別大的時候數(shù)據(jù)庫的查詢會嚴(yán)重拖累服務(wù)器的響應(yīng)時間。對于數(shù)據(jù)查詢最快的就是將數(shù)據(jù)存儲到內(nèi)存中。不過對于存儲到內(nèi)存中有一點(diǎn)需要解決的是同一服務(wù)器中不同進(jìn)程之間維護(hù)名單一致性的問題,本策略使用了在不同進(jìn)程之間共享內(nèi)存的方案,將建立好hash索引的名單庫映射到不同進(jìn)程中的地址空間中,解決了不同進(jìn)程之間名單庫共享并減少了數(shù)據(jù)拷貝的開銷。
[0016]當(dāng)并發(fā)訪問量高的時候,維持快速的響應(yīng)對于用戶體驗(yàn)尤為重要。爬蟲封禁策略必須盡量小的降低對響應(yīng)時間的影響,所以對爬蟲庫的檢索必須要快。本策略將名單庫常駐內(nèi)存,將名單庫用hash表的形式存儲到內(nèi)存中,實(shí)現(xiàn)快速查詢。
[0017]對于查詢結(jié)果在黑名單中的訪問可以直接拒絕訪問,也可以延遲本請求響應(yīng)時間或者返回劣質(zhì)的數(shù)據(jù)以延遲爬取者發(fā)現(xiàn)被封禁的時間。
[0018]對于不同服務(wù)器中名單庫一致性的維護(hù)問題,單獨(dú)建立一個服務(wù)模塊。所有名單庫的更新操作都發(fā)送到服務(wù)模塊,通過服務(wù)模塊轉(zhuǎn)發(fā)到服務(wù)模塊中注冊的不同服務(wù)器中。這樣處理的好處是對名單的處理更加靈活同時服務(wù)模塊分擔(dān)了服務(wù)器中進(jìn)程的壓力。理論上通過服務(wù)器模塊對不同服務(wù)器中的名單庫更新會使名單庫保持一致,但是考慮網(wǎng)絡(luò)傳輸?shù)纫蛩氐挠绊懖煌麊螏熘羞€是會存在稍微不一致的情況。服務(wù)模塊另一個作用就在本地做一個名單庫副本,定期用副本全量同步遠(yuǎn)程不同服務(wù)器中的名單庫。
[0019]如圖1所示,具體實(shí)施分為兩大部分,遠(yuǎn)程服務(wù)器和本地服務(wù)模塊;當(dāng)并發(fā)請求很高的時候,應(yīng)用需要布置到多臺服務(wù)器上,并且一臺服務(wù)器上需要多個進(jìn)程處理,所以本發(fā)明要考慮多臺服務(wù)器和同一服務(wù)器不同進(jìn)程之間的名單庫一致性;
(一),遠(yuǎn)程服務(wù)器部分;遠(yuǎn)程服務(wù)器上包括信息抽取模塊(Access Module)、查詢模塊(Search Module)、封禁模塊、名單存儲模塊(List Storage);如圖2所示,
1)當(dāng)一個請求到達(dá)服務(wù)器之后,首先進(jìn)入信息抽取模塊,由信息抽取模塊負(fù)責(zé)提取用戶id信息,本封禁策略對于登陸用戶使用用戶的登陸id賬號,對于非登陸用戶使用用戶的IP地址代替;
2)提取出用戶id或IP地址后,交給查詢模塊判斷該用戶id或IP地址是不是應(yīng)該封禁,首先查詢服務(wù)器內(nèi)存中的白名單,如果在白名單中跳過封禁模塊允許正常訪問;如果在黑名單中拒絕訪問;如果不在名單中任然放行,但是會有進(jìn)一步的識別判斷是不是爬蟲;
3),名單存儲模塊(ListStorage)用于名單的增加、刪除和修改操作;對于名單查詢,List Storage是存儲在內(nèi)存中的,對于爬蟲名單數(shù)量一般不會大于100萬量級,用hash表存儲需要的內(nèi)存大小小于100M。因?yàn)槭遣捎霉蚕韮?nèi)存的方式,在進(jìn)程查詢名單的時候首先要對名單庫上讀鎖,以防止該進(jìn)程在查詢名單時,其它進(jìn)程對名單庫進(jìn)行增加、刪除、修改操作。
[0020]對于維護(hù)多臺服務(wù)器中的名單庫的一致性,采用了一個附件模塊:服務(wù)模塊。對名單庫進(jìn)行操作(包括增刪)不直接發(fā)送給名單庫,而是發(fā)送到服務(wù)模塊,由服務(wù)模塊轉(zhuǎn)發(fā)該操作到服務(wù)模塊中注冊的所有服務(wù)器中。由于網(wǎng)絡(luò)上的原因或者服務(wù)器端的錯誤操作每臺服務(wù)器中的名單庫還是會存在差異,服務(wù)模塊要定時對所有服務(wù)器中的名單進(jìn)行定時的全量更新。服務(wù)模塊主要為了分擔(dān)服務(wù)器端的壓力,提高靈活性,通過對名單庫的備份提高安全性。
[0021]服務(wù)模塊的作用是維護(hù)不同遠(yuǎn)程服務(wù)器中名單庫的一致性,對名單庫進(jìn)行備份當(dāng)遠(yuǎn)程名單庫損壞的時候用于恢復(fù),并且分擔(dān)遠(yuǎn)程服務(wù)器的部分壓力,提供更靈活的名單操作。
[0022]在服務(wù)模塊中包含兩部分:名單請求處理邏輯模塊(Service模塊),名單庫本地數(shù)據(jù)庫備份List DB,如圖3所示;
具體過程如下,如圖4所示,服務(wù)模塊具體進(jìn)行下述操作:
1)當(dāng)名單操作請求到達(dá)Service模塊時,Service模塊判斷請求類型;
2)如果是刪除名單條目的請求,首先到名單庫本地數(shù)據(jù)庫中查看該名單條目是否存在;如果存在則刪除名單庫本地數(shù)據(jù)庫中本條名單條目,同時根據(jù)Service模塊中記錄的遠(yuǎn)程服務(wù)器列表給全部遠(yuǎn)程服務(wù)器發(fā)送刪除該條名單條目的請求;如果不在名單庫本地數(shù)據(jù)庫中,不做任何操作;
3)如果是添加名單條目的請求,同樣首先到名單庫本地數(shù)據(jù)庫中查看該名單條目是否存在;如果不存在則在名單庫本地數(shù)據(jù)庫中添加該條名單條目,同時根據(jù)Service模塊中記錄的遠(yuǎn)程服務(wù)器列表給全部遠(yuǎn)程服務(wù)器發(fā)送添加該名單條目的請求;如果存在不做任何操作。
[0023]服務(wù)模塊需要定時檢查遠(yuǎn)程服務(wù)器上名單庫與名單庫本地數(shù)據(jù)庫的一致性,對于每臺服務(wù)器執(zhí)行以下操作:
1)服務(wù)模塊讀取遠(yuǎn)程服務(wù)器中的全部名單庫到本地;
2)遍歷讀取到名單庫中所有的名單條目,對于每一個名單條目查看本地數(shù)據(jù)庫,如果不在本地數(shù)據(jù)庫中向遠(yuǎn)程服務(wù)器發(fā)送刪除該名單條目的請求;
3)遍歷本地數(shù)據(jù)庫的所有名單條目,對于每一個名單條目查看是否在遠(yuǎn)程服務(wù)器上名單庫中,如果不存在向遠(yuǎn)程服務(wù)器發(fā)送添加該名單條目的請求。
【主權(quán)項(xiàng)】
1.一種高訪問情況下的爬蟲封禁方法,其特征在于,包括: 在服務(wù)器上建立和維護(hù)名單庫,將所有要封禁的爬蟲加入到名單庫的黑名單中,對正規(guī)爬蟲和服務(wù)器內(nèi)部使用的爬蟲加入到名單庫的白名單中; 將名單庫中的名單存儲在內(nèi)存中并建立hash表索引; 將建立好hash索引的名單庫映射到同一服務(wù)器不同進(jìn)程的地址空間中; 當(dāng)一個請求到達(dá)服務(wù)器時,提取請求中的用戶id或者IP地址,一個進(jìn)程查詢內(nèi)存中名單庫中名單,當(dāng)用戶id或IP地址在名單庫的黑名單中時,拒絕訪問或延遲返回數(shù)據(jù)或返回劣質(zhì)數(shù)據(jù)。2.如權(quán)利要求1所述的高訪問情況下的爬蟲封禁方法,其特征在于,同一臺服務(wù)器中,不同進(jìn)程之間使用共享內(nèi)存來維護(hù)多個進(jìn)程之間名單庫的一致性;一個進(jìn)程在查詢名單時首先對名單庫上讀鎖,以防止該進(jìn)程在查詢名單時,其它進(jìn)程對名單庫進(jìn)行增加、刪除、修改操作。3.如權(quán)利要求1所述的高訪問情況下的爬蟲封禁方法,其特征在于: 為了維護(hù)多臺服務(wù)器中名單庫的一致性,單獨(dú)設(shè)立一個服務(wù)模塊,所有服務(wù)器對名單庫進(jìn)行更新操作時,操作不直接發(fā)送給服務(wù)器上的名單庫,而是發(fā)送到服務(wù)模塊,通過服務(wù)模塊轉(zhuǎn)發(fā)該操作到服務(wù)模塊中注冊的所有服務(wù)器中; 服務(wù)模塊還定時對所有注冊至服務(wù)模塊的服務(wù)器中的名單進(jìn)行定時的全量更新。4.如權(quán)利要求3所述的高訪問情況下的爬蟲封禁方法,其特征在于: 服務(wù)模塊包括名單請求處理邏輯模塊,名單庫本地數(shù)據(jù)庫備份;服務(wù)模塊具體進(jìn)行下述操作: 1)當(dāng)名單操作請求到達(dá)名單請求處理邏輯模塊時,名單請求處理邏輯模塊判斷請求類型; 2)如果是刪除名單條目的請求,首先到名單庫本地數(shù)據(jù)庫中查看該名單條目是否存在;如果存在則刪除名單庫本地數(shù)據(jù)庫中本條名單條目,同時根據(jù)名單請求處理邏輯模塊中記錄的遠(yuǎn)程服務(wù)器列表給全部遠(yuǎn)程服務(wù)器發(fā)送刪除該條名單條目的請求;如果不在名單庫本地數(shù)據(jù)庫中,不做任何操作; 3)如果是添加名單條目的請求,同樣首先到名單庫本地數(shù)據(jù)庫中查看該名單條目是否存在;如果不存在則在名單庫本地數(shù)據(jù)庫中添加該條名單條目,同時根據(jù)名單請求處理邏輯模塊中記錄的遠(yuǎn)程服務(wù)器列表給全部遠(yuǎn)程服務(wù)器發(fā)送添加該名單條目的請求;如果存在不做任何操作。5.如權(quán)利要求3所述的高訪問情況下的爬蟲封禁方法,其特征在于: 所述服務(wù)模塊還定時對所有注冊至服務(wù)模塊的服務(wù)器中的名單進(jìn)行定時的全量更新,具體包括: 定期地, 1)服務(wù)模塊讀取遠(yuǎn)程服務(wù)器中的全部名單庫到本地; 2)遍歷讀取到名單庫中所有的名單條目,對于每一個名單條目查看本地數(shù)據(jù)庫,如果不在本地數(shù)據(jù)庫中向遠(yuǎn)程服務(wù)器發(fā)送刪除該名單條目的請求; 3)遍歷本地數(shù)據(jù)庫的所有名單條目,對于每一個名單條目查看是否在遠(yuǎn)程服務(wù)器上名單庫中,如果不存在向遠(yuǎn)程服務(wù)器發(fā)送添加該名單條目的請求。
【文檔編號】G06F21/56GK105827619SQ201610259811
【公開日】2016年8月3日
【申請日】2016年4月25日
【發(fā)明人】李興濤, 王儒敬, 王偉
【申請人】無錫中科富農(nóng)物聯(lián)科技有限公司, 安徽中科物聯(lián)科技有限公司, 江蘇物聯(lián)網(wǎng)研究發(fā)展中心