🕷️ Facebook 貼文爬蟲撰寫實務~邱允文

 

🕷️ Facebook 貼文爬蟲撰寫實務 (Graph API 應用)

由於 Facebook 嚴格限制網頁爬蟲(Web Scraping),撰寫 Facebook 貼文爬蟲的主要實務是透過 Graph API 來存取資料。

1. ⚙️ 準備工作與權限設定

這是確保你的爬蟲能夠合法且有效地運作的基礎。

📌 步驟詳解

  1. 註冊 Meta 開發者帳號: 在 Meta 開發者平台 (Meta for Developers) 上建立帳號,並創建一個新的應用程式(App)。

  2. 設定應用程式類型與權限: 選擇符合你需求的應用程式類型(例如:商業或消費者)。對於貼文爬蟲,你通常需要存取粉絲專頁 (Pages) 資料。

  3. 取得存取權杖 (Access Token):

    • 使用者存取權杖: 透過 OAuth 流程取得,用於代表你個人或測試用戶來存取資料。這是獲取粉絲專頁資料的起點。

    • 粉絲專頁存取權杖 (Page Access Token): 用戶存取權杖可以交換為長效期的粉絲專頁權杖。這是爬取特定粉絲專頁貼文所必需的。

    • 所需權限 (Permissions): 至少需要 pages_read_engagementpages_show_list 權限才能列出並讀取粉絲專頁的貼文。

2. 📡 呼叫 Graph API 獲取貼文資料

使用 Graph API 進行數據獲取的流程是基於 節點 (Node)邊緣 (Edge) 的概念。

📌 步驟詳解

  1. 構造 API 請求 URL: API 請求是標準的 HTTP GET 請求,格式為: https://graph.facebook.com/vXX.0/{node_id}/{edge}?fields={fields}&access_token={token}

  2. 指定節點 (Node): 你希望爬取的目標,通常是粉絲專頁的 Page ID(例如:20531316728)。

  3. 指定邊緣 (Edge): 你想從該節點獲取的資料類型,例如 /posts (貼文) 或 /feed (貼文及其他動作)。

  4. 指定欄位 (Fields): 這是優化爬取效率的關鍵。使用 fields 參數來精確指定你需要的資料欄位,例如:message, created_time, likes.summary(true), comments.summary(true)

  5. 處理分頁 (Pagination): Facebook API 預設只會回傳固定數量的結果(通常是 25 筆)。如果想獲取更多,需要使用回應中包含的 next 欄位 URL 進行下一頁的請求,直到 paging 區塊不再包含 next URL 為止。

💡 案例分析 (3 個)

案例 1:爬取粉絲專頁的基本貼文內容和互動數

  • 目的: 獲取特定粉絲專頁最近的貼文內容、發佈時間和總按讚數。

  • 細節講解:

    • 節點與邊緣: 使用粉絲專頁 ID 作為節點,/posts 作為邊緣。

    • 指定欄位: 使用 fields=message, created_time, likes.summary(true)likes.summary(true) 會返回總的按讚數,而不是所有按讚使用者的列表,這有助於簡化數據。

    • 權杖: 使用粉絲專頁存取權杖

  • API 呼叫範例(概念):

    GET https://graph.facebook.com/v19.0/{PAGE_ID}/posts?fields=message,created_time,likes.summary(true)&access_token={PAGE_ACCESS_TOKEN}
    

2. 爬取貼文並深入獲取留言內容

  • 目的: 獲取某粉絲專頁貼文的內容,以及每則貼文下最新的 10 則留言的內容和留言者。

  • 細節講解:

    • 巢狀欄位: comments 邊緣可以作為一個欄位嵌入到 posts 請求中。使用 comments.limit(10){message, from} 來指定只獲取 10 則留言,並指定留言的內容 (message) 和來源 (from)。

    • 數據量考量: 巢狀請求會大幅增加回傳數據量和處理複雜度,需謹慎使用 limit 參數。

    • 權杖: 仍需使用粉絲專頁存取權杖

  • API 呼叫範例(概念):

    GET https://graph.facebook.com/v19.0/{PAGE_ID}/posts?fields=message,created_time,comments.limit(10){message,from}&access_token={PAGE_ACCESS_TOKEN}
    

3. 根據時間範圍爬取歷史貼文

  • 目的: 只獲取在特定時間範圍內(例如 2024 年 1 月份)發佈的貼文。

  • 細節講解:

    • 時間參數: 使用 sinceuntil 參數來過濾結果。時間值需要是 Unix Time (時間戳記) 或 ISO 8601 格式。

    • 分頁與排序: 即使使用時間過濾,結果仍會分頁。你必須繼續追蹤 next 連結直到所有符合時間範圍的資料都獲取完畢。

    • 效率: 這是比純粹分頁更有效率的爬取歷史資料的方法。

  • API 呼叫範例(概念):

    # 假設這是 2024-01-01 和 2024-02-01 的時間戳
    SINCE_TIME = 1704067200 
    UNTIL_TIME = 1706745600
    GET https://graph.facebook.com/v19.0/{PAGE_ID}/posts?since=1704067200&until=1706745600&fields=message&access_token={PAGE_ACCESS_TOKEN}
    

💡 提示詞 (Prompt) 範例

Prompt 範例:

Facebook 貼文爬蟲實務

請生成三個獨立的 Facebook Graph API 爬蟲案例,並條列式講解其細節:

  1. 如何獲取粉絲專頁的貼文圖片(Picture)的 URL 和貼文的 總反應數reactions.summary(true))。

  2. 撰寫一個爬蟲步驟,用於判斷一則貼文是否為 廣告贊助貼文(Promoted Post),並說明需要哪些欄位來識別。

  3. 設計一個爬蟲流程,用於獲取超過 1000 則貼文的數據,並詳細說明如何處理 分頁 (Pagination) 邏輯。

留言