網上找Facebook上做Web crawling 的方法,記得之前試過某Coursera教Twitter上的Crawling,用到服務本身提供的API和Authentication Token。Twitter/Google map的教學的都有Coursera上的課堂,但FB提供的只有網上找到零碎的教學,當時是一個外國Vlogger like Emma Watson posts的Script。試明白後把這段code貯起來做參考,想不到這星期剛好有用得上的時候。用到以下的第三方SDK, 安裝後用 import facebook 載入。
Python 的facebook SDK: https://github.com/pythonforfacebook/facebook-sdk
更多的Facebook SDK: https://developers.facebook.com/docs/apis-and-sdks
了解背後的FB Graph API的用法: https://developers.facebook.com/docs/graph-api/overview
找取 & like page 的post:
- 'toke here' 的token 可以在GRAPH Explorer中得到, (Keep it secret!!)
- "ejmonthly" 是信報財經月刊的Facebook name, 看網址就會找到了。
對於ejmonthly 這個profile, 當用get_connections連繫上它的posts資料, 就可以對它的資料內容
import facebook import urllib2 import json accessToken = 'toke here' graph = facebook.GraphAPI(accessToken)
# Grab user's post and *like* them profile = graph.get_object("ejmonthly")
#print profile
count = 0 for post in posts['data']: try: graph.put_object(post['id'],"likes") #Action here - Like Post print "Like the topic: #", count print "Creation time: ", post['created_time'] print post['message'][:50] + "...\n" count = count + 1 if count > 10: #Option - only the top 10 posts break except: continue
#print json.dumps(data, indent=4)
posts = graph.get_connections(profile['id'], "posts")
Facebook資料以一個的"Social Graph"的結構概念存在,簡介中是這樣形容:
(GET) 有點nodes感覺的,例如:
- nodes - basically "things" such as a User, a Photo, a Page, a Comment.
- edges - the connections between those "things", such as a Page's Photos, or a Photo's Comments
- fields - info about those "things", such as a person's birthday, or the name of a Page
profile = graph.get_object("me")
(GET) 像是edges的,例如:
friends = graph.get_connections("me", "friends")
feed = graph.get_connections("me", "feed")
(GET) fields 是上面傳回的用dictionary載著的內容,例如:
post = feed["data"][0]
對於某個Nodes未知有什麼內容可以抓取的話,最好先用print看一下。
print profile 或者 print json.dumps(data, indent=4)
(POST) 雖然有put_comment(), put_like(),但graph.put_object() 比較萬用:
graph.put_object(post['id'],"likes")
graph.put_object("me", "feed", message="Hello, world")
graph.put_object(post["id"], "comments", message="First!")
Facebook 提供的是Facebook Graph 2.5 版本,自從2015年10月起,除非對方都有用Graph, 有授權過Graph 這個"App" (一般人都不會....),否則都連不上朋友的資料了。這樣情況下,好像對開Page的人/公司去了解自己的Page時才比較有用。而且有Limit(Paging: next)的限制還未懂得用,抓不到25筆以上的資料...
(GET) 像是edges的,例如:
friends = graph.get_connections("me", "friends")
feed = graph.get_connections("me", "feed")
(GET) fields 是上面傳回的用dictionary載著的內容,例如:
post = feed["data"][0]
對於某個Nodes未知有什麼內容可以抓取的話,最好先用print看一下。
print profile 或者 print json.dumps(data, indent=4)
(POST) 雖然有put_comment(), put_like(),但graph.put_object() 比較萬用:
graph.put_object(post['id'],"likes")
graph.put_object("me", "feed", message="Hello, world")
graph.put_object(post["id"], "comments", message="First!")
Facebook 提供的是Facebook Graph 2.5 版本,自從2015年10月起,除非對方都有用Graph, 有授權過Graph 這個"App" (一般人都不會....),否則都連不上朋友的資料了。這樣情況下,好像對開Page的人/公司去了解自己的Page時才比較有用。而且有Limit(Paging: next)的限制還未懂得用,抓不到25筆以上的資料...
後話....自學的感覺跟香港以外的技術真的差很遠,想一星期打一篇週記,下起手時都是超慢。昨天聽到一句話「我們都是這樣浸大的」,繼續努力,希望慢慢浸出我想要的水準吧...
沒有留言:
張貼留言