Làm thế nào để kéo dữ liệu fb ads về 🤔


Mở đầu

Facebook là một thị trường quảng cáo vô cùng lớn, lên việc một doanh nghiệp chọn nền tảng này làm nơi tiếp thị cho hoạt động marketing của doanh nghiệp là chuyện đương nhiên. Để khai thác một cách triệt để nhất tài nguyên và sự hỗ trợ nhiệt tình của a Mác Xoăn thì chúng ta phải tìm cách nào đó để lấy dữ liệu từ fb ads về máy và tự custom tự sử dụng data đó theo ý muốn của bản thân.

Để lấy dữ liệu fb ads về bằng Python, cần sử dụng API từ fb marketing. Quy trình sẽ gồm các bước như sau:

Lấy các params cần thiết

Bước 1: Lấy các Params cần thiết cho code chạy:

1
2
ad_account_id = '<>'
access_token = '<>'

Lấy ad_account_id:

  • Truy cập: [here] - Lưu ý là pro phải được share quyền tài khoản hoặc là người sở hữu trực tiếp bỏ chi phí ra để chạy.

image.png

→ ad_account_id sẽ := act_[ô hcn đỏ ở trên]

Lấy 3 thông số còn lại: access_token, app_id, app_secret

image.png

  • Tiếp:

image.png

  • Kéo xuống cuối chọn Other

image.png

  • Chọn Tiếp:

image.png

  • Chọn Kinh doanh:

image.png

  • Điền tên ứng dụng, xong nhấn Tạo ứng dụng là oke

Bước vừa rồi mới là tạo app, giờ mới đi lấy các params. Quay trở về trang My App bạn sẽ có kết quả như sau

image.png

Tạo Acess Token:

Access Token là một đoạn mã mà bạn phải đưa ra mỗi khi muốn lấy dữ liệu từ Facebook Ads, giúp Facebook chứng thực được bạn có quyền lấy dữ liệu đó. Lưu ý là Token này giống như chìa khóa, bất kì ai ở đâu cũng có thể dùng nó để lấy dữ liệu Ads công ty bạn, nên đừng chia sẽ nó với ai nếu như yêu cầu của họ không thỏa đáng.

  1. Click vào Ứng dụng vừa mới tạo, bấm chọn mục Add Product ở menu bên trái, trên màn hình sẽ hiển thị danh sách ứng dụng, bạn hãy chọn Marketing API.

image.png

  1. Bước 2: Cick chọn vào Marketing API bên menu trái, chọn Tool, tích chọn vào ads_read, ads_insight, ads_management, sau đó click Get Token, Token này không được lưu lại ở đâu vì lý do bảo mật nên bạn hãy copy rồi lưu ra file, các bước tiếp theo chúng ta sẽ dùng đến nó.

image.png

Lưu ý: Mỗi 2 tháng bạn cần lặp lại bước trên, tạo 1 access_token mới do chính sách bảo mật của fb nó áp dụng như vậy cho an toàn, với 2 tháng cx khá oke rồi.

Bắt đầu kéo

Sau khi có đủ bộ 2 params trên ta sẽ rất tự tin để đi lấy dữ liệu fb ads về.

image.png

Trên thực tế dữ liệu fb ads khá đa dạng và gồm nhiều bảng, các dữ liệu ở dạng json và có format ko chuẩn chỉ cho lắm. Và ta phải làm sao cho nó đẹp và tốt nhất có thể.

Các bảng cần lấy

Theo nghiệp vụ và theo như kinh nghiệp làm DE và có đi lấy dữ liệu fb ads ở một công ty nào đó rồi thì việc lấy hết tất cả các bảng trên là ko nên và có khi cũng chả để làm gì :> (tốn thời gian + tốn chi phí lưu trữ). Ta chỉ nên xem bảng nào cần thiết và mang nó về kho chứa của nhà mình

image.png

Code kéo dữ liệu bảng insights

  1. Run lệnh sau trong terminal để cài đặt thư viện
1
py -m pip install requests

(nếu lệnh trên ko được có thể thử thay py bằng python, python3 - đối với linux)

  1. Tạo một file fb_ad_insights.py như sau:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import requests
import csv
import json
from datetime import datetime, timedelta

# Đặt thông tin về Access Token và Ad Account ID của bạn
access_token = '<>'
ad_account_id = 'act_<>'
package_name = "<>"

# Đặt số ngày bạn muốn lấy dữ liệu (ví dụ: 5 ngày liên tiếp)
num_days = 5

# URL cơ bản cho Ads Insights API
base_url = f"https://graph.facebook.com/v17.0/{ad_account_id}/insights"

# Đọc tỷ giá từ file tygia.csv
conversion_rates = {}
with open('tygia.csv', mode='r') as file:
reader = csv.reader(file, delimiter='\t')
for row in reader:
currency, rate = row
conversion_rates[currency] = float(rate)

# Lặp qua nhiều ngày và lưu thành nhiều file
for day_offset in range(num_days):
# END_DATE = datetime.strptime('2024-07-15', '%Y-%m-%d') - timedelta(days=day_offset)
END_DATE = datetime.now() - timedelta(days=day_offset)
START_DATE = (END_DATE - timedelta(days=1)).date() # Ngày bắt đầu là một ngày trước ngày kết thúc

# In ra để kiểm tra giá trị START_DATE và END_DATE
print(f"START_DATE: {START_DATE}, END_DATE: {END_DATE.date()}")

# Tham số yêu cầu
params_insights = {
'access_token': access_token,
'fields': (
'campaign_name, spend, account_currency, impressions, clicks, '
'date_stop'
),
'level': 'campaign', # Lấy dữ liệu ở cấp chiến dịch
'time_range': json.dumps({"since": str(START_DATE), "until": str(END_DATE.date())}), # Đặt time_range
'breakdowns': 'country', # Phân tích theo quốc gia
'limit': 1000 # Giới hạn kết quả mỗi trang
}

all_insights = [] # Danh sách để lưu trữ toàn bộ dữ liệu từ nhiều trang
url_insights = base_url # Gán URL đầu tiên

# Vòng lặp qua các trang của dữ liệu
while url_insights:
response_insights = requests.get(url_insights, params=params_insights)

if response_insights.status_code == 200:
data_insights = response_insights.json()

# Xử lý dữ liệu
for entry in data_insights['data']:
# Bỏ cột date_start và đổi tên cột date_stop thành _ts
entry['_ts'] = int(datetime.strptime(entry['date_stop'], '%Y-%m-%d').timestamp())
del entry['date_stop'] # Xóa cột date_stop
if 'date_start' in entry:
del entry['date_start'] # Xóa cột date_start nếu có

# Thêm trường packageName với giá trị truyền vào
entry['packageName'] = package_name

# Chuyển đổi spend sang VND và cập nhật account_currency thành "VND"
currency = entry['account_currency']
if currency in conversion_rates:
entry['spend'] = round(float(entry['spend']) * conversion_rates[currency], 2)
entry['account_currency'] = 'VND' # Đổi đơn vị tiền tệ thành VND
else:
print(f"Warning: No conversion rate found for currency '{currency}'")

# Thêm dữ liệu từ trang hiện tại vào danh sách chung
all_insights.extend(data_insights['data'])

# Kiểm tra xem có trang tiếp theo không
url_insights = data_insights.get('paging', {}).get('next', None)
else:
print(f"Error: {response_insights.status_code}, {response_insights.text}")
break

# Lưu toàn bộ dữ liệu vào file JSON, đặt tên file theo ngày END_DATE
file_name = f'insight_{END_DATE.date()}.json'
with open(file_name, mode='w') as json_file:
for entry in all_insights:
json.dump(entry, json_file)
json_file.write('\n')

print(f"Dữ liệu chiến dịch quảng cáo đã được lưu vào '{file_name}'.")
  1. Run code trên:
1
py fb_ad_insights.py

→ Thay py bằng python, python3 nếu sử dụng linux

  1. Dữ liệu trả về theo từng file, mỗi file là một ngày và nó sẽ trông như:
1
2
3
{"campaign_name": "Animexa_14/06_ Phi_CPI 0,03Thuy", "spend": 10472.22, "account_currency": "VND", "impressions": "1376", "clicks": "32", "country": "PH", "_ts": 1720803600, "packageName": "w1"}
{"campaign_name": "Animexa_14/06_Global_CPI 0,01_Thuy", "spend": 0.0, "account_currency": "VND", "impressions": "9", "clicks": "1", "country": "AF", "_ts": 1720803600, "packageName": "w1"}
{"campaign_name": "Animexa_14/06_Global_CPI 0,01_Thuy", "spend": 0.0, "account_currency": "VND", "impressions": "33", "clicks": "1", "country": "DZ", "_ts": 1720803600, "packageName": "w1"}

Trong đó:

Các biến được truyền vào

1
2
3
access_token = '<>'
ad_account_id = 'act_<>'
package_name = '<>' # cột thêm vào tùy chỉnh

tygia.csv/txt (tỷ giá cập nhập liên tục theo tháng) là một file có dạng

1
2
3
4
USD	24354
JPY 168
SGD 17600
VND 1
  • Code duyệt qua từng dòng của file, đọc từng mã tiền tệ và tỷ giá rồi lưu vào dictionary conversion_rates dưới dạng {currency: rate}
  • Code kiểm tra nếu mã tiền tệ (account_currency) có trong dictionary conversion_rates. Nếu có, code sẽ thực hiện chuyển đổi chi phí (spend) từ loại tiền tệ gốc sang VND bằng cách nhân với tỷ giá đã lưu trong conversion_rates.
  • “account_currency”: “USD” → “account_currency”: “VND” (chi phí quảng cáo tính theo account_currency chứ ko dựa theo từng nước. Thường sẽ là USD.

packageName là cột mới được thêm vào

Tài liệu tham khảo

Airbyte docs:

Facebook docs:

200 labs:

Github:

Windsor.ai

Enzircle