網絡資訊擷取神器 – 爬蟲程式 (PYTHON SELENIUM)

by | 一月 26, 2021 | PYTHON 網頁資料擷取

我們在舉辦【Python 大數據培訓課程】時,發現很多學員對 Selenium 有以下問題,在此解釋一下:

 

網絡爬蟲是什麼?

我們每天花很多時間在網絡,例如投資股票的朋友每天不時上網留意股價,廣告界的朋友經常在社交媒體、論壇等地方收集最新資訊,房地產的朋友則經常留意各區物業買賣價等。不論目的為何,大家做的其實都是不斷重複三個步驟 ─「打開網頁」、「前往目標版面」、「記錄資料」。其實只要你懂寫簡單的電腦程式,便可把這些重複動作交給電腦自動去做,電腦可以 24×7 無間斷地,每隔一個指定的時間 (例如每隔 5 分鐘),自動地去做記錄資料的工作。你更可以指示電腦自動分析這些資料,並自動執行某個行動 (例如股價波動到某個位時自動進行交易)。

 

Selenium 原理是什麼?

Selenium 是利用自動化控制你的瀏覽器,前往網站,模擬人手點擊鍵盤滑鼠下載資料的,就像網絡版的按鍵精靈。這個方法雖然簡單原始,但卻是最通用而有效的方案,99% 以上的網站都可以下載到。

原因是,瀏覽器是必定可以運行所有 Javascript、frame 的 (不然你平日怎樣上網?)。其次,無論網站採取那種技術去阻擋爬蟲程式,它的設計是一定要讓正常用戶通過 (不然這個網站就無人去到了…)。而正常用戶是通過瀏覽器觀看網站的,而且他們是用鍵盤和滑鼠操作網站的。

Selenium 正是基於瀏覽器,並且會模擬鍵盤和滑鼠操作網站,只要目標頁面你平日能夠用瀏覽器入到,那 Selenium 都會入到的,因此幾乎所有網站都可以用 Selenium 爬的。

網絡爬蟲是否犯法?

Python Selenium 並不是 black magic,它無法神奇地取得對方的機密資料。它的原理只是自動化控制你的瀏覽器,前往網站,模擬人手點擊鍵盤滑鼠,copy-and-paste 取得資料。因此所取得的網站內容其實都是對方已經公開在網站上的,用人手都能拿到,所以並不犯法的。要注意的是如果你把程式速度設定過快,網站可能會認為你在惡意攻擊而把你封鎖 IP。因此我們會教你在程式加入適量延時,減慢程式速度以避免這點。

 

我曾試過用某個工具把網站的 HTML 下載,但裡面無我要的資料!?

這是因為該網站內容是動態地以 Javascript 呈現出來、又或是用 frame 包住的,因此雖然你在瀏覽器上看到,但你下載回來的HTML檔卻不會含有資料,這是網站阻擋爬蟲程式的常見做法。你一般會在這些網站源碼中看到 frame、iframe、document.write、ajax、XMLHttpRequest 等語句。要解決這個問題,你的爬蟲程式不能是單純的 HTML 下載器,而是要能夠運行 Javascript 和 frame 的程式,Selenium 正是解決這個問題的好方法。

 

SeleniumBeautiful soup、Scrapy 有什麼不同?

除了 Selenium 外,常見的爬蟲庫還有 Beautiful soup、Scrapy。但它們無法運行 Javascript 和frame,只能把網站的HTML源碼下載 (嚴格來說 Beautiful soup 只是 HTML 解析器,下載還需搭配urllib、requests 等工具庫)。因此很多動態生成資料的網站它們都無法下載。你可能會問,那為什麼這些庫還會存在?那是因為它們的設計目的不是讓你下載網站資料,而只是要快速取得網站內每個頁面所有的超連結 (a),分析網站頁面之間的關係 (好像 Google, Yahoo 等搜尋引擎)。這些庫不運行Javascript,大大提升了它們的速度,它們1秒內下載數十個頁面都不是難事 (但實際應用時還是要限速以避免封 IP)。

而 Selenium 的設計初衷則是讓網站開發人員為網站自動化除錯用的 (相信你曾經遇到過某些網站上的按鈕被廣告蓋住,無法點擊吧。那就是因為開發人員偷懶,無進行測試的結果!),小型網站只有數十個頁面,開發人員手動到訪每個頁面測試就可以了。但有數千個頁面的大型網站就必須要用 Selenium 自動測試所有頁面了。由於 Selenium 站在使用者角度測試網站,因此它必須模仿使用者瀏覽頁面時的行為,例如鍵盤輸入文字、滑鼠點擊、上下滑動頁面等。這個設計優點是能夠取得所有真實呈現在畫面的資料,絕大多數網站都能用,但缺點是速度較慢,1秒可能只能下載1頁。

2020 11 23 下午2.28.08

Selenium 有無法下載的網站嗎?

只要是瀏覽器入到的網站,Selenium 都能入到,但網站的設計者還是可以透過一些技巧令你入到、看到,但下載不到資料。

首先是文字被嵌入在圖片中,這個情況下 Selenium 只能下載到圖片,但要讀取圖片中的文字(如下圖兩張圖片)則要用圖像文字識別 OCR (Optical Character Recognition) 技術才能讀到,大大增加讀取難度。

Charts 300x200 1

 

 

以上文字和走勢線是圖片畫出來的,程式需要加上 OCR (Optical Character Recognition) 才「可能」讀到。

然後是隨機出現的問答問題。除非你事先已為所有可能會出現的問題設定答案,否則Selenium基本上不可能自動答到的

image thumb 6 199x300 1

 

圖:隨機問答例子

除了以上兩種情況外,還有一些很奇特的方法令你看到但很難下載到資料的,但它們實行的成本都很高,也會影響到正常用戶訪問頁面的體驗,可謂殺敵八百自損三千,因此資料性的網站一般都不會特地用這些方法保護 (總不成要使用者每看一篇新聞都要答一次問題吧!) 因此只有一些非常大型、非資料性的網站才會使用。另外,即使網站用了問答或圖片驗証碼,只要出現頻率不高,Selenium 還是能夠下載到的,請見下文。

Selenium 對於有隨機問答、圖片驗証碼,或要登入的網站能否下載?

只要出現頻率不高,是可以的。雖然上面提及到 Selenium 很難自動完成問答,或讀到驗証碼內的文字,但你是可以做到先讓程式暫停在頁面,你手動輸入答案或驗証碼,再讓程式繼續運行的。因此大部份需要驗証碼登入的網站,你只需一開始手動輸入一次驗証碼,然後 Selenium 也是可以下載的。

 

Python、R、Selenium 有什麼不同?

Python、R 是程式語言,而 Selenium 則是工具庫,Python 和 R 都可以用 Selenium 這套工具庫的。那應該學 Python 還是 R?這取決於你的目的。R 是為數據分析、統計學而設計的,用途偏向在已有數據上做分析,例如計算平均值、均方差、統計模型等。Python 則是程式快速原型和工程系統整合而設計的,使用範圍比較廣闊,例如圖像處理、訊號分析、電腦視覺、機械人等。Python 初學者較易掌握,行業用途也較廣。如果你未有特定的行業應用,建議你學 Python。如果你專注數據分析行業,那就應該學習 R,當然 2 種都學就最好吧!

更多文章

Python 可以做到什麼工具?富途API 接駁、足球賽馬博彩數據擷取、WhatsApp 自動化批量發送、辦公室自動化

Python 可以做到什麼工具?富途API 接駁、足球賽馬博彩數據擷取、WhatsApp 自動化批量發送、辦公室自動化

現在Python 越來越流行,很多人都很好奇 Python可以做些什麼。小編現在為你講解及演示一些我們我何可以透過 Python 去完成的日常工作程式吧!Python 接駁富途 OPEN API現在買賣股票、期權,可以透過證券商的 API 進行高頻數據擷取,甚至做到模擬交易、自動化下單等,以下是一些示範影片:足球博彩投注及數據擷取以往我們教授 Python 課程時,有很多學員對博彩數據及程式博彩交易都十分感興趣,所以我們做了一些影片供大家參考。WhatsApp 自動化發送工具市面上有一些公司提供 WhatsApp...

Python, MultiCharts 大比較,哪個更好?

Python, MultiCharts 大比較,哪個更好?

市場上有不同類型的交易軟件,例如 MultiCharts,哪為什麼不直接使用,而去學習 Python 呢?因為 Python 是一門電腦語言,自由度極高,你在製作你的交易程式時不會有任何限制。而 Python 是眾多電腦語言中,是最能在開發效率及程式效能上取得完美的平衡。 當然,要拼速度,當然是 C 語言能獲得取佳的運算速度,但是 C 語言並不易學,如果你不是對電腦編程抱有濃厚的專業興趣,你一定會熬不過 C 的學習限階。而  Python...

程式交易的優勢

程式交易的優勢

隨著證券商的 API 開放(e.g. 富途OPEN API),程式交易變得非常平易近人,只要你能掌握一門電腦語言,例如 Python、 Javascript、C++ 等,你將會可以享受高速的交易數據,進行策略驗證(Back Test 及 Forward Test),甚麼讓程式自動為你實時監察市場動向,並執行交易指令。

WhatsApp 批量發送,輕鬆用程式完成!

WhatsApp 批量發送,輕鬆用程式完成!

WhatsApp 是我們每日經常便用的手機 APP,跟親友通訊、工作通知、客戶服務,大部分都是經 WhatsApp 完成。每一個人都習慣性每隔一段時間(10分鐘到1小時),檢查一下 WhatsApp,所以任何經 WhatsApp 發送的內容基本上都能保證對方已經查看。

富途 Open API 介紹 – 秒級高頻數據、程式交易 (PYTHON 接駁)

富途 Open API 介紹 – 秒級高頻數據、程式交易 (PYTHON 接駁)

為鼓勵大眾使用證券商的服務和提高交易頻率,富途開放了免費及付費的 API 供用戶去使用 。
富途 API 支持多種的電腦語言進行接駁,包括Python、Java、C#、C++、JavaScript。他們編寫好完善的函數庫,你只需根據富途 OPEN API 文檔的指示,編寫程式直接下載使用就可。

YouTube 頻道

歡迎訂閱核心引擎 YouTube 頻道

頻道上有我們的一些技術案例示範,並且我們將會推出一些免費資訊影片,向大家介紹編程及網絡行銷技術!請多多支持呀!