利用 Puppeteer 刮取社交媒體資訊

Alex Lau 劉光曆

Alex Lau 劉光曆

2019-07-16

一般初學者會用 Scrapy 或者 BeautifulSoup 去作網頁刮取 (Web Scraping),這種方法的以 Python 直接向 Web Server 送出請求,速度可以很快,省卻一般瀏覽器下載 HTML 和 CSS 等時間。不過,某些網站為了防止自己的內容被刮取,或者源於原本網站設計的複雜程度高(如 Facebook、康體通、實時股票網站等等),需要使用大量 JavaScript 去渲染畫面,都使到這些刮取方法失效。

要避過這些障礙,唯有使用真的瀏覽器去刮取,所以,今次為大家介紹一個能夠操控真・瀏覽器去實作網頁刮取的方法:Puppeteer

0_CUeUltl1MEkiQ5NF.jpg

Puppeteer 是 Google 開發的工具,原本的目的使用 Chromium 瀏覽器 (即開源版 Google Chrome) 作軟件測試。Puppet 的中文解釋是木偶,顧名思義,Puppeteer 就是讓你像操控木偶般操控瀏覽器。由於操控的自由度很高,我們可以編寫程式來模擬實際用戶,一般網站不會察覺到我們到底是程式還是人類,而這個「真實瀏覽器」也會誠實地下載所有圖檔、執行所有 JavaScript,看起來和一般使用者無異,故此用來刮取資料也十分方便。

實際例子:社交媒體刮取

在最近的社運風波,大家都認同社交媒體具龐大影響力,眾人都希望監察著這些社交平台。但在 Cambridge Analytica 事件 (https://en.wikipedia.org/wiki/Facebook%E2%80%93Cambridge_Analytica_data_scandal) 發生以後,縱然一般用家仍然能在瀏覽器看到例如 Likes 數量、嬲嬲數量等資訊,利用程式去刮取 Facebook 的資訊卻變得困難,大部份的資訊已經再沒有公開的方法讓我們刮取。

但既然資訊能夠在瀏覽器中看得到,我們便可以用 Puppeteer 去刮取。

例如需要刮取某議員最近的嬲嬲數目,來衡量他/她最近的發言有否惹來迴響,普通用戶透過 Graph API 是拿不到 Likes 的數據,於是,我們便可以寫一個 Puppeteer 的 JavaScript,自動打開 Facebook 刮取下來。

當第一個 JavaScript 寫好後,我們可以利用同樣的 Script 去不同的 Facebook Page 刮取作分析,來看看我們的特首最近的 Facebook 迴響:

carrielam-fb.png

啊,看來她在五月後都沒有閒情逸致寫任何文章,所以,大部份嬲嬲都積壓在最後的 post,人氣更遠超某議員!假若配合 AWS Lambda,更可以為她作一個嬲嬲趨勢圖啊!

了解更多

由於網頁刮取應對的主要也是網站,如欲掌握好網頁刮取的技巧,不但需要編程知識,所以也要好好掌握 HTML 和 CSS。亦由於網站中的編程語言就是 JavaScript,而學習 JavaScript 也比學習 Python 有優勢,讓初學者很快便能夠理解目標網站的運作原理。

希望自學的話,可以先到 freecodecamp.org 學習基本的 HTML、CSS 和 JavaScript。然後再到 https://github.com/GoogleChrome/puppeteer 嘗試作一些簡單刮取實作,先針對一些簡單網站(如天文台、Yahoo! 財經)作練習,然後才挑戰高難度網站(如 Facebook、Google)

若然想快速上手,可以考慮 Tecky Academy 的中級大數據課程,不但包括 Puppeteer 的教學,更有其他針對不同類型網站的刮取方法,專人親身教學,同學們也可以即場詢問各種刮取和大數據相關疑難,適合初學者在短時間上手網頁刮取,查看更多: https://tecky.io/zh_Hant/courses/IBD/

留言

延伸閱讀

非結構化數據

做個精明消費者 : Python 簡單數據科學日常應用例子

Web Technology為何征服世界?

Online Course不能承受之輕