🕷️ Facebook 貼文爬蟲撰寫實務 (Graph API 應用)
由於 Facebook 嚴格限制網頁爬蟲(Web Scraping),撰寫 Facebook 貼文爬蟲的主要實務是透過 Graph API 來存取資料。
1. ⚙️ 準備工作與權限設定
這是確保你的爬蟲能夠合法且有效地運作的基礎。
📌 步驟詳解
註冊 Meta 開發者帳號: 在 Meta 開發者平台 (Meta for Developers) 上建立帳號,並創建一個新的應用程式(App)。
設定應用程式類型與權限: 選擇符合你需求的應用程式類型(例如:商業或消費者)。對於貼文爬蟲,你通常需要存取粉絲專頁 (Pages) 資料。
取得存取權杖 (Access Token):
使用者存取權杖: 透過 OAuth 流程取得,用於代表你個人或測試用戶來存取資料。這是獲取粉絲專頁資料的起點。
粉絲專頁存取權杖 (Page Access Token): 用戶存取權杖可以交換為長效期的粉絲專頁權杖。這是爬取特定粉絲專頁貼文所必需的。
所需權限 (Permissions): 至少需要
pages_read_engagement和pages_show_list權限才能列出並讀取粉絲專頁的貼文。
2. 📡 呼叫 Graph API 獲取貼文資料
使用 Graph API 進行數據獲取的流程是基於 節點 (Node) 和 邊緣 (Edge) 的概念。
📌 步驟詳解
構造 API 請求 URL: API 請求是標準的 HTTP GET 請求,格式為:
https://graph.facebook.com/vXX.0/{node_id}/{edge}?fields={fields}&access_token={token}指定節點 (Node): 你希望爬取的目標,通常是粉絲專頁的 Page ID(例如:
20531316728)。指定邊緣 (Edge): 你想從該節點獲取的資料類型,例如
/posts(貼文) 或/feed(貼文及其他動作)。指定欄位 (Fields): 這是優化爬取效率的關鍵。使用
fields參數來精確指定你需要的資料欄位,例如:message, created_time, likes.summary(true), comments.summary(true)。處理分頁 (Pagination): Facebook API 預設只會回傳固定數量的結果(通常是 25 筆)。如果想獲取更多,需要使用回應中包含的
next欄位 URL 進行下一頁的請求,直到paging區塊不再包含nextURL 為止。
💡 案例分析 (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 月份)發佈的貼文。
細節講解:
時間參數: 使用
since和until參數來過濾結果。時間值需要是 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 爬蟲案例,並條列式講解其細節:
如何獲取粉絲專頁的貼文圖片(Picture)的 URL 和貼文的 總反應數(
reactions.summary(true))。撰寫一個爬蟲步驟,用於判斷一則貼文是否為 廣告贊助貼文(Promoted Post),並說明需要哪些欄位來識別。
設計一個爬蟲流程,用於獲取超過 1000 則貼文的數據,並詳細說明如何處理 分頁 (Pagination) 邏輯。
留言
張貼留言