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