資料爬蟲是資料分析的起手式,必須有好的、可用的資料才得以進行高品質的資料科學專案,爬蟲也是資料科學領域開發者的第一項挑戰。但是當你學完爬蟲的技術之後,開始真的跳入爬蟲世界之後會發現有網站其實沒有想像中好爬。當自動化的爬蟲技術越來越廣泛應用的同時,網站方也有一些「反爬蟲」的機制出現,讓開發者無法輕易的爬蟲所需的資料。今天這篇文章想跟大家分享的是當你的爬蟲程式又被擋了怎麼辦?常見的反爬蟲知識以及對應的克服反爬蟲處理策略有哪些。

什麼是惡意爬蟲?

程式擁有「執行速度」與「記憶儲存」這兩種特性,我們可以利用程式自動化的重複、大量執行指定的操作。網頁爬蟲即是用程式自動化實現收集來自於網頁中資料的一種場景,但若這個「自動化」太暴力時則可能會造成對方的網站受到影響,稱為「惡意機器人( Bat Bot )」。網頁爬蟲自動化收集的行為太暴力的情況下,可能會造成對方的網站受到影響,常見的惡意行為有以下幾種:

  • DoS 或 DDoS
  • 非人為的廣告點擊行為
  • 異常流量
  • 商業機密洩漏

常見的反爬蟲處理策略

因此,反爬蟲主要就是針對「惡意的爬蟲程式」設計的防堵機制,包含「系統負擔」與「資料洩漏」兩個角度。從「資料洩漏」的角度來看,許多網站為了保護資料、避免網頁上的公開資訊被網頁爬蟲給抓取,而出現了「反爬蟲」的機制出現。所謂「道高一尺,魔高一丈」,爬蟲工程師也發展了出一系列「反反爬蟲」的策略。換句話說,因此,我們在思考如何克服反爬蟲處理策略,其實背後思考的點是如何讓你的爬蟲不要踩到對方的線。常見的克服反爬蟲處理策有:

  • 瀏覽器標頭與基本資訊
  • 驗證碼處理
  • 模擬真實用戶登入授權
  • 使用代理伺服器與第三方IP
  • JavaScript 渲染的動態網頁

瀏覽器標頭與基本資訊

網頁的傳輸會根據 HTTP 協定將溝通分為「Request」和「Response」兩種角色:

其中 Request 當中的 Header(標頭檔)會由瀏覽器自動產生,包含跟發送方有關的資訊,例如「Host」、「User-Agent」.. 等等。

因此,許多網站會將 HTTP Header 視為是第一個檢查的方式,利用 Header 判斷來源是否合法。Header 會由瀏覽器自動產生,如果直接透過程式發出的請求預設是沒有 Header 的。

驗證碼處理

你在瀏覽網頁的時候,有看過這些驗證機制嗎?網頁驗證碼的專業術語稱為「CAPTCHA 」(全名是 Completely Automated Public Turing test to tell Computers and Humans Apart 自動判別電腦與人類的公開圖靈測試),是目前在網頁當中常見的一種驗證機制,用來判斷惡意的使用者干擾與攻擊。驗證碼機制是許多網站傳送資料的檢查機制,對於非人類操作與大量頻繁操作都有不錯的防範機制。

爬蟲在實作上遇到驗證碼的做法會是這樣,先把圖抓回來,再搭配圖形識別工具找出圖中的內容。之前也有寫過一篇針對滑動驗證碼的解法:「讓 Python 爬蟲也能讀得懂「滑動驗證碼」」,有興趣的朋友可以看一下。

模擬真實用戶登入授權

大部分網站都有權限管理機制,使用上也會有登入/登出的機制。但由於爬蟲多半是基於 HTTP Request /Response 一來一回的方式取資料。如果直接使用爬蟲程式的話,要如何模擬使用者登入的行為就會是一個挑戰。我們把「登入系統/會員機制」過程稱為「授權」,而在網站開發中的的授權做法有兩種:「token」跟「session/cookie」。

Token 類似 API 的方法,需要在每次請求的過程中也把你申請到的合法權杖(token)一起帶上。通常需要由開發者自己放在 Request 的 Headers 當中,讓對方可以判別你是一個合法登入的來源;Session/Cookie:第二種方法是網站會主動把權限判斷儲存在「瀏覽器當中的 cookie」,發出 Request 請求時會自動跟著請求一起發出去。

使用代理伺服器與第三方IP

當爬蟲程式大量存取特定網站時,網站方可以採用最直接的防護機制 - 封鎖 IP,直接透過底層的方式做屏蔽。這邊的解法我們會採用「代理伺服器(Proxy)」的概念來處理,所謂的代理伺服器即是透過一個第三方主機代為發送請求,因此對於網站方而言,他收到的請求是來自於第三方的。

這邊也提供一些免費的第三方代理伺服器:

JavaScript 渲染的動態網頁

最後一種是「JavaScript 渲染的動態網頁」,動態網頁是指網頁在瀏覽器取得 HTML 後,才透過 JavaScript 根據需求動態地取得資料更新 HTML 的一種技術。動態網頁與靜態網頁最大的不同是「網頁上的資料」是在什麼時間點取得產生的。因此,動態爬蟲程式必須針對這種動態更新資料的網頁調整,才有辦法取得真正的資料。

網頁的問題是因為利用 Python 攔截到的 Response 永遠會是還沒執行 JavaScript 前那個相對空白的畫面。動態網頁爬蟲可以利用「從模擬瀏覽器改成模擬使用者開啟瀏覽器」,藉由模擬的瀏覽器執行 JavaScript 拉回資料。

打造爬蟲是資料人的基本技能

過去的資料來源多半來自於公司內部的資料庫或資料倉儲系統,仰賴於工程師跟 IT 部門的支援。但隨著 Big Data 的技術到位,實務上對於資料的要求更加大量也更加多元。現在對於資料的使用者其實很廣泛,通常很多資料的需求也都是實現性的。這種情況下可能沒有那麼多的工程師或開發人力能夠隨時提供彈性的資料,因此打造資料收集力已經成為所有資料工作者的必備技能了。


Reference

[1] 常見的反爬蟲技術有哪些?如何防止別人爬自己的網站?
[2] 9种常见的反爬虫策略思路
[3] python爬虫系统学习十一:常见反爬虫机制与应对方法



嗨,我是維元,近期推出一個全新型態的【 Python 資料科學教學實戰營 】,結合多元教學形式及豐富課程經驗幫助你更有效地學習。新課程「徒手打造數據分析應用案例 」正在早鳥募資中,歡迎你一起加入資料領域!誠摯的邀請你跟著我們一起從 Python 入門開始,走進資料科學的世界 🙌



📍 報名頁面: https://pse.is/44kvze
📍 報名頁面: https://pse.is/44kvze
📍 報名頁面: https://pse.is/44kvze

另外我也持續在不同的平台發表對 #資料科學、 #網頁開發 或 #軟體職涯 相關的文章。如果對於內文有疑問都歡迎與我們進一步的交流,都可以追蹤資料科學家的工作日常 Facebook 粉專Instagram 帳號,也會不定時的舉辦分享活動,一起來玩玩吧!



本著作由Chang Wei-Yaun (v123582)製作,
創用CC 姓名標示-相同方式分享 3.0 Unported授權條款釋出。