線上看josn

http://json.parser.online.fr/

fb 開發者 要隨時更新 ACCESS_TOKEN

https://developers.facebook.com/tools/explorer/


In [1]:
# 啟動互動式繪圖環境
%pylab inline


Populating the interactive namespace from numpy and matplotlib

In [2]:
# 隨時更新才可用
ACCESS_TOKEN = "your TOKEN"

In [31]:
import facebook # pip install facebook-sdk
import requests
from IPython.display import Image
import json
import re
import dateutil.parser as dateparser
import datetime
import matplotlib.pyplot as plt
# A helper function to pretty-print Python objects as JSON
def pp(o): 
    print json.dumps(o, indent=1)
# Create a connection to the Graph API with your access token
g = facebook.GraphAPI(ACCESS_TOKEN)

In [32]:
# 以dcard為例 填上dcard的id 在 url 可以找到
about = g.get_object('dcard.tw')
# 點讚數
print('點讚數:'+str(about['likes']))
# 談論數
print('談論數:'+str(about['talking_about_count']))
# 分類
print('分類:'+about['category'])
# name
print('name:'+about['name'])
# id
print('id:'+about['id'])
# 成立時間
print('成立時間:'+about['founded'])
# 描述
print('描述')
print(about['description'])


點讚數:168029
談論數:95942
分類:Product/service
name:Dcard
id:178875832200695
成立時間:2011/12/16
描述
Ⅰ.在每天的午夜,Dcard就會出現一位校園同學

Ⅱ.當天24小時內如果你們都對彼此發出朋友邀請,你們就會成為朋友,如只有一方沒按,對方無法得知

Ⅲ.如果24小時內你們沒有成為朋友,下個午夜來臨時,他就會永遠消失


In [5]:
connection_type = 'feed'
feed = g.get_connections(about['id'], connection_type, limit=4)

feed 為粉絲團上貼文 limit為限制文章數

結構如下


In [6]:
Image(filename='/Users/wy/Desktop/fb1.png')


Out[6]:

In [7]:
# 重覆讀取next url 資訊
def resUrl(content,total_posts):
    # debug用
    for one in content['data']:
        total_posts.append(one)
    if content['paging'].has_key("next"):
        content = requests.get(content['paging']['next']).json()
        resUrl(content,total_posts)
    else:
        for one in content['data']:
            total_posts.append(one)
# 計算總點讚 
def likesSum(message):
    # 該篇留言的likes數
    total_posts = [ one for one in message['likes']['data']]
    # 該篇留言的likes數 nextpage
    if message['likes']['paging'].has_key("next"):
        content = requests.get(message['likes']['paging']['next']).json()
        resUrl(content,total_posts)
    return total_posts

# 計算總留言 
def commentsSum(message):
    # 該篇留言的comments數
    total_posts = [ one for one in message['comments']['data']]
    # 該篇留言的comments數 nextpage
    if message['comments']['paging'].has_key("next"):
        content = requests.get(message['comments']['paging']['next']).json()
        resUrl(content,total_posts)
    return total_posts

# 貼文資訊生成
def messageInfo(message):
    messageDist={}
    sumLikes = likesSum(message)
    sumComments = commentsSum(message)
    # 創立時間
    messageDist['created_time'] = message['created_time']
    # 塗鴉牆訊息
    messageDist['message'] = message['message']
    # id
    messageDist['id'] = message['id']
    # 分享人數
    try:
        messageDist['shares_count'] = message['shares']['count']
    except:
        messageDist['shares_count'] = "0"
    # 更新時間
    messageDist['updated_time'] = message['updated_time']
    # 按讚內容
    messageDist['likes_messages'] = sumLikes
    # 按讚人數
    messageDist['likes_count'] = len(sumLikes)
    # 留言內容
    messageDist['comments_messages'] = sumComments
    # 留言人數
    messageDist['comments_count'] = len(sumComments)
    return messageDist

In [14]:
# 示範 從4/22  14點 取到 4/21 16點 貼文資訊
# [年,月,時]
startTimeInput = ['04','22','14']
endTimeInput =  ['04','22','16']
messageInfoAll=[]
startTime = '2015-'+startTimeInput[0]+'-'+startTimeInput[1]+'T'+startTimeInput[2]+':00:00+0000'
endTime = '2015-'+endTimeInput[0]+'-'+endTimeInput[1]+'T'+endTimeInput[2]+':00:00+0000'

sd= dateparser.parse(startTime)
fd= dateparser.parse(endTime)
for messageNum in range(len(feed['data'])):
    if sd <= dateparser.parse(feed['data'][messageNum]['created_time']) <= fd:
        messageInfoAll.append(messageInfo(feed['data'][messageNum]))

In [15]:
# 只有抓取到兩則
len(messageInfoAll)


Out[15]:
2

In [16]:
for num in range(len(feed['data'])):
    print(feed['data'][num]['created_time'])


2015-04-22T16:10:00+0000
2015-04-22T15:10:01+0000
2015-04-22T14:24:06+0000
2015-04-22T13:27:29+0000

設定抓取 示範 從4/22 14點 取到 4/21 16點 貼文資訊

在feed中原先limit為4 故4則中只有兩則符合日期

2015-04-22T15:10:01+0000,2015-04-22T14:24:06+0000

看第一則貼文資訊 messageInfoAll[0]


In [29]:
Image(filename='/Users/wy/Desktop/fb2.png')


Out[29]:

comments_message 為所有留言內容

likes_message 為所有按讚內容

likes_count 按讚總數

ccomments_count 留言總數 ...

以下為對比


In [30]:
Image(filename='/Users/wy/Desktop/fb3.png')


Out[30]:

In [25]:
# 取得抓取到第一篇id
messageInfoAll[0]['id']
print(messageInfoAll[0]['message'])
# 抽出該貼文留言之姓名
# 設定人數
peopleNum = 5
print('----------------------------')
for num in range(len(messageInfoAll)):
    if messageInfoAll[num]['id'] == messageInfoAll[0]['id']:  
        for tmp in range(peopleNum):
            numr = randint(0,len(messageInfoAll[num]['comments_messages'])-1)
            print(messageInfoAll[num]['comments_messages'][numr][u'from'][u'name'])


#有趣【閃光的條件】
https://www.dcard.tw/f/funny/p/150220

有一次下班後跟幾個同事在聊天

原po的同事又都是那種嘴炮起來要人命的

『 哎妳幾歲 』

「大二 幹嘛」

『 噢 哎妳交男朋友的條件是什麼 』

「你要介紹男朋友給我嗎!!!!!」

已經魯了20年我真的不想再魯下去了啊👉👈👉👈👉👈

「不用太帥」

「要體貼」

「不用太聰明」

「最好有一點點浪漫」

重點來了!!!

「要比我高」💪💪💪


我發誓我沒看過這麼鄙視的眼神從頭到腳把我掃過一遍👀

真不敢相信他突破我一直以來的盲點

『要比妳矮也很難吧?』

『要比妳矮也很難吧? 』

『要比妳矮也很難吧? 』

覺得很屈辱所以要說三次😤😤😤


原po身高155👠👠👠
----------------------------
陳雁屏
蟀蟀安
徐敏嘉
Fungchiao Hung
陳彥瑞

In [65]:
def plotFrequent(num):
    t=[]
    for a in range(len(messageInfoAll[num]['comments_messages'])):
        t.append(dateparser.parse(messageInfoAll[num]['comments_messages'][a]['created_time']))
    dd={}
    for a in t:
        a = a.hour
        if dd.has_key(a):
            dd[a]+=1
        else:
            dd[a]=1
    x = [key for key in sorted(dd.iterkeys())]
    y = [dd[key] for key in sorted(dd.iterkeys())]
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(x, y)
    fig.show()

畫出留言頻率的散佈圖 橫軸為時間 縱軸為頻率

plotFrequent(0)為 messageInfoAll[0]

plotFrequent(1)為 messageInfoAll[1]


In [71]:
plotFrequent(0)



In [72]:
plotFrequent(1)



In [73]:
# 存成json日後分析
with open('/Users/wy/Desktop/fbreport.json', 'w') as f:
    f.write(json.dumps(messageInfoAll, indent=1))