我們在舉辦【Python 大數(shù)據(jù)培訓課程】時,發(fā)現(xiàn)很多學員對 Selenium 有以下問題,在此解釋一下: 網(wǎng)絡爬蟲是什麼?我們每天花很多時間在網(wǎng)絡,例如投資股票的朋友每天不時上網(wǎng)留意股價,廣告界的朋友經(jīng)常在社交媒體、論壇等地方收集最新資訊,房地產(chǎn)的朋友則經(jīng)常留意各區(qū)物業(yè)買賣價等。不論目的為何,大家做的其實都是不斷重複三個步驟 ─「打開網(wǎng)頁」、「前往目標版面」、「記錄資料」。其實只要你懂寫簡單的電腦程式,便可把這些重複動作交給電腦自動去做,電腦可以 24x7 無間斷地,每隔一個指定的時間 (例如每隔 5 分鐘),自動地去做記錄資料的工作。你更可以指示電腦自動分析這些資料,並自動執(zhí)行某個行動 (例如股價波動到某個位時自動進行交易)。 Selenium 原理是什麼?Selenium 是利用自動化控制你的瀏覽器,前往網(wǎng)站,模擬人手點擊鍵盤滑鼠下載資料的,就像網(wǎng)絡版的按鍵精靈。這個方法雖然簡單原始,但卻是最通用而有效的方案,99% 以上的網(wǎng)站都可以下載到。 原因是,瀏覽器是必定可以運行所有 Javascript、frame 的 (不然你平日怎樣上網(wǎng)?)。其次,無論網(wǎng)站採取那種技術(shù)去阻擋爬蟲程式,它的設計是一定要讓正常用戶通過 (不然這個網(wǎng)站就無人去到了…)。而正常用戶是通過瀏覽器觀看網(wǎng)站的,而且他們是用鍵盤和滑鼠操作網(wǎng)站的。 Selenium 正是基於瀏覽器,並且會模擬鍵盤和滑鼠操作網(wǎng)站,只要目標頁面你平日能夠用瀏覽器入到,那 Selenium 都會入到的,因此幾乎所有網(wǎng)站都可以用 Selenium 爬的。 網(wǎng)絡爬蟲是否犯法?Python Selenium 並不是 black magic,它無法神奇地取得對方的機密資料。它的原理只是自動化控制你的瀏覽器,前往網(wǎng)站,模擬人手點擊鍵盤滑鼠,copy-and-paste 取得資料。因此所取得的網(wǎng)站內(nèi)容其實都是對方已經(jīng)公開在網(wǎng)站上的,用人手都能拿到,所以並不犯法的。要注意的是如果你把程式速度設定過快,網(wǎng)站可能會認為你在惡意攻擊而把你封鎖 IP。因此我們會教你在程式加入適量延時,減慢程式速度以避免這點。 我曾試過用某個工具把網(wǎng)站的 HTML 下載,但裡面無我要的資料???這是因為該網(wǎng)站內(nèi)容是動態(tài)地以 Javascript 呈現(xiàn)出來、又或是用 frame 包住的,因此雖然你在瀏覽器上看到,但你下載回來的HTML檔卻不會含有資料,這是網(wǎng)站阻擋爬蟲程式的常見做法。你一般會在這些網(wǎng)站源碼中看到 frame、iframe、document.write、ajax、XMLHttpRequest 等語句。要解決這個問題,你的爬蟲程式不能是單純的 HTML 下載器,而是要能夠運行 Javascript 和 frame 的程式,Selenium 正是解決這個問題的好方法。 Selenium、Beautiful soup、Scrapy 有什麼不同?除了 Selenium 外,常見的爬蟲庫還有 Beautiful soup、Scrapy。但它們無法運行 Javascript 和frame,只能把網(wǎng)站的HTML源碼下載 (嚴格來說 Beautiful soup 只是 HTML 解析器,下載還需搭配urllib、requests 等工具庫)。因此很多動態(tài)生成資料的網(wǎng)站它們都無法下載。你可能會問,那為什麼這些庫還會存在?那是因為它們的設計目的不是讓你下載網(wǎng)站資料,而只是要快速取得網(wǎng)站內(nèi)每個頁面所有的超連結(jié) (a),分析網(wǎng)站頁面之間的關係 (好像 Google, Yahoo 等搜尋引擎)。這些庫不運行Javascript,大大提升了它們的速度,它們1秒內(nèi)下載數(shù)十個頁面都不是難事 (但實際應用時還是要限速以避免封 IP)。 而 Selenium 的設計初衷則是讓網(wǎng)站開發(fā)人員為網(wǎng)站自動化除錯用的 (相信你曾經(jīng)遇到過某些網(wǎng)站上的按鈕被廣告蓋住,無法點擊吧。那就是因為開發(fā)人員偷懶,無進行測試的結(jié)果!),小型網(wǎng)站只有數(shù)十個頁面,開發(fā)人員手動到訪每個頁面測試就可以了。但有數(shù)千個頁面的大型網(wǎng)站就必須要用 Selenium 自動測試所有頁面了。由於 Selenium 站在使用者角度測試網(wǎng)站,因此它必須模仿使用者瀏覽頁面時的行為,例如鍵盤輸入文字、滑鼠點擊、上下滑動頁面等。這個設計優(yōu)點是能夠取得所有真實呈現(xiàn)在畫面的資料,絕大多數(shù)網(wǎng)站都能用,但缺點是速度較慢,1秒可能只能下載1頁。
Selenium 有無法下載的網(wǎng)站嗎?只要是瀏覽器入到的網(wǎng)站,Selenium 都能入到,但網(wǎng)站的設計者還是可以透過一些技巧令你入到、看到,但下載不到資料。 首先是文字被嵌入在圖片中,這個情況下 Selenium 只能下載到圖片,但要讀取圖片中的文字(如下圖兩張圖片)則要用圖像文字識別 OCR (Optical Character Recognition) 技術(shù)才能讀到,大大增加讀取難度。
以上文字和走勢線是圖片畫出來的,程式需要加上 OCR (Optical Character Recognition) 才「可能」讀到。 然後是隨機出現(xiàn)的問答問題。除非你事先已為所有可能會出現(xiàn)的問題設定答案,否則Selenium基本上不可能自動答到的。除了以上兩種情況外,還有一些很奇特的方法令你看到但很難下載到資料的,但它們實行的成本都很高,也會影響到正常用戶訪問頁面的體驗,可謂殺敵八百自損三千,因此資料性的網(wǎng)站一般都不會特地用這些方法保護 (總不成要使用者每看一篇新聞都要答一次問題吧!) 因此只有一些非常大型、非資料性的網(wǎng)站才會使用。另外,即使網(wǎng)站用了問答或圖片驗証碼,只要出現(xiàn)頻率不高,Selenium 還是能夠下載到的,請見下文。 Selenium 對於有隨機問答、圖片驗証碼,或要登入的網(wǎng)站能否下載?只要出現(xiàn)頻率不高,是可以的。雖然上面提及到 Selenium 很難自動完成問答,或讀到驗証碼內(nèi)的文字,但你是可以做到先讓程式暫停在頁面,你手動輸入答案或驗証碼,再讓程式繼續(xù)運行的。因此大部份需要驗証碼登入的網(wǎng)站,你只需一開始手動輸入一次驗証碼,然後 Selenium 也是可以下載的。 Python、R、Selenium 有什麼不同?Python、R 是程式語言,而 Selenium 則是工具庫,Python 和 R 都可以用 Selenium 這套工具庫的。那應該學 Python 還是 R?這取決於你的目的。R 是為數(shù)據(jù)分析、統(tǒng)計學而設計的,用途偏向在已有數(shù)據(jù)上做分析,例如計算平均值、均方差、統(tǒng)計模型等。Python 則是程式快速原型和工程系統(tǒng)整合而設計的,使用範圍比較廣闊,例如圖像處理、訊號分析、電腦視覺、機械人等。Python 初學者較易掌握,行業(yè)用途也較廣。如果你未有特定的行業(yè)應用,建議你學 Python。如果你專注數(shù)據(jù)分析行業(yè),那就應該學習 R,當然 2 種都學就最好吧! |
|
來自: wwzs123hk > 《網(wǎng)絡》