請啟用JavaScript來查看內容

爬蟲 Dcard API 2.0 版本?!

    前言

    目前網路上能查詢到 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
    而從回傳的資料中,取得最後一筆其id234267056,因此下一頁的路徑即是
    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 網頁檔查看:

    403錯誤
    403錯誤

    主要是因為 Dcard 使用了 Cloudflare 的驗證,會需要經過渲染 JavaScript 才能進入。

    有幾種方式可以解決,改使用 SeleniumPyppeteer 來模擬瀏覽器操作,或者使用 cloudscraper 專門就是要拿來繞過 Cloudflare 頁面的套件,而且它是建立在 Requests 之上,因此幾乎不用修改程式碼。




    如有遇到問題或文章內容有誤,歡迎底下留言告知,感謝~🙂


    參考:
    Dccard 爬蟲,透過官方API
    #99 串接 Dcard API,模仿開發 Dcard App


    有一天,或許你會發現,最感動的不是你完成了,
    而是你終於鼓起勇氣開始。

    —— Peter Su


    🔻 如果覺得喜歡,歡迎在下方獎勵我 5 個讚~
    分享

    Jia
    作者
    Jia
    軟體工程師