Wie Kratzen eine Liste von Themen, die von einem Subreddit Mit Bash

0
325
Fatmawati Achmad Zaenuri/Shutterstock.com

Reddit bietet JSON-feeds für jedes subreddit. So erstellen Sie ein Bash-Skript, downloads und analysiert, eine Liste der Beiträge von jedem subreddit, die Sie mögen. Dies ist nur eine Sache, die Sie tun können, mit Reddit ist JSON-feeds.

Die Installation von Curl und JQ

Wir sind curl verwenden zum abrufen der JSON-feed von Reddit und jq zum Parsen der JSON-Daten und extrahieren Sie die Felder, die wir wollen aus den Ergebnissen. Installieren Sie diese beiden Abhängigkeiten mit apt-get auf Ubuntu und anderen Debian-basierten Linux-Distributionen. Auf anderen Linux-Distributionen, verwenden Sie Ihre distribution Paket-management-tool statt.

sudo apt-get install curl jq

Holen JSON-Daten von Reddit

Mal sehen, was die Daten-feed aussieht. Verwenden Sie curl zu Holen, die neuesten Beiträge aus der MildlyInteresting subreddit:

curl -s-A “reddit-Spachtel Beispiel” https://www.reddit.com/r/MildlyInteresting.json

Beachten Sie, wie die Optionen verwendet, die vor der URL: -s erzwingt, dass LOCKE im stillen Modus ausgeführt, so dass wir nicht sehen, jede Ausgabe, mit Ausnahme der Daten von Reddit Server. Die nächste option und dem parameter, der folgt, Einem “reddit-Spachtel Beispiel” , setzt einen benutzerdefinierten user-agent-string, der hilft, Reddit identifizieren der service den Zugriff auf Ihre Daten. Die Reddit API-Servern gelten Herzfrequenz-Grenzwerten, basierend auf den Benutzer-agent-Zeichenfolge. Festlegen eines benutzerdefinierten Werts dazu, dass Reddit zu segment unser limit entfernt von anderen Anrufern und verringern die chance, dass wir ein HTTP 429 Rate Limit Exceeded error.

Die Ausgabe sollte dann füllen Sie das terminal-Fenster etwa so Aussehen:

Es gibt viele Felder in der Ausgabe-Daten, aber alle sind wir daran interessiert, sind Titel, Permalink und URL. Sie können sehen, eine vollständige Liste der Typen und deren Felder auf Reddit API-Dokumentation Seite: https://github.com/reddit-archive/reddit/wiki/JSON

Extrahieren von Daten aus der JSON-Ausgabe

Wir wollen zu extrahieren Titel, Permalink und URL, aus der output-Daten und speichern Sie Sie auf eine Registerkarte getrennte Datei. Wir können die Verwendung von text-processing-tools wie sed und grep , aber wir haben ein weiteres tool zur Verfügung, das versteht, dass JSON-Daten, Strukturen, genannt jq . Für unseren ersten Versuch, lassen Sie uns es verwenden, um pretty-print-und color-code-Ausgang. Wir verwenden das gleiche Aufruf wie vorher, aber dieses mal, leiten Sie die Ausgabe durch jq und ihn anweisen, zu analysieren und drucken Sie die JSON-Daten.

curl -s-A “reddit-Spachtel Beispiel” https://www.reddit.com/r/MildlyInteresting.json | jq .

Hinweis: der Zeitraum, der folgt dem Befehl. Dieser Ausdruck einfach analysiert die Eingabe und druckt es wie es ist. Die Ausgabe sieht schön formatiert und farblich gekennzeichnet:

Lassen Sie uns untersuchen Sie die Struktur von JSON-Daten, die wir wieder von Reddit. Die root-Ergebnis ist ein Objekt mit zwei Eigenschaften: Art und Daten. Letztere besitzt eine Eigenschaft namens children, die umfasst eine Reihe von Beiträgen zu diesem subreddit.

Jedes Element im array ist ein Objekt, das enthält auch zwei Felder, die als Art und Daten. Die Eigenschaften, die wir greifen wollen, sind in den Daten-Objekt. jq erwartet einen Ausdruck, der angewendet werden kann, um die input-Daten und erzeugt die gewünschte Ausgabe. Es muss beschreiben, die Inhalte in Bezug auf Ihre Hierarchie und Mitgliedschaft ein array, als auch, wie die Daten transformiert werden soll. Wir führen den gesamten Befehl erneut mit der korrekten Ausdruck:

curl -s-A “reddit-Spachtel Beispiel” https://www.reddit.com/r/MildlyInteresting.json | jq ‘.Daten.Kinder | .[] | .Daten.Titel, .Daten.url .Daten.permalink’

Die Ausgabe zeigt Titel, URL und Permalink-jede auf Ihre eigene Linie:

Lassen Sie uns Tauchen Sie ein in die jq Befehl, den wir genannt:

jq ‘.Daten.Kinder | .[] | .Daten.Titel, .Daten.url .Daten.permalink’

Es gibt drei Ausdrücke, die in diesem Befehl, getrennt durch zwei pipe-Symbolen. Die Ergebnisse jeder Ausdruck übergeben werden, der nächste für die weitere Auswertung. Der erste Ausdruck filtert alles außer der Reihe von Reddit-Angebote. Diese Ausgabe wird über eine Pipe in den zweiten Ausdruck und gezwungen, in ein array. Der Dritte Ausdruck wirkt auf jedes element im array und extrahiert drei Eigenschaften. Mehr Informationen über jq und seine Ausdrucks-syntax finden Sie in jq das offizielle Handbuch.

Setzen Sie Alle Zusammen in einem Skript

Lassen wir die API-Aufruf und die JSON-post-processing zusammen in ein Skript, das generiert eine Datei mit den posts, die wir wollen. Wir werden hinzufügen von Unterstützung für das abrufen-Beiträge aus jeder subreddit, und nicht nur /r/MildlyInteresting.

Öffnen Sie Ihren editor und kopieren Sie den Inhalt dieses snippet in einer Datei namens scrape-reddit.sh

#!/bin/bash

if [ -z “$1” ]
dann
echo “Bitte geben Sie eine subreddit”
exit 1
fi

SUBREDDIT=$1
JETZT=$(date +”%m_%d_%y-%H_%M”)
AUSGABEDATEI=”${SUBREDDIT}_${JETZT}.txt”

curl -s-A “bash-kratzen-Themen” https://www.reddit.com/r/${SUBREDDIT}.json |
jq ‘.Daten.Kinder | .[] | .Daten.Titel, .Daten.url .Daten.permalink’ |
while read -r TITEL;
Lesen -r URL
Lesen -r PERMALINK
echo -e “${TITEL}t${URL}t${PERMALINK}” | tr-delete ” >> ${AUSGABEDATEI}
getan

Dieses Skript wird zunächst überprüft, ob der Benutzer geliefert hat, ein subreddit Namen. Wenn nicht, beendet es mit einer Fehlermeldung und einem return-code ungleich null.

Als Nächstes speichern wird das erste argument als die subreddit Namen, und der Aufbau einer Datum-Stempel mit dem Namen, in dem die Ausgabe gespeichert wird.

Die Aktion beginnt, wenn curl aufgerufen wird, mit einem benutzerdefinierten header und die URL der subreddit zu kratzen. Die Ausgabe wird über eine Pipe an jq, wo es analysiert und reduziert sich auf drei Felder: Titel, URL und Permalink. Diese Zeilen sind zu Lesen, man-at-a-time, und gespeichert in einer Variablen, die mit dem read-Befehl innerhalb der while-Schleife wird fortgesetzt, bis es keine Zeilen mehr zu Lesen. Die Letzte Zeile der inneren while-block Echos die drei Felder, getrennt durch ein tab-Zeichen, und dann Pfeifen Sie durch den tr-Befehl, so dass die doppelten Anführungszeichen entfernt werden können. Die Ausgabe wird dann an eine Datei.

Bevor wir das Skript, müssen wir dafür sorgen, dass die gewährten Berechtigungen ausführen. Den Befehl chmod, um diese Berechtigungen für die Datei:

chmod u+x scrape-reddit.sh

Und schließlich führen Sie das Skript mit einem subreddit Namen:

./scrape-reddit.sh MildlyInteresting

Eine Ausgabe-Datei erzeugt, im gleichen Verzeichnis und sein Inhalt wird in etwa so Aussehen:

Jede Zeile enthält drei Felder, die wir suchen, getrennt mit einem tab-Zeichen.

Weiter

Reddit ist eine Fundgrube von interessanten Inhalten und Medien, und es ist alles leicht zugänglich mit seiner JSON-API. Jetzt haben Sie einen Weg, um den Zugriff auf diese Daten und verarbeiten Sie die Ergebnisse, die Sie tun können, Dinge wie:

  • Schnappen Sie sich die neuesten Schlagzeilen von /r/WorldNews und senden Sie Sie auf Ihrem desktop mit notify-send
  • Integrieren Sie die besten Witze von /r/DadJokes in Ihrem system Message-Of-The-Day
  • Heute bekommen das beste Bild von /r/aww und machen Sie es Ihren desktop-hintergrund

All dies ist möglich mit der zur Verfügung gestellten Daten und Werkzeuge, die Sie auf Ihrem system haben. Happy hacking!