標籤:

Web網頁爬蟲對抗指南 Part.1

從本質上來講,阻止Web 爬蟲就意味著你需要讓腳本和機器難以從你的網站上獲取它們所需的數據,但不能讓那些真正的用戶和搜索引擎爬取數據變得困難。

然而不幸的是,要做到這一點很難,你需要在防止Web 爬蟲和降級真實用戶和搜索引擎的可訪問性之間進行權衡。

為了阻止Web 爬蟲(也稱為Webscraping,Screenscraping,Web數據挖掘,Web收集或Web數據提取),你需要了解這些爬蟲的工作原理,以及它們為什麼能夠運行良好的原因,本文的內容將會告訴你阻止爬蟲爬取數據的答案。

一般來說,這些爬蟲程序是為了從你的網站提取特定的信息,如文章,搜索結果,產品詳細信息,或你的案例中爬取藝術家和專輯等信息。通常,人們使用爬蟲爬取特定的數據的目的是將這些數據在自己的網站上進行重用(並從你的內容中賺自己的錢),或為你的網站(如移動應用程序)構建一種「假冒的」替代方案,甚至用於私人研究或分析目的。

基本上,網路中存在著各種類型的爬蟲,每一種爬蟲的工作方式都不盡相同:

· 蜘蛛(Spider),例如谷歌的機器人或網站複製工具,比如HTTrack,這中爬蟲會訪問你的網站,並遞歸地跟隨到其他頁面的鏈接,以獲取數據。這些爬蟲有時用於定向的爬取來獲取特定的數據,通常與HTML解析器結合,然後從每個頁面中提取所需要的數據。

· Shell腳本:有時候,常用的Unix工具也用於爬取數據,例如:使用shell腳本執行Wget或Curl下載Web頁面,通常再結合Grep(使用正則表達式)提取所需的數據。這些是最簡單的爬蟲,也是最脆弱的一種爬蟲(不要嘗試使用正則表達式解析HTML!)。

· HTML爬蟲和解析器,例如基於Jsoup,Scrapy等等的爬蟲技術。這類爬蟲有點類似於基於shell腳本的正則表達式的爬蟲,都是通過基於在HTML中進行正則匹配提取你的頁面中的數據,並忽略其他的內容。

所以,如果你的網站具有搜索功能,那麼這樣的爬蟲可能會提交一個搜索的HTTP請求,然後從結果頁的HTML中獲取所有結果的鏈接及其標題,有時候會發起請求數百次和數百種不同的搜索行為,以便專門獲取搜索結果鏈接和網頁標題。這些爬蟲是最常見的一種。

· 屏幕爬蟲,這類爬蟲是基於例如 Selenium或PhantomJS編寫的。實際上這種爬蟲是在真正的瀏覽器中打開了你的網站,並運行JavaScript,AJAX等等,然後再從網頁中獲取所需的文本,一般的做法如下:

o 在頁面載入和JavaScript運行之後,從瀏覽器中獲取HTML,然後使用HTML解析器來提取所需的數據或文本。這些是最常見的爬取數據的手法,這些方法在HTML解析器和其他的爬蟲方法不能用的情況下也有效。

o 對渲染頁面進行屏幕截圖,然後使用OCR技術從屏幕截圖中提取所需的文本。這中方法比較罕見,只有在爬取數據沒有辦法的情況下才會使用這種專用的爬蟲。

基於瀏覽器的屏幕爬蟲更難處理,因為它們運行腳本,渲染HTML,並且可以像一個真正的人在瀏覽你的網站一樣。

· 在線的Web爬蟲服務,如ScrapingHub或Kimono。事實上,有些人的工作就是弄清楚如何抓取你的網站的數據,並提出內容給別人使用。這類爬蟲技術,有時候會使用龐大的代理網路和不斷變化的IP地址來突破限制和阻止,所以它們是問題比較嚴重的一類爬蟲。

專業的爬蟲服務是最難以阻止的,這不需要感到奇怪,但是如果你弄清楚Web 爬蟲是如何爬取你的網站的,那麼這些爬蟲(以及為這類爬蟲服務付款方式的人)可能不會因為你的網站的數據而遭到困擾了。

· 將你的網站使用框架嵌入其他網站的網頁中,並將你的網站嵌入到移動應用中。

雖然在技術上來說這種手法不算是爬蟲,但這的確也算是一個問題,因為移動應用程序(Android和iOS)可以嵌入你的網站,甚至注入自定義的CSS和JavaScript,從而完全改變你的網站的外觀,並且只顯示所需的信息,如文章內容本身或搜索結果列表,以及隱藏一些東西,如頁眉,頁腳或廣告。

· 人工複製和粘貼:網站訪客會複製和粘貼你的網站的內容,以便在其他地方使用。不幸的是,要阻止這種方法你基本上無能為力。

這些不同類型的爬蟲之間存在很多重疊的地方,即使使用不同的技術和方法來獲取你的內容,許多爬蟲也將表現出相似的行為。

以上這些提示信息大部分是我自己的想法,包括我在編寫爬蟲時遇到的各種困難,以及來自互聯網上的一些信息和想法。

如何阻止爬蟲

一些檢測和阻止爬蟲的常見方法:

監控你的日誌和流量模式; 如果發現異常活動,則限制訪問:

定期檢查你的日誌,如果發現了一些自動訪問(爬蟲)的異常活動(例如來自同一個IP地址的許多類似的請求操作),那麼你可以阻止或限制這些IP地址的訪問。

具體來說,限制措施如下:

· 訪問速率限制:

只允許用戶(和爬蟲)在一定時間內執行有限數量的操作 – 例如,只允許任何特定的IP地址或用戶每秒進行幾次搜索。這樣就會減慢爬蟲的使用,使爬取功能逐漸無效。如果操作的完成速度比實際用戶要快得多或更快,你也可以顯示一個驗證碼來阻止爬蟲。

· 檢測異常活動:

如果你發現了異常活動,例如來自某個特定的IP地址的許多類似的請求,或者是某個用戶瀏覽了過多的頁面或執行的搜索次數不同尋常,那麼也可以阻止這類IP或用戶的訪問,或者是在後續的請求中顯示驗證碼。

· 不要只是通過IP地址監控和限制訪問速率 —— 也可以使用其他指標:

如果你阻止或限制訪問速率,請不要僅在每個IP地址的基礎上進行; 你可以使用其他指標和方法來識別特定的用戶或爬蟲。下面包括了一些可以幫助你識別特定用戶/爬蟲的指標:

o 用戶填寫表單的速度以及他們點擊的按鈕的位置;

o 你可以使用JavaScript收集客戶端的大量信息,例如屏幕尺寸/解析度,時區,已安裝的字體等; 你可以使用這些信息來識別用戶。

o Http協議頭及其順序,尤其是User-Agent。

例如,如果你發現從單個IP地址上發出了許多請求,則所有使用相同的User agent,屏幕尺寸(用JavaScript確定)的用戶(此時應該是爬蟲)始終以相同的方式和相同的時間間隔定期點擊按鈕,那麼它可能是一個屏幕爬蟲; 你可以暫時阻止類似的請求(例如,阻止來自特定的IP地址中相同的user agent和屏幕大小的所有請求),這樣你就不會對該IP地址上的真實用戶造成影響,例如:在共享互聯網連接的情況下。

你還可以進一步的阻止爬蟲,因為你可以識別類似的請求,如果這些請求來自不同的IP地址,那麼意味著這可能是一個分散式Web 爬蟲(使用殭屍網路或代理網路的爬蟲)。如果你發現了還有很多相同的其他請求,但是它們來自不同的IP地址,那麼你也可以阻止IP地址的訪問。再次提醒一下,不要在無意中阻止了真實的用戶。

這可以對運行JavaScript的屏幕截圖類的爬蟲很有效,因為你可以從中獲取大量的信息。

Security Stack Exchange上面與此有關的相關問題:

· 如何識別出口IP地址相同的用戶?

· 為什麼人們在IP地址經常變化時使用IP地址黑名單?

· 請使用驗證碼替代臨時阻止訪問的方案:

實現訪問速率限制的簡單方法是在一段時間內臨時阻止訪問,但是使用驗證碼可能會更好一些,詳細內容請參閱「驗證碼」部分。

要求註冊和登錄

如果你的網站可以做到需要創建帳戶才能查看你的網站的內容的話,那麼這對爬蟲來說可能是一個很好的威懾,但對真實用戶來說也可能是一個很好的威懾。

· 如果你要求客戶端創建帳戶和登錄,那麼你可以準確的跟蹤用戶和爬蟲的操作。這樣的話,你就可以輕鬆的檢測某些帳戶是何時被用於爬蟲的,然後禁止掉這些用戶。訪問速率限制或檢測濫用(例如在短時間內的大量搜索請求)也會變得更加容易,因為你可以識別特定的爬蟲而不僅僅是識別出IP地址。

為了避免自動化創建許多帳戶的腳本,你應該做以下這些事情:

· 註冊時需要一個電子郵件地址,並且用戶必須打開通過你所發送的鏈接來驗證該電子郵件地址才能激活該帳戶。每個電子郵件地址只允許一個帳戶。

· 需要在註冊/帳戶創建期間顯示驗證碼,以防止自動化腳本創建帳戶。

要求創建帳戶才能查看內容的做法會導致用戶和搜索引擎不能正常訪問; 如果你需要創建帳戶才能查看文章,那麼用戶將會去其他網站,而不是去註冊一個賬戶然後再查看文章。

阻止來自雲託管主機和爬蟲服務的IP地址的訪問

有時,爬蟲會從網路託管服務(如Amazon Web Services或Google App Engine)或VPSes運行。限制(或顯示驗證碼)來源於此類雲主機服務使用的IP地址請求訪問你的網站。你還可以阻止從爬蟲服務使用的IP地址的訪問。

同樣,你還可以限制代理或VPN提供商使用的IP地址的訪問,因為爬蟲可能會使用此類代理伺服器來避免單個IP發出許多請求。

請注意,通過阻止代理伺服器和VPN的訪問,你將對真實用戶產生負面的影響。

如果你要採取阻止訪問的做法,請將你的錯誤消息進行調整

如果你採取了阻止/限制訪問的手段,那麼你應該確保不要告訴爬蟲導致阻塞的實際原因,從而給爬蟲製作者如何修復爬蟲的線索。所以用文本顯示錯誤頁面可能是一個壞主意:

· 你的IP地址請求過於頻繁,請稍後再試。

· 錯誤,User Agent不存在,非法訪問!

相反,顯示一個友好的錯誤消息,不要告訴爬蟲是什麼原因造成不能正常訪問的。

· 抱歉,網站出了一些問題。如果問題仍然存在,你可以聯繫helpdesk@example.com。

這也是真正對用戶友好的一種顯示內容。你還應該考慮在後續的請求中不要直接顯示驗證碼,以防真實用戶看到這個錯誤消息,導致你阻止了合法用戶的訪問行為。

如果你的網站被爬蟲訪問,請使用Captchas。

Captchas(「完全自動化測試以分辨電腦和人類」)對於阻止爬蟲非常有效。不幸的是,這種方式對正常用戶的請求有干擾。

因此,當你懷疑你的網站可能被爬了,那麼這種方式是非常有用的,因為這種方法只是阻止了Web 爬蟲,而不會阻止真實的正常用戶的訪問。

使用Captchas時需要注意下面幾個事情:

· 不要自己實現驗證碼,應該使用像Google的reCaptcha這樣的東西:這比自己實現一個驗證碼要容易得多,它比一些模糊和扭曲的文本解決方案對用戶來說更友好,而且比起自己實現驗證碼,它能更好的解決問題

· 不要在HTML標記中包含驗證碼的解決方案:實際上我已經看到一個網站在頁面中嵌入了驗證碼的解決方案(雖然隱藏的很好)。但是不要這樣做。還是推薦使用像reCaptcha這樣的服務,如果你正確使用它,就不會出現問題。

· Captchas是可以批量驗證的:在網上有一些低報酬的人工打碼服務可以批量解決驗證碼的驗證服務。所以,我在這裡還是推薦使用reCaptcha,因為它具有很好的自我保護作用。這種服務不太可能被用於人工打碼,除非你的數據真的很有價值。

將你的文本內容轉成圖片

你可以在伺服器端將文本轉換成圖像然後在客戶端顯示,這種方法可以阻礙簡單的爬蟲提取文本。

然而,這對於屏幕閱讀器,搜索引擎,性能以及其他的一些事情都是不利的。在某些方面(比如無障礙操作,例如美國殘疾人法案)也可能是非法的,並且也很容易被一些OCR技術繞過,所以最好還是不要這樣做。

你可以做類似於CSS精靈的東西,但是也同樣會遇到上面的問題。

不要公開你的完整數據集:

如果可行的話,請不要為腳本或爬蟲機器人提供所有數據集的方法。例如:你有一個新聞網站,有很多單獨的文章。你可以通過現場搜索來搜索這些文章,並且如果你沒有列出任何網站上的所有文章及其URL,那麼這些文章將只能通過使用搜索來訪問特徵。這意味著一個想要從你的網站上獲得所有文章的腳本將不得不搜索可能出現在你的文章中的所有可能的短語,才能找到文章的全部內容,這對於爬蟲來說是很耗時的,而且效率低的可怕,所以爬蟲一般都會放棄爬取數據。

如果是以下這些情況,那麼這種方法將變得無效:

· 爬蟲機器人或腳本並不想或需要完整的數據集。

· 你的文章的URL是一個看起來像 http://example.com/article.php?articleId=12345這種(和類似的東西)的格式,這將允許爬蟲可以簡單地迭代所有articleId的文章,並請求所有的文章內容。

· 還有其他方式可以最終找到所有的文章,比如通過編寫一個腳本來跟蹤其他文章的內容中的鏈接。

· 搜索「&」或「」的東西可以顯示幾乎所有的東西,這是一些需要注意的事情。(你只能返回前10或20個結果來避免這種情況)。

· 你需要搜索引擎來查找你的內容。

本文翻譯自:github.com/JonasCz/How- ,如若轉載,請註明原文地址: 4hou.com/technology/848 更多內容請關注「嘶吼專業版」——Pro4hou

推薦閱讀:

3個步驟實現簡單語言解釋器(自製簡易編程語言)
IoT安全之設備安全性亟需提高
iOS、Android、WP 哪個更能保護用戶的個人隱私數據?哪個系統更安全些?
繞過AppLocker系列之弱路徑規則的利用

TAG:信息安全 |