前言
目前網路上能查詢到 Dcard 爬蟲的文章,幾乎都是使用www.dcard.tw/_api/
這個 API 來抓取。
最近透過開發者工具到發現好像還有 2.0 版本的 API,網路上搜尋不太到什麼資料,不知道是否近期才出來的。
整理
說明 | 請求方法 | 路徑 |
---|---|---|
全部文章 | GET | /posts |
看板資訊 | GET | /forums |
看板內文章列表 | GET | /forums/{看板名稱}/posts |
文章內文 | GET | /posts/{文章ID} |
文章內引用連結 | GET | /posts/{文章ID}/links |
文章內留言 | GET | /posts/{文章ID}/comments |
全部皆回傳 JSON 格式資料。
* 舊版的只有在 API 網址上不同,其餘的路徑、方法、回傳資料目前觀察起來都一模一樣。
舊版 API 網址:https://www.dcard.tw/_api
API 說明
全部文章
取得不分類全部文章,等同於抓取 https://www.dcard.tw/f
頁面內文章資訊。
預設使用 "最新" 作為排序,透過popular
參數可以切換 "最新" 與 "熱門",如下:
最新文章 -> https://www.dcard.tw/service/api/v2/posts?popular=false
熱門文章 -> https://www.dcard.tw/service/api/v2/posts?popular=true
* 但不知為何,有時候不加上參數,資料出來卻不是最新的,還是建議加上popular=false
參數較準確。
回傳的文章數量預設是前 30 筆,加上limit
參數來限制文章數量,最多 100 筆,如下:
熱門文章前 100 筆 -> https://www.dcard.tw/service/api/v2/posts?popular=true&limit=100
要取得超過 100 筆文章的方式是加上before
參數,例如前一次的路徑是
https://www.dcard.tw/service/api/v2/posts?popular=true
而從回傳的資料中,取得最後一筆其id
是234267056
,因此下一頁的路徑即是
https://www.dcard.tw/service/api/v2/posts?popular=true&before=234267056
文章網址可透過 https://www.dcard.tw/f/{forumAlias}/p/{id}
組合取得。
看板資訊
抓取目前 Dcard 上所有的看板資訊 (包括隱藏的看板!!)。
看板網址可透過 https://www.dcard.tw/f/{alias}
組合取得。
看板內文章列表
取得指定看板內的文章,等同於抓取 https://www.dcard.tw/f/{看板名稱}
頁面內文章資訊。
預設使用 "最新" 作為排序,透過popular
參數可以切換 "最新" 與 "熱門"。
回傳的文章數量預設是前 30 筆,加上limit
參數來限制文章數量,最多 100 筆,
而取得下一頁的方式一樣是加上before
參數。
文章網址可透過 https://www.dcard.tw/f/{forumAlias}/p/{id}
組合取得。
文章內文
取得指定文章的資訊,等同於抓取 https://www.dcard.tw/f/{看板名稱}/p/{文章ID}
頁面內文章資訊。
有些資訊在文章列表就能抓取到了,但像是"文章完整內容"等資料就需要到此路徑取得。
文章內引用連結
取得指定文章內的引用連結,如下圖所示。
文章內留言
取得指定文章內的留言。
預設使用 "由舊到新(樓層)" 作為排序,透過popular
參數可以切換 "由舊到新" 與 "熱門"。
回傳的文章數量預設是前 30 筆,加上limit
參數來限制文章數量,最多 100 筆 (熱門回應只取前3筆),
而取得下一頁的方式不太一樣,是加上after
參數(樓層),,例如前一次的路徑是
https://www.dcard.tw/service/api/v2/posts/234266517/comments
而從回傳的資料中,取得最後一筆其floor
(樓層)是30
,因此下一頁的路徑即是
https://www.dcard.tw/service/api/v2/posts/234266517/comments?after=30
問題
1. Token is expired. Please refresh the token.
在用瀏覽器測試時,可能會遇到回應 {"error":2007,"message":"Token is expired. Please refresh the token."}
,此時只要用無痕模式開啟,或打開 Dcard網頁 讓他更新Token,即可解決。
(不確定是 2.0 版本多出的機制,還是原本舊 API 就有了)
2. 請求回傳 403 error (* 2021/01/21 新增)
發現抓不到資料,請求的回傳狀態是 403,但使用瀏覽器卻可以正常取得資料,而且就算 Headers
帶一樣也沒辦法。
將回傳的資料儲存成 html 網頁檔查看:
主要是因為 Dcard 使用了 Cloudflare 的驗證,會需要經過渲染 JavaScript 才能進入。
有幾種方式可以解決,改使用 Selenium、Pyppeteer 來模擬瀏覽器操作,或者使用 cloudscraper 專門就是要拿來繞過 Cloudflare 頁面的套件,而且它是建立在 Requests 之上,因此幾乎不用修改程式碼。
如有遇到問題或文章內容有誤,歡迎底下留言告知,感謝~🙂
參考:
Dccard 爬蟲,透過官方API
#99 串接 Dcard API,模仿開發 Dcard App
有一天,或許你會發現,最感動的不是你完成了,
而是你終於鼓起勇氣開始。—— Peter Su
🔻 如果覺得喜歡,歡迎在下方獎勵我 5 個讚~