Instagram, Scrapen & Erfassen von Location-URLs

Vor ein paar Tagen übernahmen wir von Roland Berger ein Projekt, welches u.a. die Trends und Kommunikationen aus den öffentlichen Räumen diverser Locations erfassen und bewerten soll.
Hier ist das Anlegen und Erfassen möglichst vieler Instagramlocations aus einem städtischen Raum eines der Hauptaufgaben der Datenerfassungsprozedur und ich entschied mich für den Weg über den Google-Index.

(1) Aufrufen der Indexurl
site:instagram.com/explore/locations/ „stadt land objekt“

(2) URLscraper
memo7.clear;
try
ovElements := WebBrowser2.OleObject.Document.all;
for i := 0 to (ovElements.Length - 1) do
begin
if (pos('?hl', ovelements.item(i))=0) and (pos('https://www.instagram.com/explore/locations/', ovelements.item(i))<>0) and (pos('&prev=search',ovelements.item(i))=0) and (pos('https://www.google.com/',ovelements.item(i))=0) then
begin
memo7.Lines.Add(ovElements.item(i));
end;
end;
except
end;
memo7.lines.BeginUpdate;
KillDuplicates(memo7.lines);
memo7.lines.EndUpdate;

(3) Bereinigung und Aufbereitung der Daten
Ausgehend von der Beispielurl https://www.instagram.com/explore/locations/1026498374/eltonel-bar/ wird nun die URLstruktur dahingehend sichtbar und logisch, dass der Ort des Locationcodes „1026498374“ erfassbar ist. Dieser wird aus der ursprünglichen Zeichenkette (hier: URL-String) mit Hilfe einer geeigneten Funktion extrahiert und zwecks Tiefenanalyse der Locationmedien in die Datenbank(en) gespeichert.

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.

Instagram – API (Beziehungsmanagement)

Für das Abarbeiten des „Beziehungsmanagement“ aus dem System „Instagram“ bieten sich die folgenden Endpoints an:

[followed-by]
Abfrage-URL: https://api.instagram.com/v1/users/self/followed-by?access_token=[Token]
Hier werden die eigenen Fans mit bis zu 20 Ergebnissen (je Durchlauf) zu den folgenden Inhalten ausgegeben: Username, ID, Real-Name (falls hinterlegt), Profilbild-URL). Aus dem Username lässt sich die Profil-URL so generieren, dass besagte Zeichenkette an „https://www.instagram.com/“ hinzugefügt wird.

[follows]
Abfrage-URL: https://api.instagram.com/v1/users/self/follows?access_token=[Token]
Hier werden die Accounts ausgegeben, welche man selbst folgt. Die Inhalte des Ergebnisses sind deckungsgleich mit „followed-by“.

Bei beiden Abfragevarianten ist auf die Variable (siehe Ergebnisfeed) „next_url“ zu achten. Diese lässt sich über eine geeignete Laufschleife // Zählschleife ansprechen und über diesen Weg sind die kompletten Listen auswertbar. Da hier von einer maximalen Ergebniszahl in Höhe von „20“ ausgegangen wird, wird die Metrik „Fans“ oder „Abos“ durch 20 geteilt und schon hat man die maximale Durchlaufzahl besagter Abfrageschleifen.

[Abgleich „follows“ zu „followed-by“]
Diese Funktion beschreibt die Lösung der Frage: „Wen folge ich, der / die mir zurück folgt?“ oder „Welcher Account folgt mir, den ich auch tatsächlich zurück folge?“
Eine Variante dieser Probe lässt sich über die
Abfrage-URL: https://api.instagram.com/v1/users/{user-id}/relationship?access_token=[Token]
lösen.
Eine andere Variante der simple Listenabgleich der vorhandenen und ausgewerteten Datensätze.

Die Tiefenanalyse der gewonnenen Userdatensätze lässt sich dann mit Hilfe des Abgleichs zu den Likes und Comments auf den Medien-Feed lösen. Hierüber stellt man dann fest, welcher Account besonders „aktiv“ ist, besonders häufig „liked“ und / oder besonders viele Kommentare absetzt.

Die Post-basierten API-Endpoints, bezogen auf das Usermanagement, (Veränderung der Beziehung, follow, unfollow usw.) werde ich zu einem späteren Zeitpunkt hier erklären.

[Todo] Instagramstatistik-Anwendung

Die eher unbefriedigenden Ergebnisse aus der Recherche „Welches Tool liefert aussagekräftige Zahlen aus dem Umfeld der Instagram-Account-Analyse?“ mündeten in Überlegungen zur Entwicklung einer eigenen Anwendung.

Die angepeilten Funktionen sind:

[Der Account]
Erfassen sämtlicher Posts
Erfassen der Likes und Kommentare je Post
Erfassen der aktiven Accounts (siehe Likes und Kommentare) je Post

[Die Fans]
Erfassen der Herkunft, falls auslesbar.
Filter: aktive Fans, Abgleich mit den erfassten Likes und Kommentare

[Accountgewichtung]
Zusammenzählen der Fans, Likes und Kommentare (Datum)

[Optional, Zusatzfeatures]
Download, Archivierung der Fotos aus dem Account
Vergleich von Accounts anhand der erfassten Daten
Abgleich: Fans und gefolgten Accounts zwecks Analyse und Optimierung

[Export, Reportfunktionen]
Formate: Excel, CSV, HMTL in tabellarischer Form

Durch die Vorarbeit und Analyse der Instagram-API schätze ich den Herstellungsaufwand der geplanten Anwendung als gering ein und ich gebe eine funktionsfähige BETA-Version im Laufe der kommenden Woche für die Kund_innen und Betatester_innen frei.

Die unterstützten Betriebssysteme sind Android und Windows.

Zielgruppenanalysen mit Instagram (Accounts und Locations)

Analog zu meinen Überlegungen sind natürlich auch Analysen zu den Orten der publizierten Fotos interessant. Diese lassen sich über die folgende API-Funktion erfassen:
https://api.instagram.com/v1/media/search?lat=[xxxxxxx]&lng=[yyyyyy]&access_token=[deintoken]
Die Funktion lässt sich um die Variable „DISTANCE“ erweitern und laut API-Dokumentation ist hier der voreingestellte Minimalwert „1km“ und der frei definierbare Maximalwert „5km“.

Man findet hier im Prinzip dasselbe Ergebnis wie bei dem Endpoint „Media=>Recent“ vor, dieses ist lediglich um die Angaben der einzelnen Accounts erweitert.

Die Einträge zu den Accounts lassen sich wie folgt auslesen:
[data][xyz][user][username] => Nickname, Accountname
[data][xyz][user][full_name] => falls hinterlegt, „Realname

Das Ergebnis aus der o.g. Abfrage beinhaltet weitere Angaben zu der konkreten Location. Diese lassen sich wie folgt auslesen:
[data][xyz][location][latitude]
[data][xyz][location][longitude]
[data][xyz][location][name] => Name der Location
[data][xyz][location][id] => interne ID der Location

Die ausgelesene ID lässt sich nun für die Beobachtung und Bewertung einzelner (Unter)locations (Beispiel: Hauptlocation => Paris, Unterlocation => Eifelturm) weiter verwerten. Die API-Abfrageurl lautet hierfür: https://api.instagram.com/v1/locations/[id]/media/recent?access_token=[deintoken] und die Verwertung entsprechender Ergebnisse hatte ich im Artikel „Analyse auf Ebene der Posts“ beschrieben. Bei sauberer Durchführung von Langzeitanalysen lässt sich unter Einbeziehung der Variablen „Likes„, „Comments„, „Fananzahl der Accounts“ die „Beliebtheit“ oder auch wirtschaftliche Werthaltigkeit von – z.B. – touristisch interessanten Sehenswürdigkeiten, Denkmälern, Strände oder auch Städte begutachten und dauerhaft beobachten.

Die „manuelle“ Begutachtung der Location lässt sich über das folgende Schema realisieren: https://www.instagram.com/explore/locations/[id]/.

Beispiele sind:
Tour Eiffel
Höfe am Brühl (Leipzig)
Thomaskirche (Leipzig)
MSC Mattstedt (bei Apolda)
Mc Donalds Apolda
Weimar
Rom – Iceclub

Interessant ist hier natürlich auch die Verbindung zur Hashtaganalyse, da man hier Hinweise oder interpretationsfähige Grundlagen für das aktuell besprochene „User Intent“ finden kann.

Eine Erweiterung der Analysedatenbanken ist geplant und wir werden die konkreten Freigabemodalitäten noch intern diskutieren.

Belboon – API, Auslesen der offenen Transaktionen


$report_url='http://ui.belboon.com/export/events/?key=deinkey&type=ls';
$homepage = file_get_contents($report_url);
$homepage = str_replace('"', '', $homepage);
$homepage = explode("\n", $homepage);
foreach($homepage as $transaction)
{
$arr_transaction = explode(';', $transaction);
if ($arr_transaction[1] == "offen")
{
$commission=$commission+$arr_transaction[10];
}
}
echo "Belboon: ".$commission."
";

Das Script muss auf den jeweiligen Key angepasst werden. Diesen findet man bei Belboon im Backend unter Statistik => Eventliste => Downloadlink.
Bei der Sichtung der APIs von Belboon, Superclix, Adcell, Groupon und Andere ist mir aufgefallen, dass sich hier Transaktionen „nur“ nach den Status „offen“, „bestätigt / ausgezahlt“ und „abgelehnt“ / Storno filtern lassen. Die Zahlen beschreiben also ausschließlich die „offenen“ Transaktionen, bestätigte oder zur Zahlung freigegebene „Events“ werden hier leider nicht berücksichtigt.

Auslesen der offenen Transaktionen aus der Adcell-API


$StartDate = time()-180*86400;
$EndDate = time();
$report_url = 'http://www.adcell.de/csv_affilistats.php?sarts=x&pid=a&status=a&subid=&eventid=a';
$report_url .= '×tart='.$StartDate;
$report_url .= '&timeend='.$EndDate;
$report_url.= '&uname=username';
$report_url .= '&pass=passwort';
$homepage = file_get_contents($report_url);
$homepage = utf8_encode($homepage);
$homepage = str_replace('"', '', $homepage);
$homepage = explode("\n", $homepage);
foreach($homepage as $transaction)
{
$arr_transaction = explode(';', $transaction);
if ($arr_transaction[7] == "offen")
{
$arr_transaction[9] = str_replace(',', '.', $arr_transaction[9]);
$adcell=$adcell+$arr_transaction[9];
}
}
echo "Adcell: ".$adcell."
";

Das Auslesen der Datensätze aus der Adcell-API funktioniert nach dem selben Schema wie bei Superclix und Groupon. Die Zugangsdaten – also die Variablen „uname“ und „pass“ – lassen sich im Backend finden und wurden in einem entsprechendem Beitrag bereits erläutert.

Auslesen der offenen Transaktionen aus der Groupon-API


$EndDate = date('Y-m-d');
$startddate = date('Y-m-d', strtotime('-3 month'));
$report_url = 'https://partner-int-api.groupon.com/reporting/v2/campaignActivity.csv?clientId=deineid&group=date&date=['.$startddate.'&date='.$EndDate.']&campaign.currency=EUR';
$homepage = file_get_contents($report_url);
$homepage = utf8_encode($homepage);
$homepage = str_replace('"', '', $homepage);
$homepage = explode("\n", $homepage);
foreach($homepage as $transaction)
{
$arr_transaction = explode(',', $transaction);
$gcommission=$gcommission+$arr_transaction[14];
}
echo "Groupon: ".$gcommission."
";

Die Beendigung der Partnerschaft von Groupon / Zanox machte neulich die Anbindung des Groupon-Partnerprogramms notwendig. Das Script behandelt hier nur (!) die Ausgabe der CSV-basierenden Reports, man kann natürlich die Formate „JSON“ und „XML“ verwenden, wenn die „report_url“ in der Form „campaignActivity.[format]“ angepasst wird. Die Variable „deineid“ verlangt einen speziellen API-Reporting-Code, den man sich über die Profilansicht besorgen kann. Weitere Informationen zur API und den auslesbaren Daten findet man im „Help-Center„.

[Notiz] Pinterest-API

Auslesen der letzten Pins zu einer bekannten Domain

https://api.pinterest.com/v3/domains/[domain.com]/pins/recent/?access_token=[deintoken]

Auslesen von Pins nach einer thematischen Suche

https://api.pinterest.com/v3/search/pins/?join=[suchraum]&page_size=50&query=[suchwort]&access_token=[deintoken]

Auslesen von Userdaten

https://api.pinterest.com/v3/users/[username]/?access_token=[deintoken]

Suchen von Pins aus einem bekannten Domainraum

https://api.pinterest.com/v3/domains/[domain.com]/search/pins/?query=[suchwort]&access_token=[deintoken]

Facebook Search-API, Posts und Pages

[Datenrecherche via FB-Pages]

https://graph.facebook.com/search?q=[Suchphrase]&type=page&limit=[Ausgabelimit]&access_token=[DeinToken]

Diese Abfrage verlangt natürlich einen vorher generierten Token. Sie ist mit einer entsprechenden Suchphrase und der Ausgabelimitierung (max. Ergebnisse, etc., max. 100) zu „füttern“ und zeigt im Endeffekt alle Pages nach dem einzugebenden Suchbegriff. Die Datenausgabe erfolgt hier im JSON-Format und hier sind die folgenden Variablen interessant:

  1. category (Zeigt die Kategorie der gefundenen „Page“.)
  2. name (Zeigt den Namen der gefundenen „Page“.)
  3. id (Zeigt die FB-ID der gefundenen „Page“.)

Die Kategorien erlauben eine feinere Auswertung der Pages, also: Geschäfte, private Seiten, Fanpages etc. und hieraus lassen sich im Nachgang weitergehende Analyseprozeduren anstellen.

[Datenrecherche via FB-Posts]

https://graph.facebook.com/search?q=[Suchphrase]&type=post&limit=[Ausgabelimit]&access_token=[DeinToken]

Diese Abfrage verlangt die Eingabe des Tokens, der Suchphase und des Limits. Das Ausgabelimit ist hier auf maximal 100 Ergebnisse begrenzt, lässt sich allerdings über die Einbeziehung der „nextpagetokens“ erweitern. Man kann diese Posts-Abfrage auf die Ausgabe von Hashtags über die Umwandlung von „#“ in „%23“ realisieren. Das Ausgabeformat ist „JSON“ und es lassen sich hier neben Autor und den „üblichen“ relevanten Variablen auch Likes und Shares auslesen. Die interessanten Variablen sind hier „name“ und „description“, wobei man letztere über eine der bekannten Textanalyseverfahren auswerten kann.