最近有一個想法需要收集一些粉絲專頁公開貼文資料,上網查了一下有現成的code!用了發現有些問題,還有我要補抓的東西,想想改寫的code也分享出來。簡單來說呢,主體是用selenium(自動化測試工具)以一個webdriver瀏覽器假裝是真人在看,然後用BeautifulSoup(漂亮湯)html tag解析工具,找到要存的資料。 先說為什麼不用facebook graph api抓取?因為現在連公開內容抓取也需要送審應用程式(上圖),一直還沒搞懂/去走一遍流程(抓取自己粉絲頁的數據從2017年開始每天跑都還活著,也多了點偷懶的理由…) 引入套件 在一開始提過了,這次的重點是前三項。selenium、webdriver、BeautifulSoup。 selenium的設定 driver這個地方,在開始前需要去下載一個真的webdriver回來,並且要跟目前使用的瀏覽器是相同版本,例如,你要模擬Chrome的使用狀況,就要找Chrome相同版本。 Chrome Webdriver下載:上網Google吧 。我下載後放在專案的資料夾裡,以指定路徑的方式打開,加到環境變數也是一種方法。 如果要把程式部署到雲端主機就有另外的設定方法,我有部署到Heroku過,也是東找範例西找解方做出來,下次再整理出來。 這段執行完,瀏覽器就會打開了,如果要手動以帳號密碼登入也是可以的。這裡輸入的是m.facebook.com的版本喔! 抓取內容 while迴圈就是讓它一直執行,我是大概估算一個數量(結果太多)。原本找到的案例是去判斷最後一則貼文的時間,很精準。但是我後來改抓手機版網頁,取到的日期資料是文字,沒時間做轉換,就暴力開下去了。 觸發頁面loading更多貼文,這是參考案例來的code,就是讓瀏覽器執行捲動到最下面,我貪心一點點,捲動頁面兩次再抓資料(中間間隔幾秒,讓資料load完)。 接下來是去看html tag的步驟。比較難抓的是,class name、id都沒什麼識別意義,包的div又很多很雜,所以會有 .find().find().find_next_siblings() 這種兩、三步驟的定位方法。 有另外一個問題是,不是所有貼文類型都是一樣的html寫法,像是更新大頭貼照、直播,樣態好像就不一樣。因為趕著抓完
這次總統大選以即時開票為主軸的開票圖表 這次大選資料整理,個人做得比較不激情(跟其他家相比應該是太不認真&深入),但還是記錄一筆資料整理的方式。實際成品: 總統大選即時開票|中央社媒體實驗室 不搶快、不灌票,「2020總統立委大選」中央社帶你掌握最正確的即時開票結果。 www.cna.com.tw 真的!不搶快、沒灌票,這次嘗試的是: 1. 接到中選會的資料 2. 比對選區資料、參選人號次資料 3. 產出圖表需要的json 4. 丟上雲端供前端工程師吃吃 操作與程式流程 這一次大部分的程式都在python裡,考量是因為中選會三分鐘會更新一次資料,如果跟 九合一選舉一樣大多用Spreadsheet當作編輯的中間層的話 ,怕更新速度不夠快(python寫資料進Spreadsheet的API速度很慢),所以這次比對資料不是用Spreadsheet公式,用python pandas處理對表與篩選。 中選會資料 要即時資料要跟中選會申請,過了會得到一個程式跟帳密,打開以後每三分鐘就會存一個json到本機。 json資料處理 json到手以後,是要對什麼呢?舉雙帥對決的中山北松山為例,中選會的資料裡這區參選人得票記在這個list裡,沒有人名、沒有黨籍: [{'candNo': 1, 'tks': 5730, 'candVictor': ' ', 'tksRate': 2.6133}, {'candNo': 2, 'tks': 99539, 'candVictor': ' ', 'tksRate': 45.3973}, {'candNo': 3, 'tks': 1209, 'candVictor': ' ', 'tksRate': 0.5514}, {'candNo': 4, 'tks': 112784, 'candVictor': '