Wie wir 1000 Instagram-Posts in 3 Minuten analysieren
Als wir Castyourlayer entwarfen, standen wir vor einer Herausforderung. Wenn ein neuer Creator auf unsere Plattform kommt, wollen wir ihn nicht mit standardisierten Formularen nerven wie „Was ist deine Nische?“ oder „Wie würdest du deinen Stil beschreiben?“. Wir wollen seine echten Daten sprechen lassen. Um den Schreibstil, die Hook-Formeln, die Farbschemata und die inhaltlichen Säulen eines Profils präzise zu extrahieren, analysieren wir die historische Content-Performance. Aber: Wer 1000 Posts (Reels, Karussells, Bilder) einzeln scrapt, transkribiert und durch ein LLM jagt, scheitert sofort an Serverless-Timeouts und API-Kosten. Hier ist der technische Einblick, wie wir diese Pipeline gebaut haben, damit sie in unter 3 Minuten stabil durchläuft.
Das Problem mit Serverless & Instagram-Daten
Wenn man eine moderne SaaS-Anwendung auf Vercel hostet, läuft der Code standardmäßig in kurzlebigen Serverless-Funktionen. Diese Funktionen haben in den meisten Tarifen ein hartes Limit von 10 bis 30 Sekunden Ausführungszeit (maximal 300 Sekunden). Das reicht für normale API-Aufrufe völlig aus. Eine tiefe Profil-Analyse ist jedoch kein normaler API-Aufruf.
Eine naive Implementierung würde so aussehen:
1. Frage 1000 Posts über eine API an.
2. Lade für jedes Reel das Video herunter, transkribiere den Ton und mache OCR auf den Frames.
3. Analysiere jedes Karussell Bild für Bild.
4. Übergib alles an Claude Sonnet und berechne die Stilstruktur.
Das Ergebnis: Ein garantierter Funktions-Timeout nach ein paar Sekunden, unkontrollierbare API-Kosten im dreistelligen Bereich pro Account-Scan und ein frustrierter Nutzer vor einem hängenden Ladebalken.
Schritt 1: Der Scraping-Broker (Apify)
Instagram sperrt IPs, die ohne Login massenhaft Profile aufrufen, innerhalb von Sekunden. Der Aufbau einer eigenen Proxy-Rotations-Infrastruktur ist komplex, wartungsintensiv und teuer. Stattdessen setzen wir auf **Apify** als spezialisierten Scraping-Broker.
Unser System triggert über eine Serverless-Route einen gezielten Run auf Apifys Instagram-Profile-Scraper. Das geniale an Apify: Wir können den Job asynchron starten. Der Scraper sammelt die rohen Metadaten der letzten Beiträge und schickt das Ergebnis per Webhook zurück an unsere Anwendung, sobald er fertig ist. Wir blockieren somit keine Vercel-Ressourcen während des reinen Datensammelns.
Schritt 2: Die Weichenstellung (Shallow vs. Deep Scan)
Nicht jeder Post ist für die Analyse des Profil-Stils gleich wichtig. Ein Text-Post vor zwei Jahren hat weniger Relevanz als das virale Reel von letzter Woche. Daher haben wir eine zweistufige Pipeline entwickelt:
1. Der Shallow Scan (Schnellanalyse)
Sobald der Apify-Webhook bei uns eingeht, schreiben wir die rohen Metadaten aller Posts direkt in unsere Supabase-Datenbank. Hierzu zählen Captions, Likes, Kommentare, Post-Typen und das Veröffentlichungsdatum. Dieses Schreiben von 1000 Zeilen dauert weniger als 2 Sekunden. Anschließend berechnet ein Datenbank-Trigger sofort die Engagement-Rate für jeden Beitrag und sortiert das gesamte Sample.
2. Der Deep Scan (Tiefenanalyse)
Anstatt alle Reels und Karussells vollständig zu analysieren, filtern wir die Top 25 Beiträge mit der höchsten Engagement-Rate heraus. Nur diese wandern in die rechenintensive „Deep Analysis“-Queue. Die verbleibenden 975 Posts verbleiben im Shallow-Zustand. Ihr Engagement fließt in die globalen Statistiken ein, aber wir verschwenden keine API-Credits darauf, ihre Tonspuren zu transkribieren oder Bild-Scans durchzuführen. Diese Selektion reduziert das zu verarbeitende Datenvolumen um über 90 %.
Schritt 3: Parallele Audio- und Bildanalyse
Selbst bei nur 25 verbleibenden Deep-Scan-Beiträgen würde ein sequenzielles Abarbeiten (einer nach dem anderen) mehrere Minuten dauern. Die Lösung liegt in rigoroser Parallelisierung über `Promise.all` in Node.js.
Reel-Transkription via Whisper
Für die Top-Reels lädt unser Node-Worker die Audio-Spur als komprimierten Stream herunter und übergibt sie an OpenAIs **Whisper-API**. Da Whisper extrem optimiert ist, bekommen wir das Text-Transkript eines 60-Sekunden-Reels in meist unter 1,5 Sekunden zurück.
Karussell-Bildanalyse via Claude Haiku
Karussell-Posts bestehen oft aus bis zu 10 Slides. Ein naiver HTTP-Aufruf pro Slide wäre ein klassisches N+1 Problem. Stattdessen nutzen wir das Bild-Verständnis von **Claude 3 Haiku**. Wir bündeln die URLs aller Slides eines Karussells in einen *einzigen* API-Aufruf an Anthropic. Haiku liest die Texte auf den Bildern per OCR aus und beschreibt uns das visuelle Layout (Schriftgrößen, Kontraste, Hintergrundfarben) in einem konsolidierten JSON-Format.
Der Zeitgewinn: Statt 10 separate API-Anfragen zu schicken (ca. 15 Sekunden), erhalten wir die komplette Inhalts- und Design-Analyse eines gesamten Karussells in nur 1,8 Sekunden.
Schritt 4: Warum wir Supabase statt MongoDB gewählt haben
Bei dokumentenorientierten Daten wie Social-Media-Posts greifen viele Web-Entwickler reflexartig zu MongoDB. Wir haben uns bewusst für **Supabase (PostgreSQL)** entschieden. Die Gründe sind rein pragmatischer Natur:
1. Relationale Integrität
Die Verknüpfung zwischen dem Benutzerprofil (`profiles`), den gescrapten Post-Daten (`own_posts`) und dem Fortschritt des aktuellen Scans (`profile_analysis_jobs`) ist inhärent relational. In Supabase können wir über Fremdschlüssel (`REFERENCES`) garantieren, dass beim Löschen eines Accounts auch alle zugehörigen Posts rückstandslos und atomar aus der Datenbank entfernt werden (Cascading Delete).
2. Effiziente Indizes & Joins
Um festzustellen, ob wir einen Post bereits analysiert haben, führen wir bei jedem Retry oder Resume-Vorgang einen Abgleich durch. Mit einem zusammengesetzten Postgres-Index über `(user_id, instagram_post_id)` dauert dieser Lookup im Schnitt 0,2 Millisekunden. Postgres kann diese Indizes im RAM halten, wodurch Suchabfragen extrem skalieren.
3. Strukturierte Flexibilität mit JSONB
Postgres erlaubt es uns, strukturierte JSON-Daten nativ in einer `jsonb`-Spalte zu speichern. Wir nutzen das für das Feld `analysis_queue` in der Job-Tabelle. Wir vereinen damit das Beste aus beiden Welten: Die absolute Konsistenz einer relationalen Tabelle für IDs und Statuswerte, gepaart mit der schemalosen Flexibilität eines JSON-Dokuments für den transienten Fortschritt der Analyse-Queue.
Fazit: Daten schlagen Bauchgefühl
Durch die Kombination aus asynchronem Scraping, der Trennung in Shallow- und Deep-Scans sowie der Bündelung von Vision-Anfragen an Claude Haiku haben wir die Analyse-Zeit von anfangs über 7 Minuten auf **durchschnittlich 160 Sekunden** gesenkt.
Das Ergebnis für den Nutzer: Ein sauberer, schneller Onboarding-Prozess. Und das Ergebnis für die Generierungs-Qualität: Der anschließende Content-Entwurf basiert nicht auf generischen Prompts, sondern auf der echten Daten-DNA des eigenen Instagram-Kanals.
Bereit, deine eigenen Posts analysieren zu lassen? Verbinde deinen Account und starte deinen persönlichen Scan.
Jetzt Profil analysieren →Apify Instagram Scraper API, OpenAI Whisper API Guide, Anthropic Claude Vision Docs.