Basis-SQLabfragen (Projekt: Instagramlocations)

Notiz für mich:
Auflistung der Standardabfragen, ohne Anspruch auf Tiefenanalysen.

(1) Statistiken, „KPI“
select count(*), count(distinct(filter)), count(distinct(url)), count(distinct(tag)), count(distinct(location)), count(distinct(username)), count(distinct(erstellzeit)) from locations;

(2) Überblick, Auflistung der erfassten Accounts
select username from locations group by username;

(3) Auflistung der erfassten Accounts zzgl. Zusammenzählung der Beiträge der jeweiligen Accounts
select username, count(username) from locations group by username order by count(username) DESC

(4) Auflistung der erfassten Accounts zzgl. Zusammenzählung der Beiträge der jeweiligen Accounts + Zusammenzählung der Locations
select username, count(username), count(distinct(location)) from locations group by username order by count(distinct(location)) DESC;

(5) Auflistung der erfassten Locations zzgl. Zusammenzählung der Locations
select location, count(location) from locations group by location order by count(location) DESC;

(6) Auflistung der erfassten Locations zzgl. Zusammenzählung der Locations bei Vorkommen eines Tags / Zeichenketten
select location, count(location) from locations where tag like '%gucci%' group by location order by count(location) DESC

(7) Auflistung der erfassten Usernames zzgl. Zusammenzählung der Usernames bei Vorkommen eines Tags / Zeichenketten
select username, count(username) from locations where tag like '%fashion%' group by location order by count(username) DESC

(8) Auflistung der erfassten Tags zzgl. Zusammenzählung der Tags bei Vorkommen von zwei gesuchten Tags / Zeichenketten
select tag, count(tag) from locations where (tag like '%fashion%') and (tag like '%woman%') group by location order by count(tag) DESC;

Hashtags: Auswertungen und Interpretation (Nicht-Nerdy)

Eines unserer wichtigsten Recherchetools sind und bleiben die Hashtagbeobachtungen auf Instagram. Hier erlebe ich immer wieder bei den vielen Gesprächen faszinierende Rückfragen zu allgemeinen Verständnis- und Interpretationsprobleme. Daher dieser Grundlagenartikel.

Am Beipiel der Themenwelt „Leipzig“ (hier: #leipzig) lässt sich das Monitoring so anstellen:

(1) Aufruf der App
(2) Suche nach dem Tag in der App
(3) Häufungszahl notieren
(4) Gehe zurück zu (1)

Über diesen (manuellen) Rechercheweg lassen sich nun Häufungsentwicklungszahlenreihen anlegen.

[Beispiel für #Leipzig]

Der Nicht-Nerd kann jetzt und nach Sichtung der Entwicklungen dieser Zahlen unfassbar spannende Fragen für sich und völlig unabhängig von diversen Socialmediaberater_innen und Influencermarketingagenturen beantworten:

(1) Wieviele neue Medien tauchen denn da zu den Tags / Themenwelten auf?
(2) Was gibt es denn sonst noch schönes zu der Hauptsuchphrase? (Siehe Screenshots, die Liste …)
(3) Wie entwickeln sich denn diese Nebenhashtags?
(4) Passt die Entwicklung (1-3) denn überhaupt auf die aktuelle Planung (hier: Contentmarketing, Zielgruppenerkenntnisse usw.)?

Diese Datenbankauffüllung und die Quasi-Forschung an den Hashtags lässt mich manchmal etwas lächeln, weil wir intern sehr viele Diskussionen rund um die Interpretationsvarianten der Zahlenveränderungen führen. Ich vertrete in manchen Situationen u.a. den Ansatz, dass die Differenz von Zahl (Z) zu Zahl (X) sagt: „Die Differenz entspricht punktgenau der Anzahl der Accounts, welche in dem Zeitraum aktiv sind“. Anne vertritt da einen anderen Ansatz und bemerkt immer mal wieder gern, dass auch eine Person 1000 Medien in einem kurzen Zeitabstand unter dem Tag #leipzig dort veröffentlicht. Ich denke, dass man zum finalen Kompromiss kommt, wenn man halt in der Betrachtung eine Fehlerquote einbaut und ich bevorzuge da – je nach Thema (!) – 33%-45%.

Zurück zur Datenerfassung.
Der beschriebene und manuelle Weg eignet sich natürlich für kleine Tagsammlungen und Projekte. Sucht man allerdings einen umfangreicheren Überblick, kommt man selbstverständlich nicht um die Anbindung an den Instagram-Endpoint umhin und hier dürfen die Leser_innen des Arbeitsblogs den eigentlichen Existenzgrund der Datenbanken finden. Sprich: niemand hat schlichtweg die Zeit, die Lust und die Ressourcen, um 1000-10.000 projektbezogene Tags jeden Tag zu suchen, die Zahlen aufzuschreiben und das Ganze auch auszuwerten.

So. Ich hoffe, dass meine Ausführungen zu den Hashtags etwas klarer geworden sind.

Fragen? Anregungen?

Wie kann ich interagierende Accounts mit Hilfe eines Instagrambugs auslesen?

In einer der letzten Vertriebs- und Verkaufsveranstaltung (Subthema: Erkennen und Bewerten von Accounts, Interaktionen usw.) wurde ich inspiriert, eine geeignete technische Lösung zu recherchieren, welche die Titelfrage beantwortet. Der Grund ist einfach: Durch die Beschneidung der Instagram-API ist die technische Erfassung o.g. Metriken schlichtweg nicht mehr möglich. Einen Ausweg bietet folgende Vorgehensweise:

[AbfrageURL]
https://www.instagram.com/[Accountname]/?__a=1

[Codekonzept]
lade_account_liste(datei,DB)
//-> Erfassen der Likenden
for l=0 to liste_ende do
begin
httpget(https://www.instagram.com/liste[l]/?__a=1
(1) extract(graphql->user->edge_owner_to_timeline_media->edges->[NrX]->node[X]->edge_media_preview_like->count)
(2) extract(graphql->user->edge_owner_to_timeline_media->edges->[NrX]->node[X]->edge_media_preview_like->edges->[NrY]->node[Y]->id)
(3) extract(graphql->user->edge_owner_to_timeline_media->edges->[NrX]->node[X]->edge_media_preview_like->edges->[NrY]->node[Y]->profile_pic_url)
(4) extract(graphql->user->edge_owner_to_timeline_media->edges->[NrX]->node[X]->edge_media_preview_like->edges->[NrY]->node[Y]->username)
end

[Erklärung]
„httpget“ = Ergebnis der Abfrage wird herunter geladen
„extract“ = Das Ergebnis der Abfrage wird nach der Variable durchsucht und die Inhalte werden im gewählten Format gespeichert.
„lade_account_liste“ = Die zu begutachtenden Accounts werden in Listenform (Textdatei, SQLTab etc.) in die Prozedur eingespielt.

Die Manuelle Sichtung der Ergebnisse kann man mit https://jsoneditoronline.org/ erledigen. Hier einfach die Abfrageurl https://www.instagram.com/[Accountname]/?__a=1 mit dem Accountnamen im Browser eintragen und das Resultat in den jsoneditor kopieren.

[Erklärung: Datensätze]
(1) Auslesen der aktuellen Likes als Zahl
(2) Auslesen des likenden Accounts in Form der InstagramID
(3) Auslesen der Profilbildurl des likenden Accounts
(4) Auslesen des likenden Accountnamens

[Fazit]
Ich bezeichne den begutachteten Erhebungsweg bewusst als „Bug“, da Instagram offziell das Erfassen dieser Datensätze im letzten API-Entwicklungsturnus geschlossen hatte. Nun mag man davon halten, was man möchte und ich sehe u.a. hier für mich den Beleg dafür, dass die geschlossenen Endpoints selbstverständlich nach wie vor aktiv sind. Vielleicht beschäftig sich Instagram mit der Bug-Bereinigung, vielleicht bleibt aber auch diese Abfragevariante „ewig“ offen. Die Sichtung des JSON-Codes zeigte mir, dass „leider“ nur eine begrenzte Anzahl an interagierenden Accounts auslesbar ist, aber auch dieses Problem lässt sich elegant über eine geeignete Timer-Variante lösen. Diese aktiviert im Prinzip im Sekundentakt den Scrapingvorgang und holt sich die gewünschten Datensätze ab, speichert und verarbeitet die Eintragungen. Hochfaszinierend ist in diesem Gedankenspiel die Metrik „Username“: Die Inhalte aus der Variable lassen sich in geeignete Listen übertragen und in das o.g. Grobkonzept einspielen. Über diesen Weg erfährt der wissensdurstige Dataminer alles aus dem Medienstream des Influenceraccounts / Accounts UND den Accounts, welche eben mit dem Hauptanalyseobjekt interagieren.

Hier setzt bei mir das kritische und hinterfragende Nachdenken an:
Welchen Wert haben umfangreiche Datenschutzerklärungen, wenn bspw. Social Media problemlos recherchierbare Lücken für die Datenerhebungen offen lassen?
Welchen Wert haben offzielle Ankündigungen und Umsetzungen zu API-Änderungen, gerade aus dem FB-Haus in Verbindung mit Cambridge Analytica?
Welchen Wert haben Äußerungen aus dem Hause Facebook bzgl. der Kontrolle der Datenzugriffe von Externen, wenn (a) dieser „Bug“ identifizierbar und (b) nutzbar ist?

Ich muss gestehen, dass ich einen gewaltigen Nutzen in diesen Datenerhebungsvarianten sehe. Natürlich habe ich über die Nutzbarmachung im Interesse der Wobus & Lehmann GbR nachgedacht, bin aber letztendlich davon abgekommen, weil mir derzeit kein sauberes Anonymisierungsverfahren bekannt ist. Ich finde es schade, dass die Influencer-Marketing-Agenturszene schweigt und keinerlei Analysen, Statements oder generell Worte zu dieser Datenproblematik veröffentlicht.

Wie kann ich Follower- und Abozahlen von beliebigen (offenen!) Accounts aus Instagram monitoren?

In einer der letzten Vertriebs- und Verkaufsveranstaltungen empfand ich Inspiration zur Recherche einer geeignenen technischen Lösung, welche die Titelfrage beantwortet. Der Grund ist einfach: durch die Beschneidung der Instagram-API ist die technische Erfassung o.g. Metriken schlichtweg nicht mehr möglich. Einen Ausweg bietet folgende Vorgehensweise:

[AbfrageURL]
https://www.instagram.com/[Accountname]/?__a=1

[Codekonzept]
lade_account_liste(datei,DB)
for l=0 to liste_ende do
begin
httpget(https://www.instagram.com/liste[l]/?__a=1
extract(graphql->user->edge_followed_by->count)
extract(graphql->user->edge_follow->count)
end

[Erklärung]
„httpget“ = Ergebnis der Abfrage wird herunter geladen
„extract“ = Das Ergebnis der Abfrage wird nach der Variable durchsucht und die Inhalte werden im gewählten Format gespeichert.
„lade_account_liste“ = Die, zu begutachtenden, Accounts werden in Listenform (Textdatei, SQLTab etc.) in die Prozedur eingespielt.

Die Umsetzung der technischen Lösung ist eigentlich relativ simpel via PHP, Delphi oder anderen Szenarien machbar. Ich würde, sofern ich Interesse hätte, hier einen zeitlichen Aufwand von maximal 1-2 Stunden inkl. Testen und Fehleranalyse einkalkulieren. Jedoch muss ich das Monitoren dieser Zahlen intern mit Anne ausdiskutieren, denn eigentlich berühren eventuelle Erfassungen natürlich auch aktuelle Datenschutzdiskussionen, denn: im Ergebnis der o.g. Abfrage befinden sich sämtliche Accountangaben aus dem Profil, die Historie der letzten Postings und auch (!) Auszüge der Likenden (also: ID, Username) auf den letzten Medien des analysierten Accounts. Hier stellt sich für mich auch die Frage, wie gut / praktikabel etc. der Einsatz der üblichen Instagramaccountbeobachtungswerkzeuge denn ist. Vielleicht werde ich das Thema etwas „entspannter“ betrachten, wenn ich eine saubere Codierungsfunktion gefunden oder erfunden habe.