Projekt InstaLOC, Aktuelle Statistiken

Der aktuelle Datenbestand umfasst:

587.903 Locations inkl. Geocodes, IDs und Namen
12.669.502 Unique Tagclouds
5.633.457 Beiträge ohne Locationzuordnung
8.516.617 Beiträge mit Locationzuordnung
4.863.200 codierte User
10.700.170 Unique Zeitstempel (Beiträge)

Die Masterdatenbank umfasst alle erfassten Datensätze und die Scrapingtechnologie schafft das genannte Volumen innerhalb von 3-4 Werktagen.

Datenbanken, Bigdata und die Aufbereitung der Abfragen

Nach Durchsicht der aktuellen Datenbasis aus den Projekten „HashtagDB“ und „InstaLOC“ musste ich etwas nachdenken und mir eine Lösung zur Aufbereitung der extremen Datenfülle überlegen. Das Problem ist, dass zwar via SQLite-Studio und der integrierten SQL-basierten Abfragemöglichkeiten gute Abfrage- und Auswertungsmöglichkeiten vorliegen, jedoch lassen sich keinerlei Gewichtungsprozeduren hier realisieren. Ein angedachter Lösungsweg war die Anbindung von Excel via der bereitgestellten API. Trotz (technischer) Realisierbarkeit tauchten auf verschiedenen Rechnern immer wieder Ressourcenprobleme auf. Ich entschied mich heute (final) für eine 3-Stufenlösung:

(1) Vorgewichtung
Die Vorgewichtung erfolgt via SQLite-Studio in Form der – hier dokumentierten – Abfragen. Wir, oder ein geschulter Externer, setzen entsprechende Metaebenenanfragen an die Datenbanken ab und extrahieren die Ergebnisse im Standard-CSV-Format.
Metaebenenanfragen können sein:
(a) Gib mir alle Tagwolken aus dem Zeifenster 08-2018 aus, die mind. zum Inhalt „urlaub“ haben und in dem Raum Leipzig gepostet wurden.
(b) Zeige mir die beliebtesten Postings aus dem Raum Berlin mit Inhalt „Schmuck“.

(2) Nachgewichtung
Die Nachgewichtung erfolgt hier mit Hilfe einer kleinen Software. Diese importiert die Ergebnisse aus der „Vorgewichtung“ und liefert über geeignete Berechnungsfunktionen Interpretationshinweise zu:
(a) Welche Beziehungen existieren zwischen den Hashtags?
(b) Welche Beziehungen existieren zwischen den Tags, den Locations und den aktiven Accounts?
(c) Wer gewichtet Trends in welchem Zeitfenster, an welcher Location?

(3) Interpretation und Reporting
Die Nachgewichtungssoftware exportiert die generierten Gewichtungsergebnisse in ein geeignetes Standarformat, welches von Openoffice und Excel akzeptiert wird. Die grafische Auswertung und die Aufbereitung für nachgelagerte Beratungsgespräche und Interpretationen im Team / bei den Kund_innen findet genau in diesem Umfeld statt.

Privat vertrete ich den Anspruch an die absolute Transparenz bzgl. der Rohdaten / der Datensätze. Ich habe aber auch, nach verdammt vielen Diskussionen, verstanden, dass 4-20GB große Datensätze von Geschäftsfreund_innen und Kund_innen nicht behandelbar sind. Daher der skizzierte Kompromis der Aufbereitung via Excel, Powerpoint & Co. und Quercheck auf die gefilterten Daten aus der „Nachgewichtung“.

Anfragen, Hinweise oder Nachfragen gerne via Kommentar, eMail oder Telefon.

Hinweis: SQLite-Dateien in Excel öffnen und da weiter verarbeiten (InstaLOC und HashtagDB)

Irgendwer aus dem „Netzwerk“ gab mir bei einem Telefonat einen interessanten Hinweis zu den Potentialen von Excel. Wir sprachen da u.a. darüber, dass die freigegebenen SQLite-Datenbanken aus den Projekten „Hashtag-Reichweiten“ und „InstaLoc“ zu viele Auswertungs- und Analyseprobleme provozieren können.

Eine Option beschreibt
https://yourbusiness.azcentral.com/connecting-excel-sqlite-12971.html

und man benötigt für die dargestellte Funktion das Plugin http://www.ch-werner.de/sqliteodbc/.

Möchte man hierüber unsere Dateien anbinden, muss an der entsprechenden Einlesestelle (siehe verlinkter Blogbeitrag!) die Option „SQLite-3“ ausgewählt werden. Die nachgeschaltete EXCEL-Oberfläche ist relativ selbsterklärend. Mit den konkreten Auswertungsfunktionen habe ich mich nicht beschäftigt und ich kann an der Stelle auch keinerlei Support zu den Queries geben.

InstaLOC: Freigabe der ersten Themendatenbank (Home&Living)

Gestern veranlasste ich die Freigabe der ersten Datenbank, welche den DACH-Raum und Teile der EU nach den Themenwelten der Sparte „Home & Living“ abbildet.

Die Grunddaten der SQLite-Datei sind:

Speicher: ca. 5GB
Beiträge: 8.532.446
User_innen: 2.495.311
Locations: 473.903
Medienzeitstempel: 4.863.183

Interessierte Leser_innen des Arbeitsblogs können sich zu der Datenbank unter den folgenden Auszügen weitergehende Eindrücke verschaffen:

(1) Locationliste + Sum(Postings), unverschlüsselt
https://drive.google.com/open?id=18rVNt2zTfKBmUl606O-L1mMsExvhI4iH
(2) Locationliste + Sum(Likes), unverschlüsselt
https://drive.google.com/open?id=1S3QMkwyo82w3SkH7YhrlZoixZRNlsSiI
(3) Medienpostzeitstempel, unverschlüsselt
https://drive.google.com/open?id=1EtRVSRuFhI5oyE9s6KHBcGKrDF_ARMRv
(4) Tagwolkenliste, unverschlüsselt
https://drive.google.com/open?id=14tXw59I3ky7_bbQ5znG_D4dSGo0rYfkw

Hinweise:
Hinter den CSV-Dateien stehen entsprechende SQL-Statements, die in diesem Blog dokumentiert wurden und dokumentiert werden. Die Datensätze sind unkategorisiert und nicht interpretiert: sie befinden sich quasi in einem Rohdatenzustand.

Supportanfragen, Interpretationsanfragen oder Anfragen zur Strategieableitung bitte an:
Anne Lehmann: office(at)pontipix.de (Wobus & Lehmann GbR), Preisliste unter: https://www.pontimania.de/
Dr. Klaus Holthausen: https://www.linkedin.com/in/dr-klaus-holthausen-1464b043/

Notiz: Diverse SQL-Abfragen für den Komplex „InstaLOC“

(A) Statistiken, Allgemeines
(1) Komplettüberblick
select count(url) as Beiträge, count(distinct(username)) as Nutzer_innen, count(distinct(location)) as Locations, count(distinct(filter)) as Fotofilter, count(distinct(erstellzeit)) as Medienzeitstempel, sum(likes) as Summe_Likes, sum(comments) as Summe_Kommentare from locations;

(2) Überblick nach Locationfilter
select count(url) as Beiträge, count(distinct(username)) as Nutzer_innen, count(distinct(location)) as Locations, count(distinct(filter)) as Fotofilter, count(distinct(erstellzeit)) as Medienzeitstempel, sum(likes) as Summe_Likes, sum(comments) as Summe_Kommentare from locations where location like '%germany%';

(3) Überblick nach Tagfilter
select count(url) as Beiträge, count(distinct(username)) as Nutzer_innen, count(distinct(location)) as Locations, count(distinct(filter)) as Fotofilter, count(distinct(erstellzeit)) as Medienzeitstempel, sum(likes) as Summe_Likes, sum(comments) as Summe_Kommentare from locations where tag like '%hausbau%'

(4) Überblick nach Tag- und Locationfilter
select count(url) as Beiträge, count(distinct(username)) as Nutzer_innen, count(distinct(location)) as Locations, count(distinct(filter)) as Fotofilter, count(distinct(erstellzeit)) as Medienzeitstempel, sum(likes) as Summe_Likes, sum(comments) as Summe_Kommentare from locations where (tag like '%hausbau%') and (location like '%germany%');

(5) Auflistung der Nutzer_innen mit Summe der „produzierten“ Likes
select distinct(username) , Anz_Likes from(
Select username, sum(likes) as Anz_likes from locations GROUP BY username ) as my_table order by Anz_likes DESC;

(6) Auflistung der Nutzer_innen mit Summe der verbundenen Locations, absteigend
select distinct(username) , Anz_Locations from(
Select username, count(location) as Anz_Locations from locations GROUP BY username ) as my_table order by Anz_Locations DESC;

(7) Auflistung der Nutzer_innen+Location zzgl. der Medienanzahl (Summe), absteigend
select username , location , Anz_Locations from(
Select username, location, count(location) as Anz_Locations from locations GROUP BY username ) as my_table where location like '%berlin%' order by Anz_Locations DESC;

(8) Tiefenprüfung auf einen Useraccount+Anzahl-Postings/Locations, absteigend
select username , location , Anzahl_Postings from(
Select username, location, count(location) as Anzahl_Postings from locations GROUP BY username ) as my_table where (location like '%berlin%') and (username = 'share') order by Anzahl_Postings DESC;

(9) Stadtrecherchen aus den Themenweltendatenbanken
select location from locations where (location like '%titude":51.339%') and (location like '%itude":12.377%')
Hinweise:
– Beispiel ist Leipzig
– weitere Städte unter http://www.fwiegleb.de/geo-a.htm

(10) Bereinigte Ausgabe der Tagwolken
select distinct(REPLACE(tag,'%22','"')) as Tagwolke from locations;

(11) Bereinigte Ausgabe der Locations inkl. Aufsummierung der Likes
SELECT distinct(location) as Orte, Anz_Likes from(
Select location, sum(likes) as Anz_likes from locations GROUP BY location ) as my_table order by Anz_Likes DESC;

(12) Bereinigte Ausgabe der Locations inkl. Aufsummierung der Postings
SELECT distinct(location) as Orte, Anz_User from(
Select location, count(username) as Anz_User from locations GROUP BY location ) as my_table order by Anz_User DESC

Hinweise:
– Durch die DB-Struktur werden die Beiträge „username“ zugeordnet und „username“ = „Beitrag“.

(B) Recherchen: Tagwolken
(1) Auflistung aller Tagwolken mit Aufsummierung der Likes, absteigend

SELECT distinct(tag) as Tagwolke, Anz_Likes from(
Select tag, sum(likes) as Anz_likes from locations GROUP BY tag ) as my_table order by Anz_Likes DESC

Hinweise:
(a) Bei Recherche nach den Comments, kann „likes“ zu „comments“ ausgetauscht werden.
(b) Die Abfrage listet alle Tagwolken – ungefiltert – auf und sortiert die Ergebnisse nach der Summe der Likes, welche durch die Tagwolken „produziert“ wurden.

(2) Auflistung der Tagwolken nach Suche mit Aufsummierung der Likes, absteigend

SELECT tag as Tagwolke, Anz_Likes from(
Select tag, sum(likes) as Anz_likes from locations GROUP BY username ) as my_table where tag like '%leipzig%' order by Anz_Likes DESC

Hinweise:
(a) Bei Recherche nach den Comments, kann „likes“ zu „comments“ ausgetauscht werden.
(b) Die Abfrage listet alle Tagwolken – ungefiltert – auf und sortiert die Ergebnisse nach der Summe der Likes, welche durch die Tagwolken „produziert“ wurden.

InstaLOC: Etablierung der Themenwelten-Datenbanken und Datenauszüge aus dem Komplex „Home & Living“

Inhalte der Datenbank: ca. 12.000 * 2000 Beiträge aus „Home&Living“-bezogenen Themenabfragen
Speichergröße der Datenbank: ca. 1.6GB, Format: SQLite

Beispielrohdatensätze
Abfrage via SQLiteStudio
select REPLACE(tag,'%22','"') as Tagwolke, likes, comments, location, erstellzeit from locations where tag like '%[keyword]%'

Datenlinks (CSV)
(1) Tagwolke: Carport.csv (2MB)
(2) Tagwolke: Hausbau.csv (gepackt: 10MB, entpackt: 64MB)
(3) Tagwolke: Haus.csv (gepackt: 27MB, entpackt: 147MB)

CSV-Schema
Tagwolke|Likes|Coments|Location(Geocode+ID+Titel)|Erstellzeitstempel

Allgemeine Datensätze
(1) Liste: Locations.csv (gepackt: 7MB, entpackt: 23MB)

Hinweise
Durch die modifizierte Abfrage wurde die Tagwolke etwas lesbarer gemacht. Man muss bei der Sichtung und Prüfung jedoch die Umlaute und Piktogramme bei Bedarf noch umwandeln, oder eben auf unseren Client zurückgreifen. Die Beispieldatensätze beinhalten nicht die Postingurl, Fotofilter und Usernames und erlauben daher keinerlei Rückschlüsse auf eventuelle Influencer. Diese Angaben werden bei Buchung der kostenpflichtigen Angebote (Workshops, Datenabfragen etc.) offen gelegt und – bei Bedarf – erklärt.

InstaLOC: Accountrecherchen auf Basis der Likes und Comments

Die modifizierten Datenbankspalten erlauben nun genauere Accountbegutachtungen für Influencerrecherchen, Suche nach Trendursprüngen und die folgenden Queries verdeutlichen die Anwendungsszenarien:

(1) User zu Location
SELECT location, username as Nutzer, Anz_Likes from(
Select location, username, sum(likes) as Anz_likes from locations GROUP BY username ) as my_table
where location like '%hotel%' order by Anz_Likes DESC

Diese Abfrage verschafft einen Überblick zu den Usernames. Hierbei werden die Beiträge den Locations zugeordnet und die Likes aufsummiert.
Aufgaben:
(a) Auflistung der Accounts, welche bei den Locations eventuell Trends setzen
(b) Auflistung der Influenceraccounts, welche an den Locations für Reichweite sorgen (können)

(2) Userbewertung – Basis
SELECT username as Nutzer, Anz_Likes from(
Select username, sum(likes) as Anz_likes from locations GROUP BY username ) as my_table order by Anz_Likes DESC

Diese Abfrage verschafft einen Überblick zu den Usern in Verbindung mit den aufsummierten Likes.
Aufgaben:
(a) Erste Grobrecherche

(3) User zu Location und Zeitfenster
SELECT location, username as Nutzer, Anz_Likes from(
Select location, erstellzeit, username, sum(likes) as Anz_likes from locations GROUP BY username ) as my_table
where (erstellzeit like '%.2016%') and (location like '%hotel%') order by Anz_Likes DESC

Diese Abfrage verschafft einen Überblick zu den Usernames. Hierbei werden die Beiträge den Locations zugeordnet, nach einem Zeitfenster gefiltert und die Likes aufsummiert.
Aufgaben:
(a) Auflistung der Accounts, welche bei den Locations eventuell Trends setzen
(b) Auflistung der Influenceraccounts, welche an den Locations für Reichweite sorgen (können)

Diese Abfragen lassen sich recht problemlos auf die Tagwolken umschreiben.
Die Rechercheoptionen werden zeitnah in den neuen Client überführt und via Reports in die Beratungsprojekte integriert.

InstaLOC: letzte Bugfixes und Datenbankupdates

Per sofort wurden die Datenbankspalten „likes“ und „comments“ von „VARCHAR“ auf „INTEGER“ gewechselt.

Diese Modifikation erlaubt nun tiefergehende Location-, Themenwelten- und Hashtagbegutachtungen auf Basis der Werthaltigkeitsindikatoren „likes“ und „comments“.

Folgende Queries verdeutlichen das:

(1) Basis-Abfrage 01
select tag, likes,comments, location from locations where (location like '%leipzig%') and (likes > 10) order by likes DESC
Exportdatei: LE_likes (ZIP, CSV)
Erklärung: Die Datei beinhaltet die Daten „Tagwolke“, Anzahl Comments+Likes, die Locations aus der Datenbank, wo der Locationname die Zeichenkette „Leipzig“ trägt. Es werden Ergebnisse ausgespielt, welche mind. 10 Likes beinhalten.

(2) Basis-Abfrage 02
select tag, likes,comments, location from locations where (tag like '%thisis%') and (location like '%leipzig%') and (likes > 10) order by likes DESC
Exportdatei: LE_tags_likes (ZIP, CSV)
Erklärung: Die Datei beinhaltet die Daten „Tagwolke“, Anzahl Comments+Likes, die Locations aus der Datenbank, wo der Locationname die Zeichenkette „Leipzig“ trägt UND wo in der Tagwolke die Zeichenkette „thisis“ vorkommt. Es werden Ergebnisse ausgespielt, welche mind. 10 Likes beinhalten.

(3) Locationbewertung nach Likes / Comments
SELECT location as Ort, Anz_Likes from(
Select location, sum(likes) as Anz_likes from locations GROUP BY location ) as my_table
WHERE (Anz_Likes >= 2) AND (location like '%leipzig%') order by Anz_Likes DESC

Exportdatei: LE_locs_likes (ZIP, CSV)
Erklärung: Die Datei summiert alle vorhandenen Likes zu den Locations mit Zeichenkettenabschnitt „leipzig“ auf und erlaubt einen ersten Überblick dazu, wie „beliebt“ die recherchierten Locations – nach den Instagramdaten – sind. Die Abfrage muss hier – bei Bedarf – auf die Comments umgeschrieben werden. Das ist recht einfach so zu erledigen, dass aus „sum(likes)“ eben „sum(comments)“ geschrieben wird. Ich werde noch prüfen, wie die Aufsummierung der Likes UND Comments in einem Export / Report zu lösen ist.

(4) Tagwolkenbewertung nach Likes / Comments
SELECT tag as Ort, location, Anz_Likes from(
Select tag, location, sum(likes) as Anz_likes from locations GROUP BY tag ) as my_table
WHERE (tag like '%thisis%') order by Anz_Likes DESC

Exportdatei: LE_tagsumlikes (ZIP, CSV)
Erklärung: Die Ausgabedatei beinhaltet die Auflistung aller „unique“ Tagwolken, deren Locations und die Aufsummierung der Likes (optional: Comments).

Die neuen Recherchefunktionen werden zeitnah in den Client übertragen.

Anleitung: Datenbankmodifikation (YT)

InstaLOC – Sichtung und Abfragen bzgl. der „Themenweltdatenbank“

Für die Prüfung und auch „Eichung“ der erweiterten Datenquelle (hier: Tagsearch mit Ergänzung zu den Locations) wurde eine Themenweltdatenbank angelegt, welche auch durch aktuelles Zeitgeschehen inspiriert ist.

Der Scraper benötigte 20 Stunden für die Erfassung der Daten, wobei diese Zeit auf 2 Tage verteilt und eine Liste mit ca. 6000 „Spezialterms“ abgearbeitet wurde.

Datenbankstatistik:
Anz. Einträge: 1238290
Anz. Filter: 45
Anz. Tagsclouds: 1011505
Anz. Locations: 110648
Anz. Accounts: 553799
Anz. Posting/Zeitstempel: 806680
Dateigröße (Byte): 689319936

Beispielabfragen:
(1) select location, erstellzeit from locations where (tag like ‚%22aXX%22‘) and (tag like ‚%22mXXXXXXXXXXXX%22′) and (location <> ’null‘);

Übersetzung:
Hole alle Locations und Erstellzeitpunkte (Zeitstempel) aus der Datenbank, wo die „tag like“ Bedingungen zutreffen und eine Location hinterlegt ist.
Ergebnisse:
771 Einträge

(2) select count(distinct(location)) from locations where (tag like ‚%22aXX%22‘) and (tag like ‚%22mXXXXXXXXXXXX%22′) and (location <> ’null‘);
Übersetzung:
Hole Locations aus der Datenbank, wo die „tag like“ Bedingungen zutreffen und eine Location hinterlegt ist.
Ergebnisse:
99 Einträge (für count(distinct(location)),
Liste (PDF, Locations, für „select location“)
Liste (PDF, Erstellzeit + Location, für „select location, erstellzeit“)

(3) select count(username) from locations where (tag like ‚%22aXX%22‘) and (tag like ‚%22mXXXXXXXXXXX%22‘);
Übersetzung:
Zähle die Accounts zusammen, wo in den Tagwolken die 2 abgefragten Terms vorkommen.
Ergebnisse:
3077 Einträge

Projekt „InstaLOC“ – Datenbankbefüllung auf Basis der Tagsuche

(1) Vorbereitung
Im ersten Schritt wird die Datenbank angelegt.

with sql_befehle do
begin
clear;
lines.Add('drop table if exists locations;');
lines.Add('CREATE TABLE `locations` (');
lines.Add(' `id` integer primary key AUTOINCREMENT,');
lines.Add('`url` varchar(400),');
lines.Add('`tag` varchar(2000),');
lines.Add('`likes` varchar(400),');
lines.Add('`comments` varchar(400),');
lines.Add('`erstellzeit` varchar(400),');
lines.Add('`post_id` varchar(1600),');
lines.Add('`username` varchar(400),');
lines.Add('`location` varchar(400),');
lines.Add('`filter` varchar(400),');
lines.Add('`pruefzeit` varchar(400)');
lines.Add(');');
lines.Add('vacuum;');
end;
fdquery3.ExecSQL(sql_befehle.text);

Die Datei umfasst folgende Spalten:
ID -> Nummerierung der Einträge (Zeilen)
URL -> erfasste Beitragsurl
Tag -> erfasste Tagwolke
Likes -> erfasste Likes als Zahl
Comments -> erfasste Comments als Zahl
Post_ID -> per Instagram vergebene Medien/Beitrags-ID
Username -> Username: Wer hat den Beitrag veröffentlicht?
Location -> Location des Beitrages, falls vom User freigegeben (GeoCode + Name)
Filter -> Fotofilter des veröffentlichten Beitrages
Erstellzeit -> Wann wurde der Beitrag veröffentlicht?
Pruefzeit -> Wann wurde der Beitrag vom Scraper erfasst UND in die Datenbank gespeichert?

(2) Scrapingvorgang
for lauf := strtoint(uebertrag.Text) to memo8.Lines.Count-1 do
begin
randomize;
token.Text:=token.Items[random(token.Items.Count-1)];
getmedia_db(locmedia,memo8.Lines[lauf],200);
end;

(3) Scrapingprozedur

procedure TForm1.getmedia_db(mytable: TStringGrid; tagsearch: string; rounds: integer);
var
JSONArray: tJSONArray;
JSONValue,jvalue: tJSONValue;
JSONPair: TJSONPair;
JSON, json_sub: TJSONObject;
size: integer;
j_array: tJSONArray;
s: string;
i,j: integer;
next_id: string;
zaehl: integer;
url,tag,likes,comments,post_id,username,location,filter,pruefzeit: widestring;
erstellzeit: string;
begin
sql_befehle.Clear;
memo3.Lines.Add('url => https://api.instagram.com/v1/tags/'+escape(tagsearch)+'/media/recent?access_token='+token.text);
try
debug.text:=idhttp1.Get('https://api.instagram.com/v1/tags/'+escape(tagsearch)+'/media/recent?access_token='+token.text);
JSONValue := TJSONObject.ParseJSONValue(debug.text);
JSON := TJSONObject.ParseJSONValue(debug.Lines.Text) as TJSONObject;
JSONArray := TJSONArray(JSON.Get('data').JsonValue);
try next_id:= JSONValue.GetValue('pagination.next_url');
except
next_id:='N/A';
end;
for i := 0 to JSONArray.Size - 1 do
begin
url:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('link')).JsonValue.Value);
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('tags')).ToString);
s:= StringReplace(s, '"tags":[', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, ']', '', [rfReplaceAll,rfIgnoreCase]);
tag:=escape(s);
memo7.Lines.Add(unescape(tag));
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('likes')).ToString);
s:= StringReplace(s, '"likes":{"count":', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '}', '', [rfReplaceAll,rfIgnoreCase]);
likes:=s;
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('comments')).ToString);
s:= StringReplace(s, '"comments":{"count":', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '}', '', [rfReplaceAll,rfIgnoreCase]);
comments:=s;
erstellzeit:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('created_time')).JsonValue.Value);
erstellzeit:=datetimetostr(UnixToDateTime(strtoint(erstellzeit)));
post_id:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('id')).JsonValue.Value);
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('user')).ToString);
s:= StringReplace(s, '"user":{"username":', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '}', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '"', '', [rfReplaceAll,rfIgnoreCase]);
username:=s;
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('location')).ToString);
s:= StringReplace(s, '"location":', '', [rfReplaceAll,rfIgnoreCase]);
location:=s;
filter:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('filter')).JsonValue.Value);
pruefzeit:=datetimetostr(now);
with sql_befehle.Lines do
begin
add('INSERT INTO `locations` (`url`, `tag`, `likes`, `comments`, `erstellzeit`, `post_id`, `username`, `location`, `filter`, `pruefzeit`) Values ('''+url+''', '''+tag+''', '''+likes+''', '''+comments+''', '''+erstellzeit+''', '''+post_id+''', '''+username+''', '''+location+''', '''+filter+''', '''+pruefzeit+''');');
end;
end;
fdquery3.ExecSQL(sql_befehle.text);
sql_befehle.Clear;
except
end;
if next_id<>'N/A' then
begin
repeat
// -> tiefenpruefung
if next_id='N/A' then
break;
delay(strtoint(frequenz1.Text));
try
debug.text:=idhttp1.Get(next_id);
JSONValue := TJSONObject.ParseJSONValue(debug.text);
JSON := TJSONObject.ParseJSONValue(debug.Lines.Text) as TJSONObject;
JSONArray := TJSONArray(JSON.Get('data').JsonValue);
try next_id:= JSONValue.GetValue('pagination.next_url');
except
next_id:='N/A';
break;
end;
for i := 0 to JSONArray.Size - 1 do
begin
url:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('link')).JsonValue.Value);
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('tags')).ToString);
s:= StringReplace(s, '"tags":[', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, ']', '', [rfReplaceAll,rfIgnoreCase]);
tag:=escape(s);
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('likes')).ToString);
s:= StringReplace(s, '"likes":{"count":', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '}', '', [rfReplaceAll,rfIgnoreCase]);
likes:=s;
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('comments')).ToString);
s:= StringReplace(s, '"comments":{"count":', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '}', '', [rfReplaceAll,rfIgnoreCase]);
comments:=s;
erstellzeit:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('created_time')).JsonValue.Value);
erstellzeit:=datetimetostr(UnixToDateTime(strtoint(erstellzeit)));
post_id:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('id')).JsonValue.Value);
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('user')).ToString);
s:= StringReplace(s, '"user":{"username":', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '}', '', [rfReplaceAll,rfIgnoreCase]);
s:= StringReplace(s, '"', '', [rfReplaceAll,rfIgnoreCase]);
username:=s;
s:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('location')).ToString);
s:= StringReplace(s, '"location":', '', [rfReplaceAll,rfIgnoreCase]);
location:=s;
filter:=(TJSONPair(TJSONObject(JSONArray.Get(i)).Get('filter')).JsonValue.Value);
pruefzeit:=datetimetostr(now);
with sql_befehle.Lines do
begin
add('INSERT INTO `locations` (`url`, `tag`, `likes`, `comments`, `erstellzeit`, `post_id`, `username`, `location`, `filter`, `pruefzeit`) Values ('''+url+''', '''+tag+''', '''+likes+''', '''+comments+''', '''+erstellzeit+''', '''+post_id+''', '''+username+''', '''+location+''', '''+filter+''', '''+pruefzeit+''');');
end;
end;
fdquery3.ExecSQL(sql_befehle.text);
sql_befehle.Clear;
except
break;
end;
// -> tiefenpruefung, ende
zaehl:=zaehl+1;
until zaehl=rounds;
end;
end;

Prozeduraufruf.

getmedia_db(locmedia,memo8.Lines[lauf],200);

Erklärung, Prozedurlogik:

Die Variable „locmedia“ ist für das Szenarium relativ uninteressant und wird aktiviert, wenn bspw. die gescrapten Daten in ein Stringgridobjekt zwecks Gegensichtung übergeben werden müssen. Die Variable „memo8.lines[X]“ beschreibt den Zwischenspeicherort der Tagliste(n), wobei „X“ oder „lauf“ die Position des Terms / Tags in der Liste beschreibt. Die Variable „200“ sagt aus, wie tief die Scrapingprozedur forschen soll. In dem Fall handelt es sich um 200×20 (-> 4000) Beiträge je Suchanfrage.