文章程式碼顯示

2017年8月26日 星期六

一起學 Python - 14:擷取 Facebook 社團、粉絲團 發文文章與文章內容

本文的內容參考
[爬蟲]如何用Python與Facebook API蒐集粉絲專頁的資訊? Part1
[爬蟲]如何用Python與Facebook API蒐集社團的資訊?

但因前兩天實作時發現有些許小部分原作者沒有較詳細的交待,故在此篇文章中對於步驟較詳細的解釋。

首先我們利用的是 Facebook Graph API Explorer 這個網頁,間接的取得 Facebook 裡頭的資訊,並使用 Python 的模組來進行剖析。在使用之前,我們必須先處理 Python 端的模組,由於使用到的模組並不是 Python 本身自帶,而是利用第三方的支援來進行,故我們必須額外的安裝模組。

在此請大家用 Python 最新的版本 ( 如3.6.2版 , 按我直接下載),且在安裝時需注意我們必須點選Add Python 3.6 to PATH 以及 更改安裝路徑到 C 槽底下 如下圖。


























安裝完成後,我們不需要再如其他教學中所教的針對環境變數進行設定。直接在開始的地方鍵入 cmd 開啟命令提示字元,並且我們輸入 pip 來進行第三方的安裝。




























有出現如上圖的畫面就表示你已經可以開始進行安裝了。
依序鍵入以下的指令來進行第三方模組的安裝,總共有三個模組需要安裝,分別輸入
1. pip install requests
2. pip install pandas
3. pip install bs4






































有出現如上方的樣子就表示他正在安裝第三方模組了。接著我們就可以進行粉絲團與社團的貼文文章擷取,包含文章內容、發文者ID、發文日期 ... 等等
使用的是 requests 模組裡面的功能,詳細的原理以及第三方模組的介紹待後續文章在進行補充,本篇文章目前暫時用來當作一個書籤,提醒我之後要補充這塊部分的介紹。

由於我們前面說過,是利用 Facebook API 來間接取得資訊,所以我們必須先到  Facebook Graph API Explorer 來獲取授權碼。參考連結中有截圖表示,但並沒有說的很仔細,讓我在操作上摸了一小段時間,在此篇文章中我補充了原作者的不足的內容。

假設我們要對粉絲團 Power錕的紙牌屋 進行擷取,首先開啟粉絲團並且我們將網址複製起來備用,再來進到 Facebook Graph API Explorer 網頁,點選 "取得權杖" 並點選 "取得用戶存取權杖 " 接著會彈出一堆選項,在這什麼都不用點,我們直接按 "取得存取權杖"































得到存取權杖(token)後在下方的輸入欄裡改貼上粉絲團的網址,接著點選提交。



保存這個網頁的頁面,打開 Python 後複製貼上以下的程式碼,其中以下的程式碼 token 的部分需要改成你自己得到的存取權杖,其他可以照樣使用即可。為了尊重原作者我並沒有將程式碼做過多的修改。

import requests
import pandas as pd 
from dateutil.parser import parse


#在Facebook Graph API Exploer取得token

token = '此處換成你得到的存取權杖' 


#在Facebook Graph API Exploer取得粉絲專頁的id與名稱,並將其包成字典dic

fanpage = {'360151611020961':'Power錕的紙牌屋'} 


#建立一個空的list          

information_list = []


#使用for迴圈依序讀取粉絲頁的資訊,並使用format將id與token傳入{}裡

for ele in fanpage:
    res = requests.get('https://graph.facebook.com/v2.9/{}/posts?limit=100&access_token={}'.format(ele, token))
    
    
    #API最多一次呼叫100筆資料,因此使用while迴圈去翻頁取得所有的資料

    while 'paging' in res.json(): 
        for information in res.json()['data']:
            if 'message' in information:
                information_list.append([fanpage[ele], information['message'], parse(information['created_time']).date()])
                print('擷取中')

        if 'next' in res.json()['paging']:
            res = requests.get(res.json()['paging']['next'])
        else:
            break


#最後將list轉換成dataframe,並輸出成csv檔

information_df = pd.DataFrame(information_list, columns=['粉絲專頁', '發文內容', '發文時間']) 
information_df.to_csv('C:\Power錕的紙牌屋.csv', index=False)


print('擷取完成')


接著我們就可以到 C 槽找到 Excel 檔,裡面就存著粉絲團的發文內容與時間了。























接著我們試著換擷取 Facebook 公開社團內的文章,再次開啟Facebook Graph API Explorer 並且開啟你要擷取的 Facebook 公開社團網頁。我以社團 CR-7/8/10 3D Printer 研究社 來說明,






在 groups 後方的地方就是該社團的 "網址名稱"(此例中就是CR7.3Dprinter),將網址名稱塞入下面的語句藉以查詢社團的 ID。
search?q=CR7.3Dprinter&type=group



















如此我們就得到社團的 ID 了
接著就可以貼到 Python 的程式碼之中,以下程式碼為該作者提供。

import requests
import pandas as pd
from bs4 import BeautifulSoup
from dateutil.parser import parse

group_id = '1660856287478650'
token = '更改為你得到的存取權杖'

#獲取API內容

res = requests.get('https://graph.facebook.com/v2.9/{}/feed?access_token={}'.format(group_id, token))

#使用迴圈爬取並放到list

posts = []

for post in res.json()['data']:
    posts.append([parse(post.get('updated_time')), post.get('id'), post.get('message'), post.get('story')])
    print('擷取中')

#輸出內容

df = pd.DataFrame(posts)
df.columns = ['貼文時間', '貼文ID', '貼文內容', '分享內容']
df.to_csv('C:\研究社.csv', index=False)  

print('擷取完成')





































有時會出現紅字部分的錯誤,我也不曉得錯誤的原因為何,但重複按 F5 執行腳本幾次後就又成功了。
























待後續的文章再補充第三方模組的說明,以及擷取 Facebook 粉絲團、社團 文章的程式碼說明。

↓↓↓ 連結到部落格方針與索引 ↓↓↓

Blog 使用方針與索引