
Durchsucht öffentliche Snap Map-Orte, um Stories für investigativ-analytische Zwecke herunterzuladen und zu klassifizieren, mit randomisierter Geolokalisierung und automatisierten Überprüfungs-Workflows.
Dieses Programm kann Snapchats öffentliche Snap Map an mehreren Orten durchsuchen und alle Stories für spätere Untersuchungen und Kategorisierung herunterladen. Es ist vieles unbekannt darüber, wie Snapchat entscheidet, welche Videos an welchem "Punkt" auf der Karte erscheinen. Daher kann der Scraper auch die Geolokalisierung, von der aus er sammelt, um einige hundert Meter randomisieren, um hoffentlich die API dazu zu bewegen, ein paar weitere relevante Videos auszuliefern.
Dies wurde unter Linux getestet, sollte aber auch unter Windows/Mac mit installiertem Videobetrachter funktionieren.
git clone https://github.com/nemec/snapchat-map-scraper.git
cd snapchat-map-scraper/
python3 -m venv env # create virtual environment
source env/bin/activate # activate virtual environment
pip3 install -r requirements.txt
Befolgen Sie jeden Schritt der Reihe nach. Stellen Sie außerdem sicher, dass Sie Ihre virtuelle Umgebung aktiviert haben, da sonst die Pakete fehlen.
Diese Datenbank enthält Daten, die sich auf eine Gruppe von Suchanfragen beziehen. Da SQLite Datenbankdateien mit geringem Overhead erstellt, sollten Sie jedes Mal eine neue Datenbank erstellen, wenn Sie Daten abtasten möchten.
python3 story_downloader.py create snap.db
Der Befehl add fügt einen neuen Standort zur Datenbank hinzu. Das Programm wird später Snaps von allen hinzugefügten Standorten scrapen und protokollieren, sodass Sie mehrere Orte gleichzeitig verfolgen können. Finden Sie den Breiten- und Längengrad Ihres interessierenden Punktes (dies kann einfach auf der Snap Map gefunden werden, wie unten zu sehen) und ersetzen Sie sie im folgenden Befehl. Das Label erleichtert es, sich zu merken, wo ein Punkt ist.
python3 story_downloader.py add --database snap.db --label "downtown dallas" 32.783038 -96.796388
# Added downtown dallas to database

Der Befehl scrape durchläuft alle hinzugefügten Standorte und lädt Snaps an diesem Standort herunter. Vorschauen, Videos und Overlays werden alle heruntergeladen, aber der Befehl review kann derzeit nur mit Videos umgehen.
Optionale Argumente:
--randomize randomisiert die Geolokalisierung innerhalb von 500m, um die Snapchat-API dazu zu bewegen, neue Videos zu senden, die sie noch nicht ausgeliefert hat. Ich habe keine Ahnung, warum Snapchat nur eine Untermenge der gesamten Videos für einen einzelnen Punkt sendet, wahrscheinlich um den Dienst skalierbarer zu machen.--repeat bewirkt, dass die Anwendung unendlich oft nach neuen Videos sucht. Lassen Sie es über Nacht laufen, um so viel wie möglich zu sammeln.--sleep ändert, wie lange die Anwendung vor der Wiederholung wartet. Standardmäßig 120 Sekunden und wirkt nur, wenn --repeat angegeben ist.python3 story_downloader.py scrape "downtown dallas"python3 story_downloader.py scrape --database snap.db --randomize --repeat
# Scraped 16 media from location downtown dallas
# Sleeping for 120 seconds...
Der Befehl review durchsucht alle nicht überprüften Videos und öffnet jedes in einem Videoplayer zur Überprüfung. Sobald Sie den Videoplayer-Prozess geschlossen haben, fordert die CLI Sie zur Eingabe einer "Klassifizierung" auf. Dies kann ein beliebiger Text sein, der die Situation im Video beschreibt, oder ein Tag usw. Wenn das Video irrelevant ist, lassen Sie die Klassifizierung leer und drücken Sie einfach "Enter". Sobald alle verbleibenden Videos klassifiziert sind, wird die Anwendung beendet. Abhängig von Ihrem Betriebssystem,
python3 story_downloader.py review --database snap.db
# Classify or leave blank: police protesters
# 15 remaining
# Classify or leave blank:
# 14 remaining
# Classify or leave blank: fire
# 13 remaining
# ...
Der Befehl export kopiert alle Videos, die als "klassifiziert" markiert sind, in einen neuen Ordner zur weiteren Überprüfung/Bearbeitung/Veröffentlichung.
python3 story_downloader.py export --database snap.db export/
# 3 video(s) exported
ls export/
# 2020-05-29-04:26:30-fire.mp4
# 2020-05-30-12:26:57-crowd.mp4
# '2020-05-30-21:16:22-line of people.mp4'