爬取Dcard文章(附程式碼)
前言
由於我們每天可以接觸到的資料量越來越龐大,可以分配給一個資料(文章、影片或是圖片⋯⋯等)的時間變得越來越少。這時候,能夠在第一眼就抓住讀者的目光就變得非常重要。
因此本系列的兩篇文章將分別帶大家暸解
- 如何爬取Dcard上的文章
- 如何進行資料清理及製作文字雲
內文
為什麼是Dcard
可能會有讀者好奇為什麼是以Dcard作為本次的主題,雖然我本身比較喜歡使用PTT,但PTT在前幾年皆不開放註冊新帳號再加上Dcard的使用者大幅上升的情況下,Dcard已漸漸取代PTT成為大學生及年輕族群的主要網路論壇,因此這次就以Dcard作為爬取目標。
了解動態網頁
在知道為何選擇Dcard後我們就可以開始動手寫code了!但在這之前,大家要先暸解Dcard的網頁運作原理,大家可以從以下兩部影片看看能否感受到區別。
兩者主要的差別在於「網頁移動到下一頁的變化」,PTT方面會產生一個新的網址,但是Dcard的網址並不會產生變化,而是在同一個網址下產生更多的文章讓讀者們閱讀,因此我們稱前者為「靜態爬蟲」,後者為「動態爬蟲」;另一個簡單判斷的方式則是不斷下滑網頁,如果有發生小小的卡頓並產生新資料,則大部分屬於動態爬蟲的範疇。
遇到動態網頁怎麼辦
大部分人應該都對於靜態爬蟲有了解,本文就不贅述,將重點放在動態爬蟲,遇到動態爬蟲我有兩種常用的方式:
- 使用selenium
- 使用API
因為Dcard官方就有提供API,所以這次就用API的方式進行實作,Dcard的API上網即可查到,但這邊也教讀者們如何去抓API,以後遇到陌生的動態網站也可以試著自己抓抓看!
做法可以分成幾個步驟:
- 在Chrome設定中點開更多工具中的開發者工具,點選最上排的Network
- 按F4重新整理
- 開始將網頁下滑至產生新資料,並且去檢查Name中的資料,可以使用Preview去暸解電腦要求的資料回傳是怎麽樣,覺得有可能的就點開Request URL來看看
剛開始查找都會花一點時間,但長久下來就會了解大概的規律是如何。
當我們點開API之後可以發現,它是將資料包裝成JSON格式,如果你希望看到的JSON格式可以跟我的一樣整齊,可以下載Chrom外掛套件json viewr。
可以看到API提供我們很多資料,像是Title、內文、標籤⋯⋯等,但遠不止如此,就等讀者們自行深挖了!
解析API網址的結構
https://www.dcard.tw/service/api/v2/forums/nccu/posts?limit=30&before=237095724
這是我剛剛所找到的API網址,可以將它簡單拆成三個部分:
- 從頭一直到/nccu:nccu代表的是看板的名稱,所以若是想要找不同看板的資料就可以從這邊下手
- /posts?limit=30:posts代表的是貼文,limit則是說明顯示30篇文章,上限為100篇
- &before=237095724:這是在說明上一輪的30篇中最後一篇的文章id
碰到的問題
被Dcard阻擋:這大概是所有爬蟲的惡夢,因為我原本連留言也想要一起爬導致我很容易被認為是惡意攻擊,目前Dcard使用的驗證系統(不確定確切來說是什麼)是CAPTCHA2,上網查過資料解決方法大致上有兩種:
- 使用代理IP
- 使用CloudScraper繞過驗證
目前只有使用過免費的代理IP,但是因為是免費的所以很多都不能使用,CloudScraper則是沒有使用過。
後來使用的做法就是使用time模組來設定間隔時間!
成果
在所附的程式碼中仍有保留爬渠留言資料的部分(65–80行),若是不需要的話可以自行去除,在下篇文章則會講解如何資料處理及製做文字雲,那我們下次見!
註解:
程式碼中47行設定小於3,再者我在43行將limit設定為100,因此可以抓取最熱門的300篇貼文,如果讀者想抓取其他數目的篇數可以更改這兩個地方達到想要的效果