brunch

You can make anything
by writing

C.S.Lewis

by 더기 Feb 18. 2016

R로 페이스북(facebook) 데이터 분석하기

Rfacebook패키지로 Facebook API 데이터를 가져오자

페이스북을 돌아다니다가 가져오고 싶은 데이터가 생겼다. 페이스북 Graph API에서도 요청할 수 있었겠지만, 데이터를 가지고 와서 바로 만져보기 위해 R에서 Facebook 데이터를 받아오기로 했다. 구글링을 해보니 (사진) Rfacebook이라는 패키지가 있었다. 할렐루야! CRAN에서 읽어보니 그렇게 어려워 보이지도 않았다!



0. 페이스북 App 아이디 만들기

페이스북 API에서 데이터를 받아오려면. 페이스북 App ID가 필요하다.

https://developers.facebook.com/apps 에서 <+Add a New App> 버튼을 누르고 만들면 된다.

Add a New App에서 새로운 App ID를 만들어준다

*어려우신 분들은 이 포스트를 참고해주시면 좋습니다  <페이스북 앱 아이디 만들기>


Facebook App ID를 다 만들었으면 이제 준비 끝. Rfacebook 패키지로 원하는 데이터를 가져오면 된다.


1. Rfacebook패키지를 설치해준다.

install.pacakages('Rfacebook')
library(Rfacebook)


2. 토큰을 받아오고 저장해준다

fb_oauth = fbOAuth(app_id = "앱_아이디", app_secret = "앱_시크릿", extended_permissions = FALSE)

extended_permissions = FALSE전체 공개 포스트만 가져온다.

extended_permissions = TRUE로 설정하면, 전체 공개 포스트 이외에도 private 한 포스트도 가져올 수 있다. 하지만 내가 시도했을 때는 오류가 생겨서, 그리고 페이스북 페이지 데이터를 가져올 목적이여서 전체 공개 포스트만 가져오면 됐다.


위 코드를 실행하면 콘솔에 다음과 같은 안내 문구가 나온다. 시키는 대로 해주자.

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

페이스북 App Setting에서 Url을 'http://localhost:1410/'로 바꿔주자. 그리고 다시 콘솔로 들어가서 아무 키나 누르면 끝!

Setting에서 Website를 http://localhost:1410/로 설정한다


3. 테스트로 내 페이스북 정보를 가져와 보자

getUsers("me", token=fb_oauth)
id          name username first_name middle_name last_name gender locale category likes picture

100000000000000 YooDuck Hwang       NA         NA          NA        NA     NA     NA       NA    NA      NA

연결이 잘 됐다


4. 페이지 포스트를 가져와보자

허핑턴포스트코리아의 포스트를 가져와보려고 한다. 허포코의 페이스북 Url은 https://www.facebook.com/huffpostkorea이다. 이 중 맨 끝에 있는 'huffpostkorea'를 페이지에 적어 넣으면 된다.

getPage(page="huffpostkorea", token=fb_oauth, n=30)

허핑턴포스트코리아의 포스트 30개를 가져와봤다.

데이터는 총 10개의 column으로 구성되어있다.

 [1] "from_id"        "from_name"      "message"        "created_time"   "type"        
 [6] "link"           "id"       "likes_count"    "comments_count" "shares_count"  

-from_id / from_name 은 허포코의 id(296869857127346)와 이름(허핑턴포스트코리아)

-message는 포스트에 적은 내용 ("이렇게 두 분이 살았으면 좋겠다")

-created_time 포스팅된 시간 (2016-02-16T05:39:23+0000)

-type은 포스트가 link, video, gif 중 어떤 형식인지 보여준다.

-link 는 해당 포스트의 url

-id는 해당 포스트의 포스트id

-좋아요, 코멘트, 공유 수도 받아올 수 있다.


*주의 : Facebook API는 한 번에 100개 이상 데이터를 가져오지 못하게 해놓았다. 그런 경우 날짜로 for loop을 만들어 가져오면 된다.


5. For Loop으로 원하는 데이터 한 번에 가져오기

한번에 100개 이상 씩 못가져오니, 하루씩 끊어서 포스팅을 가져오게 코드를 짠다.

(하루에 포스팅이 100개가 넘는 페이지라면 이것도 안먹힌다. 근데 그런 페이지가 있나?!)

#먼저 날짜를 설정해줍니다

start_date = '2015/07/01'
end_date = '2016/02/10'
scrape_days = seq(from=as.Date(start_date), to=as.Date(end_date), by='days')

#빈 벡터를 만들어줍니다

posts = c() #making empty vector

#for loop을 돌면서 하루씩 포스트를 가져온다

posts = c()
for (scrape_day in scrape_days) {  
  daypost = c()  
  tryCatch(      
      {daypost = getPage(page="Page_name", token=fb_oauth,                                           since=as.Date(scrape_day, origin="1970-01-01"),   until=as.Date(scrape_day,                   origin="1970-01-01") +1  )},
       error=function(e){})
 posts = rbind(posts, daypost)
}


*에러 메시지 방지

tryCatch(
      {#여기에 코드를 작성하자 },
      error=function(e){})

하루동안 올라온 포스트 없을 경우 에러메시지가 나면서 for loop이 멈추게 된다.

그걸 무시하고 계속 for loop을 돌게 해주려면 for loop안에 위와 같은 코드를 넣어준다. 그러면 post 갯수가 0개라도 error 메세지가 나오지 않고 계속 for loop을 돈다.


다른 기능들

이 것 외에도 Rfacebook에서는 더 많은 종류의 페이스북 데이터를 가져올 수 있다.

*페이스북이 API 버전을 업데이트하면서, 몇몇 함수들이 작동하지 않게 됐다. 버전이 달라지면서 API에서 가져올 수 있는 몇몇 데이터에 제한을 걸어두었기 때문(사실 대부분)

눈물 ㅠㅠ


getFQL / getFriends / getGroup / getInsights / getLikes / getNetwork / getNewsfeed /

getPage / getPost / getUsers / searchFacebook / searchGroup / searchPages  /updateStatus


이렇게 많은 기능들이 있지만, 지금은 거의 다 안된다 ㅠㅜ




*2/23 For Loop 코드에 잘못된 부분이 있어 수정했습니다

페이스북에서 데이터를 가져온 이유는 요새 관심있게 보고 있는 해외 미디어 페이지들을 뜯어보고 싶었기 때문이다.

<영상공장장 NowThis(나우디스) / AJ+는 얼마나 영상을 찍어내나> 곧 포스팅이 나옵니다. 총총



Facebook


작가의 이전글 브런치를 시작한다
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari