המטרה
כלי Python חוזר שמושך פרופיל, פוסטים ו-Reels מכל URL באינסטגרם בלי דפדפן — פלט JSON מובנה, pagination מלא עם cookies, תלויות מינימום.
הפתרון
סקריפט CLI יחיד שמזהה סוג URL ומפעיל את שרשרת ה-API המתאימה: לפרופיל, טעינת HTML לחילוץ LSD+cookies, קריאת REST web_profile_info/ עם GraphQL PolarisProfilePageContentQuery כ-fallback. לפוסטים/Reels, PolarisProfilePostsQuery עם cursor pagination. לפוסט/Reel בודד, HTML גולמי + oEmbed ללא auth.
עיקרי הדברים
- ארבעה סוגי URL מטופלים ב-CLI יחיד
- Fallback REST → GraphQL מנטרל flakes של 429
- Auth עם cookies פותח pagination מלא
- בלי דפדפן — requests טהור, מהיר דרמטית מ-Playwright
האתגר
ה-GraphQL הפנימי של אינסטגרם דוחה בקשות שלא נראות בדיוק כמו דפדפן.
לכידת הבקשה המדויקת מ-DevTools, חילוץ APP_ID/BLOKS_VERSION_ID/DOC_ID לקבועים, ו-GET ראשוני ל-/username/ שמושך LSD + cookies.
ה-REST הציבורי מחזיר 429 לעיתים, במיוחד בלי cookies.
משיכה בשני שלבים — REST ראשון, GraphQL PolarisProfilePageContentQuery כ-fallback ב-429.
GraphQL בלי auth מחזיר רק 12 פריטים — has_next_page false מיד.
קלט cookies דרך --cookies (string) או --cookies-file (JSON); session מתווסף לכל בקשה ומאפשר pagination אמיתי.
URLs בודדים של פוסט/Reel בצורה שונה — ה-GraphQL לא מתאים.
ל-/p/CODE/ ו-/reel/CODE/ שמירת HTML גולמי וקריאה ל-/api/v1/oembed/?url=... למטא-דאטה. שני פלטים ל-URL.
מה נמסר
- fetch_instagram_profile.py CLI יחיד
- requirements.txt (תלויות מינימום)
- Reference captures (web_profile_info, fetch_query, posts_fetch, reels_fetch) + תגובות
- README עם הוראות חילוץ cookies
- פלטים לדוגמה
תוצאות
4
סוגי URL
Anonymous / Cookies
מצבי auth
REST → GraphQL
Fallback
Headless (requests)
ריצה
מה זה לימד אותי
- ל-APIs של אינסטגרם/פייסבוק, לכידת בקשה מדפדפן מהירה מ-reverse engineering
- Fallback REST → GraphQL הופך 429 ל-non-issue
- requests headless מהיר דרמטית מ-Playwright כש-APIs זמינים
