以Browser Automation作主導嘅網絡爬蟲 - Node.js + Selenium Webdriver


成功攞到啲嘢返黎。

自從返咗新工之後真係連搞自己個CMS都無時間,希望下個月會好啲...... (個1.4版本一拖再拖)

言歸正傳。最近因為工作嘅關係,需要到寫一啲網絡爬蟲黎攞資料。見識過上一手寫嘅C#並加以改良,亦試過利用Tampermonkey黎寫Userscript去攞資料落黎。不過而家Javascript當道,當你要攞一啲Conditional Rendering嘅資料嗰陣可能會因為無觸發到條件而拎唔到嘢。
之前一直都想試下用Node.js黎寫一啲嘢,所以就好順理成章咁開始呢個開發過程。最簡單嘅方法,亦都係網上搵得到最多嘅做法之一,就係用request同cheerio黎做。不過呢個方法只能夠拎靜態網頁嘅資料,如果牽涉到Conditional Rendering嘅話就會企咗喺度。由於之前學Laravel Dusk嘅時候接觸到Webdriver呢樣嘢,於是我就決定用selenium-webdriver呢個NPM套件。

Selenium-Webdriver NodeJS官方文件。

Webdriver嘅功用最主要係俾瀏覽器自己運行程式預定嘅動作;而Selenium原本就係類似按鍵精靈咁,你可以預先設定好你喺某個網站由網頁A去到網頁B嘅成個過程(包括鍵盤同滑鼠紀錄),然後你每逢再要做重覆嘅動作就可以用返個巨集,免卻繁複嘅步騷。Selenium-Webdriver,當然就係將兩者拼合埋一齊,然後自動化工具啦。以Node.js黎講,通常都會配合唔同嘅測試套件黎做瀏覽器測試。而我就用咗黎做爬蟲,所以就放棄咗用嗰堆套件。

成個過程其實好流暢。尤其係去到Conditional Rendering嘅位嗰陣,你可以設定個瀏覽器做某啲動作去觸發個結果,從而拎到相關資料。不過我預到卡住咗嘅位居然係喺for loop度。

唔能夠用forEach(...)進行後續。

呢個問題我搞咗兩日。最初以為係WebElement.findElements()度出咗問題,但係佢的確正確地傳返包住一堆WebElement嘅Array返黎。最後我就搵到原來forEach同async/await某程度上相性不合(https://stackoverflow.com/questions/37576685/using-async-await-with-a-foreach-loop),要用for-in或者for-of黎代替佢。

而家push咗一個乾淨版本上Git server度,遲下有時間應該會再大執佢。 (又俾坑自己踩...)


Selenium系列:

Powered by Half-moon Production.

Copyright © 2011-2020 by 泣雨家的雜物房. Version 1.5.2.

以Browser Automation作主導嘅網絡爬蟲 - Node.js + Selenium Webdriver


成功攞到啲嘢返黎。

自從返咗新工之後真係連搞自己個CMS都無時間,希望下個月會好啲...... (個1.4版本一拖再拖)

言歸正傳。最近因為工作嘅關係,需要到寫一啲網絡爬蟲黎攞資料。見識過上一手寫嘅C#並加以改良,亦試過利用Tampermonkey黎寫Userscript去攞資料落黎。不過而家Javascript當道,當你要攞一啲Conditional Rendering嘅資料嗰陣可能會因為無觸發到條件而拎唔到嘢。
之前一直都想試下用Node.js黎寫一啲嘢,所以就好順理成章咁開始呢個開發過程。最簡單嘅方法,亦都係網上搵得到最多嘅做法之一,就係用request同cheerio黎做。不過呢個方法只能夠拎靜態網頁嘅資料,如果牽涉到Conditional Rendering嘅話就會企咗喺度。由於之前學Laravel Dusk嘅時候接觸到Webdriver呢樣嘢,於是我就決定用selenium-webdriver呢個NPM套件。

Selenium-Webdriver NodeJS官方文件。

Webdriver嘅功用最主要係俾瀏覽器自己運行程式預定嘅動作;而Selenium原本就係類似按鍵精靈咁,你可以預先設定好你喺某個網站由網頁A去到網頁B嘅成個過程(包括鍵盤同滑鼠紀錄),然後你每逢再要做重覆嘅動作就可以用返個巨集,免卻繁複嘅步騷。Selenium-Webdriver,當然就係將兩者拼合埋一齊,然後自動化工具啦。以Node.js黎講,通常都會配合唔同嘅測試套件黎做瀏覽器測試。而我就用咗黎做爬蟲,所以就放棄咗用嗰堆套件。

成個過程其實好流暢。尤其係去到Conditional Rendering嘅位嗰陣,你可以設定個瀏覽器做某啲動作去觸發個結果,從而拎到相關資料。不過我預到卡住咗嘅位居然係喺for loop度。

唔能夠用forEach(...)進行後續。

呢個問題我搞咗兩日。最初以為係WebElement.findElements()度出咗問題,但係佢的確正確地傳返包住一堆WebElement嘅Array返黎。最後我就搵到原來forEach同async/await某程度上相性不合(https://stackoverflow.com/questions/37576685/using-async-await-with-a-foreach-loop),要用for-in或者for-of黎代替佢。

而家push咗一個乾淨版本上Git server度,遲下有時間應該會再大執佢。 (又俾坑自己踩...)


Selenium系列: