kpman | code

聽到網路爬蟲,有很多專案都是建立在 python 上面,在文字處理分析上, python 有很強大的套件可以使用,然而隨著 node.js 的發展越來越廣泛,也有許多因應的套件產生,今天將會介紹利用 FB 提供的 Graph API 來爬留言版。

Facebook Comment Plugin

本文並非會有教學範例檔,僅會針對 FB 提供的 Graph API 做簡單的範例。 此處的範例會利用 ES6 的 template strings 語法。

1. 了解 FB 留言版架構

最近 FB 推出了可以回覆他人的功能,因此留言有可能會有巢狀情形,但可以觀察到的是,目前 FB 的機制就是至多一層的回覆。因此簡單的架構如下:

comment 1
  - reply_comment 1
  - reply_comment 2
comment 2
  - reply_comment 1
  _ reply_comment 2
...
...

2. 確定該網址的留言數

`http://graph.facebook.com/?id=${URL}`;
GET 'http://graph.facebook.com/?id=http://www.google.com'
{
  id: "http://www.google.com",
  shares: 31205003,
  comments: 1323
}

因此可以知道 www.google.com 在 FB Graph API 有 1323 筆留言數。

3. 利用 Graph API 拿第一層留言

Graph API 在留言版其實是公開,只要給定 URL 就可以拿到該網址的留言, 這邊要注意的是需要確定該 URL 是 OG:URL 的參數給 FB 才拿的到。

`http://graph.facebook.com/comments?id=${URL}&limit=${comments}&filter=stream`;

底下是 return sample json

{
  created_time: "2012-04-16T12:45:03+0000",
  from: {
    name: "Sunil Maheshwari",
    id: "100000525493028"
  },
  message: "hello",
  can_remove: false,
  like_count: 0,
  user_likes: false,
  id: "381702034999_21746175"
}

若此處沒有加上 &limit 的話,會拿到比較少的數量。 加上 &filter=stream 參數,則會一併將回覆狀態的留言拿回來。 因為在此記錄部落格使用,在實作上並不會加上 &filter=stream 這個參數,以免拿第二層的時候重複還需要做額外處理。

4. 拿 Graph API 第二層留言

在拿第一層的時候,因為是 public API 狀態,因此不需要 token,且網址利用 http 就可以。 但在拿第二層留言,就需要 https + access_token 狀態。

最簡單取得 access_token 方式是到 FB graph explorer 申請 access_token 來實作。

接著需要串接的 API 格式為:

`https://graph.facebook.com/${id}/comments?access_token=${token}`;

上述 id 就是第一層拿回來的 json 格式內的 id, token 則是 access_token。

在實作上因為無法透過第一層的 API 得到是否有無第二層留言,因此若要完整的拿取全部的留言,則需要將全部的 id 跑過一次才可以得到完整的結果。

reference