R軟體擷取分析臉書Facebook粉絲專頁資料R_Facebook_crawler_text_mining_Rstudio

619px-R_logo.svg大數據方法應用於社會科學研究正方興未艾,尤其社群媒體應用普及,產生大量的訊息與行為,猶如資料大海,更讓眾多研究者想透過資料擷取一探究竟。Facebook目前仍是台灣地區民眾使用率最高的社群媒體,而可同時處理資料擷取、存取、分析的軟體或應用程式當中,R語言免費、下載安裝容易的特性,近來似乎人氣最高。本文即以Facebook的粉絲專頁(fanpage)為例,簡單介紹透過R語言套件(packages)擷取資料的步驟與方法。

一、安裝R軟體與R編輯器(RStudio)

R的執行除了常見的圖形使用者介面(Graphical User Interface, GUI)外,近來免費版本的R編輯器(RStudio),整合了R在控制、編輯、執行等功能,讓使用更加便利。有關R與RStudio的安裝,請參閱前文:R軟體_RStudio編輯器安裝設定:基本操作說明

二、取得Facebook權限

臉書的【開發人員支援】(facebook for developer)頁面,顧名思義,就是提供給各種網路與程式相關開發人員作業的區域,只要擁有個人臉書帳號,可以透過特定的權限,執行有限度的指令。想擷取臉書的資料,必須透過Facebook Graph API,API是【應用程式介面】(Application Programming Interface)的簡稱,是一種約定的程式碼,用來銜接軟體系統不同的部分,減少軟體開發所需的人力、物力與時間。但是在使用Facebook Graph API之前,亦須通過臉書的申請認證,區分兩種:

(一)臨時存取權杖(Token):此處的Token(Access Token)即指用戶權限的安全憑證,透過Token的取得才可以進行後續的指令。臉書Token的申請認證方法,請參閱前文:臉書facebook可以說的秘密_社群大數據_網路爬文_social Big data_crawler請注意:Token的效力只有兩小時,過期必須重新載入來產生新的Token。

(二)Facebook APP:Facebook APP的APP ID與APP Secret就是長期可以使用的認證碼(除非臉書大幅更換API版本)。取得APP ID與APP Secret的方式如下:

Step 1

以個人帳號登入臉書,前往 facebook for developers 的頁面,點選「開始註冊」、「建立應用程式編號」。

facebook_developer_02


Step 2 

在空格處填入自行設定的應用程式名稱,以及連繫用的信箱(通常預設為臉書登記用的信箱,亦可更換),再點選「建立應用程式編號」。

facebook_developer_03


Step 3

通過安全驗證後,進入個人應用程式的主頁面,再點選右上角「我的應用程式」選單,下拉至「新增應用程式」。

facebook_developer_03-1

facebook_developer_05


Step 4 

點選「網站」圖示,進入個人應用程式「主控板」,上面會顯示「應用程式編號」(ID)、「應用程式密鑰」(Secret),「應用程式密鑰」預設為不可視,請點選旁邊的「顯示」按鈕即可出現密碼。旁邊的ID與Secret的密碼,建議複製貼上到記事本檔案,因為在後面的程序,必須將此兩者貼在R語法當中,才能執行認證的工作。

facebook_developer_08

facebook_developer_06


三、安裝Rfacebook套件

除了在R的官網可下載Rfacebook以外,亦可至Rfacebook在GitHub的載點下載(版本更新速度較快)。請開啟RStudio,RStudio作業視窗區分四個區域(一般會預設成三個區域),以下的語法,請鍵入(或複製貼上)於左側(四個區域時則為左下方)的Console作業區。

(一)從R官網CRAN安裝,語法如下:

install.packages("Rfacebook")

(二)從GitHub的載點安裝:

1、首先要安裝"devtools"這個套件,語法如下:

install.packages("devtools")
library(devtools)

2、透過GitHub下載Rfacebook,語法如下:

install_github("Rfacebook", "pablobarbera", subdir="Rfacebook")
library(Rfacebook)

四、Rfacebook認證

(一)使用存取權杖(Token):

1、前往 Graph API 測試工具頁面,會自動產生一個存取權杖(Token),複製貼到R語法token變數當中,語法如下:

facebook_developer_003

token <- "ZAQ1XSW2*****************"        #請複製貼上您的Token

2、測試存取權杖Token認證情形,語法如下:

me <- getUsers("me", token, private_info = TRUE)
me$name

[1] “XXX"                            #認證成功會出現您的臉書帳號

(二)使用Facebook應用程式:

1、使用fbOAuth函數,輸入應用程式編號(ID)和應用程式密鑰(Secret)後執行,可得到長效期的存取權杖,亦可存檔後長期重複使用,語法如下:

require("Rfacebook")
fb.oauth <- fbOAuth(
  app_id="*************",               #請複製貼上應用程式編號(ID數字)
  app_secret="***********************", #請複製貼上應用程式密鑰(Secret數字)
  extended_permissions = TRUE)

執行後RStudio會出現以下字樣:

Copy and paste into Site URL on Facebook App Settings: http://localhost:1410/
When done, press any key to continue…

2、把http://localhost:1410/複製起來,回到facebook for developers 的頁面,在右上方「我的應用程式」拉下選單,點選進入剛才已設定好的應用程式主畫面,點選左側的「設定」,按下「新增平台」,選擇「網站」,再將剛才複製起來的http://localhost:1410/,貼在「網站網址」的空白處,接著請按下【變更儲存】、【立即開始】。隨後,畫面會轉跳至【Quick Star for 網站】,請往下瀏覽,找到【Tell us about your website】,您將看見【Site URL】底下空白欄位,請貼上:http://localhost:1410/,再按下【next】。

facebook_developer_11

facebook_developer_19

facebook_developer_09


3、請回到R-Studio操作視窗,依據指示按下任意鍵,認證過程與完成後將會出現以下字樣:

Waiting for authentication in browser…
Press Esc/Ctrl + C to abort
Authentication complete.
Authentication successful.

facebook_developer_10

4、完成認證後,會自動跳出認證完成可關閉此頁的一個視窗,僅需直接關閉即可,如下圖:

facebook_developer_14


3、測試認證結果:認證完成後可測試能否抓到您自己的臉書帳號,語法如下:

me <- getUsers("me",token=fb.oauth)
me$name

[1] “XXX"                            #認證成功會出現您的臉書帳號

4、若可出現您的臉書帳號,表示功能正常,將此Token儲存起來,語法如下:

save(fb.oauth, file="fb_oauth")

5、若需使用此Token,僅需叫出檔案即可,語法如下:

load("fb_oauth")

五、使用Rfacebook擷取粉絲專頁資料

(一)查詢臉書粉絲專頁ID:使用Rfacebook擷取臉書任何資料均需使用臉書帳號的ID,查詢方法為前往 facebook for developers 的頁面,點選最上方的「工具及支援」,進入後點選「圖形API測試工具」,再找到您想擷取資料的粉絲專頁網址,以「玄大新聞」為例,其網址為:

https://www.facebook.com/hcunews/,把其中的hcunews複製起來,覆蓋貼在?fields之前,再按下「提交」,即可看到所欲查詢的臉書粉絲專頁名稱與帳號ID。

facebook_developer_20

facebook_developer_12

facebook_developer_13


(二)擷取粉絲專頁資料:

1、此處預計擷取「玄大新聞」臉書粉絲專頁最新10篇貼文,語法如下:

page.id <- "1738563996468413" 
page <- getPage(page.id, token=fb.oauth, n = 10)
str(page)

2、擷取完成後,請點選右上方Global Evvironment視窗Data項後方的格狀圖案,即可在左上方Source視窗檢視所擷取下來的資料。

facebook_developer_21

(三)儲存與轉換資料:

1、透過Rfacebook擷取下來的「玄大新聞」臉書粉絲專頁最新10篇貼文,必須再加以設定儲存路徑,將RStudio上方的Session選單下拉,進入Set Working Directory → Choose Directory,再選擇檔案存取的位置。

facebook_developer_18

2、若以手動鍵入,語法如下:

setwd("~/R")         #""引號內的位置可依個人需要自行設定

3、將所擷取的「玄大新聞」臉書粉絲專頁最新10篇貼文轉存成.csv檔案,語法如下:

write.csv(page,"page.csv",row.names = FALSE)  #""引號內的檔名可自行設定

4、轉存成csv檔案後,可使用Excel打開,再加以調整欄列,大功告成!

facebook_developer_15

facebook_developer_16


看到這裡,您可能感覺有些複雜,臉書做為世界數一數二的社群媒體龍頭,在個人隱私、個資保護、資料存取的認證等,確實多了許多手續。然而,臉書上面仍有相當多元類型的資料可供研究運用,限於篇幅,後續將逐次介紹。

參考資料 & 延伸閱讀

GTW的「使用R分析Facebook社群網路教學」。

Data Man的資料視覺化筆記」。

對「R軟體擷取分析臉書Facebook粉絲專頁資料R_Facebook_crawler_text_mining_Rstudio」的想法

  1. 跑測試認證結果的時候出現下列錯誤
    callAPI(url = url, token = token) :
    An access token is required to request this resource.

    請問是哪個步驟有錯誤呢?

    • 哈囉!懶人,臉書API認證語法:
      require(“Rfacebook")
      fb.oauth <- fbOAuth(
      app_id="此處請複製貼上應用程式編號(ID的數字)",
      app_secret="此處請複製貼上應用程式密鑰(Secret數字)",
      extended_permissions = TRUE)
      請檢查一下您是否有地方貼錯,特別是" "引號絕不可少,且引號內的ID和Secret的數字必須填寫正確,再請您仔細核對,謝謝您!

    • 哈囉!Ken:Rfacebook套件必須透過facebook的臨時權杖(token)或APPSecret的連結,才能抓取到資料。目前facebook對於token與APPSecret的存取資料權限開放程度,除了自己的帳號以外,只要是【公開】的頁面,例如粉絲團(一定是公開性質)、公開的社團,都可以抓取資料;但【非公開】的頁面,例如非公開社團(只有會員才看得到內容),就無法抓取資料;此外,別人的帳號,目前也已無法透過程式抓取資料了(以前可以),提供您參考。

  2. 你好Stanley老師,想請教你「四、Rfacebook認證」的相關問題。我在「使用fbOAuth函數,輸入應用程式編號(ID)和應用程式密鑰(Secret)後執行」,且「把http://localhost:1410/複製起來,回到facebook for developers 的頁面」後,卻是出現:

    「Waiting for authentication in browser…
    Press Esc/Ctrl + C to abort
    Authentication complete.
    Error in oauth2.0_access_token(endpoint, app, code = code, user_params = user_params, :
    Bad Request (HTTP 400). Failed to get an access token.」

    不太了解,為何沒有出現「Authentication successful.」,但是瀏覽器的頁面,一開始是跳出「錯誤」視窗,但接續也出現了「Authentication complete. Please close this page and return to R.」的字句,甚至也認證成功會出現我的臉書帳號了。

    在此卡關了一整天,希望Stanley老師協助說明,感謝你!

  3. 您好,非常感謝您的分享,看了您的文章後也嘗試利用R將fb資料抓下來,但過程中發現了ㄧ些問題,爬下來內容中文無法正常呈現,但好像也不是亂碼,而是出現類似「#…」的內容(下附有錯誤畫面聯結),上網爬文還沒找到答案,試著改變encoding但也沒有用..請問您知道問題可能出在哪裡,以及該如何解決嗎?非常謝謝您!!

    【錯誤畫面聯結】
    https://drive.google.com/file/d/0BxTcBeT0awRGNmZiRzhDbjZwVEk/view?usp=sharing

    • 哈囉!jiajia您好:您的狀況應該是R-Studio的資料編碼問題,請您打開R-Studio以後,
      一、點選最上面Tools選單,進入最下面Global Options選項,
      二、進入後,點選左側的Code,接著會出現Editing、Display、Saving、Completion、Diagnostics等五個選單,請點選【Saving】進入,
      三、進入後,最下方的Default text encoding,預設是[Ask],請按下右側Change…,
      四、按下後,出現Choose Encoding選單,請點選UTF-8,按下OK,回上一層,再按下OK。
      如圖:

      感謝您的回應!

  4. 補充說明,各位在Rstudio向臉書申請授權時,進行到:
    > require(“Rfacebook")
    > fb.oauth <- fbOAuth(
    + app_id="111*****************18",
    + app_secret="f8c2**************700041",
    + extended_permissions = TRUE)
    Copy and paste into Site URL on Facebook App Settings: http://localhost:1410/
    When done, press any key to continue…
    若您已將:http://localhost:1410/複製起來,貼上facebook for developers的「我的應用程式」→設定→新增平台→網站→網站網址,
    前述均已完成後,此時,請記得按下【變更儲存】、【立即開始】,畫面會轉跳至【tell us about your website】,請再次貼上http://localhost:1410/,再按下【next】。
    隨後回到RStudio操作視窗,依指示按下任意建,您的瀏覽器才會另外跳出新視窗,裡面只有寫著:
    Authentication complete. Please close this page and return to R.
    再次強調,上面這串字不是出現在Rstudio當中,是出現在瀏覽器跳出的新視窗裡。
    這樣才算是向臉書申請授權完成,將http://localhost:1410/ 複製起來貼在
    facebook for developer才有作用,Rfacebook才能運作抓取資料,如果不按下任意鍵,
    Authentication complete. Please close this page and return to R是不會自動出現的。
    祝大家操作順利!

  5. 你好Stanley老師,我也遇到跟搂上 璇 一樣的問題
    他先跳出錯誤的視窗:
    「無法載入網址: 這個網址的網域未包含在應用程式的網域中。若要載入這個網址,請在應用程式設定的「應用程式網域」欄位中新增應用程式的所有的網域及子網域。」
    然後按下確定後跳出 Authentication complete. Please close this page and return to R.

    還請Stanley老師協助說明,謝謝您

  6. Stanley老師您好:
    延續樓上的同學

    「無法載入網址: 這個網址的網域未包含在應用程式的網域中。若要載入這個網址,請在應用程式設定的「應用程式網域」欄位中新增應用程式的所有的網域及子網域。」
    然後按下確定後跳出 Authentication complete. Please close this page and return to R.

    再回到R是出現以下訊息

    Authentication complete.
    Error in oauth2.0_access_token(endpoint, app, code = code, user_params = user_params, :
    Bad Request (HTTP 400). Failed to get an access token.
    In addition: Warning message:
    In strsplit(rawToChar(raw), “\r?\n") :
    input string 1 is invalid in this locale

    > me me$name
    [1] “XXX"
    貌似是
    access token卡住
    *目前是最新版本,英文版,過程沒有參雜中文

  7. 您好,我也遇到上述兩位同學的問題…

    > me me$name
    [1] “XXX"
    這部分是有抓到資料 但Copy and paste into Site URL on Facebook App Settings: http://localhost:1410/
    When done, press any key to continue…之後按下enter就會跳出如同樓上林同學的error

  8. Stanley老師 您好,
    我也遇到上述兩位同學的問題…
    出現以下資訊:

    「無法載入網址: 這個網址的網域未包含在應用程式的網域中。若要載入這個網址,請在應用程式設定的「應用程式網域」欄位中新增應用程式的所有的網域及子網域。」

    Authentication complete.
    Error in oauth2.0_access_token(endpoint, app, code = code, user_params = user_params, :
    Bad Request (HTTP 400). Failed to get an access token.
    In addition: Warning message:
    In strsplit(rawToChar(raw), “\r?\n") :
    input string 1 is invalid in this locale

    瀏覽器的頁面,一開始是跳出「錯誤」視窗,但接續也出現了「Authentication complete. Please close this page and return to R.」的字句,甚至也認證成功會出現我的臉書帳號了

    save(fb.oauth, file = “fb_oauth")
    Error in save(fb.oauth, file = “fb_oauth") : object ‘fb.oauth’ not found

    請老師協助,謝謝

發表留言

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料