Python

python - 페이스북,인스타그램 광고데이터 수집 자동화

페이스북 앱 생성 및 설정

페이스북 API를 사용하여 광고 데이터를 사용하기 위해서는 페이스북 비지니스 앱 생성 후 광고계정과 연동이 필요하다. 페이스북 광고 계정관리자에서 계정 정보와 페이지 정보를 확인한다. 광고계정 ID는 Facebook API사용시 필요한 정보이므로 다른 Id 정보와 혼동하지 않도록 한다.

비지니스 앱 생성은 developers.facebook.com/apps으로 이동한다.  오른쪽 상단의 앱만들기 버튼을 클릭한다.

비니지스 통합 관리 선택후 앱 이름을 입력한다. 앱 목적은 사내에서만 사용할 목적이니 첫번째 항목을 선택했다. 하단의 비지니스 관리자를 선택하여 생성할 비지니스 앱과 비지니스 광고계정을 연결한다.

비지니스 앱 생성에 성공하여 앱 상세 페이지에서 제품을 추가 할 수 있다. 왼쪽 하단의 마케팅 API의 설정버튼을 클릭한다.

마케팅 api의 도구 메뉴를 클릭하여 샌드박스 광고계정항을 추가한다. 페이지 선택 영역은 페이스북 광고관리자에서 사용중인 페이스북 페이지 목록이다. 모든 페이지를 선택했다.

광고 계정 생성 후 액세스 토큰을 발급 받는다. 이 토큰을 사용하여 python에서 페이스북 광고 데이터를 사용 할 수 있다. 앱 id와 시크릿 코드도 확인하여 복사한다.

 

 


Python 코드 작성

facebook python business sdk를 설치한다. github.com/facebook/facebook-python-business-sdk 에서 간단한 예제와 설명을 확인 할 수 있다.

 

facebook/facebook-python-business-sdk

An SDK built to facilitate application development for Facebook Ads API. - facebook/facebook-python-business-sdk

github.com

pip 를 사용하여 패키지를 설치한다.

pip install facebook_business

패키지 설치후 아래 코드를 실행하면 사용 가능한 광고 계정 정보를 확인 할 수 있다.

from facebook_business.adobjects.adaccount import AdAccount
from facebook_business.adobjects.adsinsights import AdsInsights
from facebook_business.api import FacebookAdsApi
from facebook_business.adobjects.user import User
from facebook_business.adobjects.campaign import Campaign
from facebook_business.adobjects.ad import Ad
from facebook_business.adobjects.adimage import AdImage
from facebook_business.adobjects.adcreative import AdCreative
from tqdm import tqdm_notebook
import datetime

# 페이스북 개발자 페이지에서 비지니스 앱 생성후 
# 마케팅 api 추가하여 권한 설정후 토큰 발급 받기
access_token = 'EAAL9I8vmlY '
app_secret = 'EAAL9I8vmlY'
app_id = '123123123'

FacebookAdsApi.init(app_id, app_secret, access_token)

me = User(fbid='me')
my_accounts = list(me.get_ad_accounts())
print(my_accounts) 

 광고계정 정보를 확인했다면 광고 데이터에 접근해보도록 한다. 2020년 12월 10일 부터 2020년 12월 15일 사이의 1일 단위의 광고 데이터를 가져오는 코드이다.

insightFields = [  
    AdsInsights.Field.campaign_name,
    AdsInsights.Field.campaign_id,
    AdsInsights.Field.adset_id,
    AdsInsights.Field.adset_name,
    AdsInsights.Field.ad_id,
    AdsInsights.Field.ad_name,
    AdsInsights.Field.impressions, # 노출
    AdsInsights.Field.clicks,
    AdsInsights.Field.cpm, # 1000 노출당 비용
    AdsInsights.Field.ctr, # 사람들이 광고를 보고 클릭(전체) 행동을 취한 비율
    AdsInsights.Field.cpp, # 사람들이 광고를 보고 클릭(전체) 행동을 취한 비율
    AdsInsights.Field.spend, # 광고비
    AdsInsights.Field.reach, # 도달
    AdsInsights.Field.purchase_roas,
    AdsInsights.Field.conversions,
    AdsInsights.Field.date_start,
    AdsInsights.Field.date_stop,
    AdsInsights.Field.objective, # 광고 목적
    AdsInsights.Field.actions, # purchase(구매수)
]

begin = datetime.date(2020, 12, 10)
end = datetime.date(2020, 12, 15)

# 전체 데이터 저장 할 변수
total_li = []
for day in tqdm_notebook(range((end - begin).days)):
    day = begin + datetime.timedelta(days=day) 
    day = day.strftime('%Y-%m-%d') 
    
    # 일단위 광고 데이터 받아오기
    # 캠페인, 광고셋, 광고 중 최소단위인 광고데이터를 성별과 나이로 구분
    params = {
        'time_range': {'since': day, 'until': day},
        'level': 'ad',
        'breakdowns': ['age', 'gender'],
    }
    
    # 광고계정 연결
    insights = AdAccount('act_광고계정id').get_insights(params=params, fields=insightFields)
    
 
    # 1일 단위의 광고 정보 
    for ins in insights: 
        purchase_roas = 0
        # 로하스 값만 가져오기
        if 'purchase_roas' in ins:
            purchase_roas = ins['purchase_roas'][0]['value'] 

        
        purchase = 0
        post_engagement = 0
        if 'actions' in ins:
            actions = ins['actions']
            purchase = list(filter(lambda x: x['action_type'] == 'purchase', ins['actions'] ))
            if len(purchase) > 0:
                purchase = purchase[0]['value']

            post_engagement = list(filter(lambda x: x['action_type'] == 'purchase', ins['actions'] ))
            if len(post_engagement) > 0:
                post_engagement = post_engagement[0]['value']
        
        cpp = -1
        if 'cpp' in ins:
            cpp = ins['cpp']

        cpm = -1
        if 'cpm' in ins:
            cpm = ins['cpm']

        ctr = 0
        if 'ctr' in ins:
            ctr = ins['ctr'] 

        row = {
            'objective': ins['objective'],
            'campaign_id':ins['campaign_id'],
            'adset_id': ins['adset_id'], 
            'ad_id':ins['ad_id'], 
            'ad_name':ins['ad_name'],
            'gender':ins['gender'], 
            'age':ins['age'],
            'date_start':ins['date_start'],
            'date_stop':ins['date_stop'],
            'date' : since, 
            'spend':ins['spend'], 
            'impressions':ins['impressions'], 
            'clicks':ins['clicks'],  
            'reach':ins['reach'], 
            'cpp':cpp, 
            'ctr':ctr, 
            'cpm':cpm, 
            'purchase_roas':purchase_roas, 
            'purchase':purchase,  
        }

        total_li.append(row) 
        
rdf = pd.DataFrame(total_li)

광고 데이터를 가져왔으나 광고의 이미지나 동영상을 확인할 수 없다. 광고에 사용된 이미지, 동영상 정보를 가져오도록 한다.

creativeFields = [
    AdCreative.Field.name,
    AdCreative.Field.image_url,
    AdCreative.Field.image_hash,
    AdCreative.Field.thumbnail_url,
    AdCreative.Field.title,
    AdCreative.Field.object_id,
    AdCreative.Field.link_url
]

# 광고에 사용된 이미지 가져오기
crow_li = []
for ad_id in tqdm_notebook(rdf['ad_id'].unique()):
    
    # 광고id로 광고 접근
    ad = Ad(ad_id)
    # 광고 비주얼 가져오기
    creatives = ad.get_ad_creatives(fields=creativeFields)[0]
    
    cid = creatives['id']
    # 이미지가 있다면 이미지 가져오기
    thumbnail_url = ''
    if 'thumbnail_url' in creatives:
        thumbnail_url = creatives['thumbnail_url']
    
    # 광고 미리보기 태그 
    body = ad.get_previews(params={'ad_format': 'RIGHT_COLUMN_STANDARD',})[0]['body']
        
    crow = {'ad_id': ad_id, 'c_id': cid, 'thumbnail_url':thumbnail_url, 'body':body}
    crow_li.append(crow)
cdf = pd.DataFrame(crow_li)

 

위 코드로 광고의 데이터와 광고 이미지, 미리보기를 수집 할 수 있다. 수집된 데이터로 원하는 대시보드를 만드는 일만 남았다.

 


페이스북 공식 문서를 참고하여 api 사용법을 확인하면 된다.

developers.facebook.com/docs/marketing-api/reference/sdks/python/ad/v9.0

 

Python Marketing API SDK - Ad - 마케팅 API - 문서 - Facebook for Developers

Python Ads SDK for Ad

developers.facebook.com

공식문서 이외에 참고한 페이지도 기록한다.

www.damiengonot.com/

 

Damien Gonot

 

www.damiengonot.com

python.hotexamples.com/examples/facebookads.objects/AdAccount/get_ad_images/python-adaccount-get_ad_images-method-examples.html

 

Python AdAccount.get_ad_images Examples, facebookadsobjects.AdAccount.get_ad_images Python Examples - HotExamples

 

python.hotexamples.com