אם איש או אשת שיווק בודקים ידנית עשרות פרופילי IG פומביים, האובדן העיקרי אינו הזמן שנדרש לפתיחת הדפים, אלא היעדר היסטוריה שאפשר להשוות. תמונת מצב אחת מציגה את מספר העוקבים כיום; שתי תמונות מצב מאפשרות לחשב את ההפרש בתקופה שנבחרה. לצורך ניטור פשוט של פרופילים אפשר להפוך את הבקשה לאוטומטית, לשמור רק את השדות הנחוצים ולקבל טבלת שינויים.
להלן דוגמה מינימלית ופועלת ב־Python: היא שולפת מידע על פרופיל לפי שם משתמש דרך IG Scraper API וכותבת שורת JSONL עם חותמת זמן. התוצאה היא מקור נתונים היסטורי קטן שאפשר לחבר ל־cron, ל־n8n או למאגר נתונים משלכם. התיאור הרשמי של הנתיב והפרמטרים מופיע במדריך IG API.
על איזו שאלה עונה תמונת מצב יומית
נניח שצוות עוקב אחר חשבונות פומביים של מותגים או שותפים ורוצה לזהות שינוי במספר העוקבים, בפרסומים או במצב האימות. צפייה בדף מציגה את הערכים הנוכחיים, אך אינה שומרת כשלעצמה את המצב מלפני שבוע. לכן, ראשית צריך להחליט אילו שדות חשובים, ואז לשמור אותם בצירוף תאריך התצפית.

הנתיב /v1/user/by/username מקבל את הפרמטר הנדרש username. התשובה כוללת, בין היתר, את follower_count, following_count, media_count, is_verified, is_private ו־biography. השדות האלה מתאימים לתמונת מצב של פרופיל; הם אינם כוללים היסטוריה של פרסומים ואינם מסבירים כשלעצמם את הסיבה לשינוי במדדים.
התרחיש כאן מצומצם בכוונה: לקבל קבוצת שדות נצפית במועד נתון ולהשוות אותה לרשומות קודמות. כך האנליסט או האנליסטית יכולים לראות, למשל, שמספר העוקבים השתנה בין התאריכים שנשמרו, ולהמשיך לבדיקה בנפרד מהאיסוף האוטומטי.
הכינו מפתח ורשימת חשבונות
התקינו את ספריית הבקשות והגדירו את מפתח ה־API במשתנה סביבה. אל תכניסו את הסוד לקובץ המקור, למאגר הקוד או לפלט התוכנית. ה־API משתמש בפרמטר הבקשה license_key; הספרייה שבהמשך מרכיבה בעצמה את מחרוזת השאילתה.
python -m pip install requests
export JSONSCRAPER_INSTAGRAM_LICENSE_KEY="המפתח_שלכם"
נוח לשמור את רשימת הפרופילים בקובץ תצורה או במשתנה של הפרויקט. בהרצה הראשונה מספיק שם משתמש אחד כדי לבדוק את התשובה, את הגישה ואת הכתיבה למאגר. בדוגמה, השדה username מוגדר כפרמטר API, והמפתח נקרא רק מסביבת הריצה.
שליחת בקשה ושמירת תמונת מצב ב־Python
הסקריפט בודק את תגובת HTTP, את הסטטוס החיצוני של ה־API ואת קיומו של האובייקט ig. לאחר מכן הוא שומר רק ערכים שקיימים במפורש. אם שדה כלשהו חסר, ברשומה נשאר null: הצבת אפס הייתה מערבבת ערך לא ידוע עם אפס אמיתי.

import json
import os
from datetime import datetime, timezone
from pathlib import Path
import requests
API_URL = "https://ig.jsonscraper.com/v1/user/by/username"
LICENSE_KEY = os.environ["JSONSCRAPER_INSTAGRAM_LICENSE_KEY"]
USERNAME = "apple" # החליפו בפרופיל מהרשימה שלכם
OUTPUT = Path("instagram-profile-snapshots.jsonl")
response = requests.get(
API_URL,
params={"username": USERNAME, "license_key": LICENSE_KEY},
timeout=30,
)
response.raise_for_status()
payload = response.json()
if payload.get("status") != "ok" or not isinstance(payload.get("ig"), dict):
raise RuntimeError("ה־API החזיר סטטוס או מבנה בלתי צפויים")
profile = payload["ig"]
record = {
"observed_at": datetime.now(timezone.utc).isoformat(),
"username": profile.get("username", USERNAME),
"pk": profile.get("pk"),
"follower_count": profile.get("follower_count"),
"following_count": profile.get("following_count"),
"media_count": profile.get("media_count"),
"is_verified": profile.get("is_verified"),
"is_private": profile.get("is_private"),
}
with OUTPUT.open("a", encoding="utf-8") as file:
file.write(json.dumps(record, ensure_ascii=False) + "\n")
print("תמונת מצב נשמרה:", record["username"], record["observed_at"])
השדות והמבנה שבדוגמה תואמים למידע על הפרופיל המתואר עבור הנתיב הזה. בקשה מוצלחת מחזירה תצפית ממועד הפנייה; כדי לנתח מגמות, יש להריץ את הסקריפט שוב ושוב ולשמור כל תמונת מצב. בעמוד IG Scraper API מוצגים בקשה בסיסית ותשובת הדגמה בפורמט JSON.
חישוב השינוי בין תמונות מצב
JSONL שומר רשומה אחת בכל שורה, ולכן אפשר לקרוא אותו באמצעות המודול הרגיל של Python. קטע הקוד הבא בוחר את שתי הרשומות האחרונות של פרופיל ומחשב את ההפרש במספר העוקבים. הוא מציג את התוצאה רק אם שתי הרשומות מכילות ערך מספרי.
import json
from pathlib import Path
rows = [
json.loads(line)
for line in Path("instagram-profile-snapshots.jsonl").read_text(encoding="utf-8").splitlines()
]
username = "apple"
profile_rows = [row for row in rows if row.get("username") == username]
profile_rows.sort(key=lambda row: row["observed_at"])
if len(profile_rows) >= 2:
previous, current = profile_rows[-2:]
old = previous.get("follower_count")
new = current.get("follower_count")
if isinstance(old, int) and isinstance(new, int):
print({
"username": username,
"from": previous["observed_at"],
"to": current["observed_at"],
"follower_delta": new - old,
})
ההפרש מתייחס במדויק לשתי התצפיות שנבחרו. אם מדלגים על הרצות, פרק הזמן ביניהן מתארך; לכן הדוח צריך להציג את שני התאריכים, ולא לכנות את השינוי „יומי” באופן אוטומטי. לעבודה סדירה, הגדירו הרצה מתוזמנת ב־cron או במתזמן של פלטפורמת ענן. ב־n8n אפשר להרכיב את אותו רצף פעולות מצומתי מתזמן, בקשת HTTP וכתיבת התוצאה למסד נתונים או לטבלה; שמות הצמתים וחיבור המאגר תלויים בהתקנה שלכם.
הרחבה למספר פרופילים
כדי לעבוד עם רשימת חשבונות, שמרו את השמות בקובץ נפרד ועברו עליהם בלולאה. שמרו את הסטטוס של כל בקשה בנפרד: כך תקלה בפרופיל אחד לא תמחק נתונים שהתקבלו בהצלחה עבור האחרים. הוסיפו מגבלת זמן המתנה, יומן שגיאות והרצה חוזרת רק לחשבונות שהבקשה עבורם נכשלה.
אפשר להשתמש ב־pk כמפתח לרשומה, אם ה־API החזיר אותו, ולשמור גם את שם המשתמש כדי להקל על הקריאה. המזהה מסייע להבחין בין פרופיל לבין תווית טקסט בדוח; אם הערך חסר, אין להמציא אותו או להחליפו בשדה אחר. לצורכי ניתוח, כדאי לשמור את זמן האיסוף המקורי ב־UTC ולהגדיר במפורש את תקופת ההשוואה.
אם למשימה די באיסוף מידע בתדירות מסוימת, הפרמטר המתועד cache_timeout מאפשר לציין את משך הקאש בשניות; כברירת מחדל, שמירת נתוני IG במטמון כבויה. בחרו משך בהתאם לתדירות הניטור ושמרו אותו עם הגדרות האיסוף, כדי להביא בחשבון את פרמטרי הבקשה בעת פרשנות התוצאות.
מה תקבלו בסוף
לאחר כמה הרצות יהיה לכם קובץ של תמונות מצב מתוארכות של מדדים פומביים, וכן הפרש פשוט שאפשר לחשב בין תאריכים נבחרים. אפשר לטעון אותו ל־Google Sheets, ל־PostgreSQL או למערכת אנליטיקה; שכבת עיבוד נפרדת תוכל ליצור התראה כאשר השינוי עובר סף שהצוות קבע. הסף הוא כלל עסקי שלכם, ולא יכולת מובנית של ה־API.
נתיב הפרופיל מחזיר שדות של חשבון, ולכן אם המשימה היא לבדוק פרסומים חדשים, נדרש איסוף מדיה מתאים — ולא הסקת מסקנות מתוך media_count. במדריך IG API מופיע נתיב נפרד לשליפת פרסומים, עם טעינה מדורגת לפי user_id והפרמטר end_cursor; השתמשו בו אם המשימה דורשת לבחון את הפוסטים עצמם. לתוצאה המתוארת כאן — טבלה היסטורית של מדדי פרופיל — די בבקשה אחת לכל משתמש ובשמירה חוזרת של תמונות מצב.
התחילו בפרופיל אחד ובשתי הרצות: ודאו שסטטוס התשובה תקין, שהתאריכים נשמרים ונתונים חסרים נותרים מסומנים בבירור כלא ידועים. לאחר מכן הוסיפו רשימת חשבונות ולוח זמנים. כך תקבלו תצפיות שניתן לשחזר, עם מרווח זמן וערכי מקור ברורים, שאפשר לבדוק ולהעביר הלאה לתהליך האנליטי.