Come Raschiare un Elenco di Argomenti da un Subreddit Usando Bash

0
309
Fatmawati Achmad Zaenuri/Shutterstock.com

Reddit offre JSON feed per ogni subreddit. Ecco come creare uno script Bash che scarica e analizza un elenco di posti da qualsiasi subreddit ti piace. Questa è solo una cosa che si può fare con Reddit è JSON feed.

L’installazione di Curl e JQ

Stiamo andando a utilizzare curl per recuperare il JSON alimentazione da Reddit e jq per analizzare i dati in formato JSON e estrarre i campi ci vogliono i risultati. Installare queste due dipendenze usando apt-get su Ubuntu e Debian-based distribuzioni Linux. Su altre distribuzioni Linux, l’utilizzo di distribuzione e strumento di gestione dei pacchetti, invece.

sudo apt-get install curl jq

Recuperare un Po ‘ di Dati JSON da Reddit

Vediamo quello che il feed di dati assomiglia. Utilizzare curl per recuperare i post più recenti MildlyInteresting subreddit:

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

Nota come le opzioni utilizzato prima l’URL: -s le forze di curl per l’esecuzione in modalità silenziosa in modo che noi non vediamo alcun output, ad eccezione dei dati dal server Reddit. La prossima opzione e parametro che segue, Un “reddit raschietto esempio” , si imposta una stringa agente utente personalizzata che aiuta Reddit identificare il servizio di accesso ai dati. Il Reddit API server di applicare limiti di velocità basato sulla stringa agente utente. L’impostazione di un valore personalizzato causa Reddit per segmentare il nostro tasso limite di distanza da altri utenti e ridurre la possibilità che si ottiene una HTTP 429 Tasso ha Superato il Limite di errore.

L’output dovrebbe riempire la finestra del terminale e un aspetto simile a questo:

Ci sono un sacco di campi di dati di output, ma tutti siamo interessati sono Titolo, Permalink, e l’URL. Si può vedere un elenco esauriente di tutti i tipi e i loro campi su Reddit la documentazione dell’API di pagina: https://github.com/reddit-archive/reddit/wiki/JSON

Estrazione dei Dati dall’Output JSON

Vogliamo estrarre Titolo, Permalink, URL, dall’output i dati e salvarli in un file delimitato da tabulazioni. Siamo in grado di utilizzare strumenti di elaborazione del testo come sed e grep , ma abbiamo un altro strumento a nostra disposizione, che comprende i dati JSON strutture, denominate jq . Per il nostro primo tentativo, lo si può usare a bella stampa e colore-codice di uscita. Useremo la stessa chiamata come prima, ma questa volta, tubo di uscita attraverso jq e indicare per analizzare e stampare i dati in formato JSON.

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

Nota il periodo che segue il comando. Questa espressione, semplicemente analizza l’input e di stampa. L’output è ben formattato e color-coded:

Esaminiamo la struttura di dati JSON torniamo da Reddit. Il principale risultato è un oggetto che contiene due proprietà ed il tipo di dati. Quest’ultimo tiene una proprietà denominata bambini, che include una serie di post per questo subreddit.

Ogni elemento dell’array è un oggetto che contiene anche due campi denominati tipo e dati. La proprietà si desidera afferrare in oggetto dati. jq prevede un’espressione che può essere applicato ai dati di input e produce l’output desiderato. Si deve descrivere il contenuto in termini di gerarchia e di appartenenza ad un array, così come i dati devono essere trasformate. Corriamo tutto il comando di nuovo con l’espressione corretta:

curl-s-A “reddit raschietto esempio” https://www.reddit.com/r/MildlyInteresting.json | jq ‘.dati.bambini | .[] | .dati.titolo .dati.url .dati.permalink’

L’output mostra il Titolo e l’URL e Permalink ciascuno nella propria riga:

Tuffiamoci nel jq comando abbiamo chiamato:

jq ‘.dati.bambini | .[] | .dati.titolo .dati.url .dati.permalink’

Ci sono tre espressioni in questo comando separato da due simboli di pipe. I risultati di ogni espressione sono passato alla successiva per un’ulteriore valutazione. La prima espressione filtri tutto tranne la matrice di Reddit seguente criterio. Questa uscita è incanalato nella seconda espressione e costretto in un array. La terza espressione, agisce su ogni elemento dell’array e gli estratti di tre proprietà. Più informazioni su jq e la sua espressione sintassi può essere trovato nel jq del manuale ufficiale.

Mettere Tutto Insieme in uno Script

Mettiamo la chiamata di API e JSON post-processing insieme in uno script che genera un file con il post vogliamo. Vedremo di aggiungere il supporto per il recupero di messaggi da qualsiasi subreddit, non solo per /r/MildlyInteresting.

Aprite il vostro editor e copiare i contenuti di questo frammento di codice in un file chiamato scrape-reddit.sh

#!/bin/bash

if [ -z “$1” ]
quindi
echo “si Prega di specificare un subreddit”
uscita 1
fi

SUBREDDIT=$1
ORA=$(date +”%m_%d_%y%H%M”)
OUTPUT_FILE=”${SUBREDDIT}_${ORA}.txt”

curl-s-A “bash-raschi-argomenti” https://www.reddit.com/r/${SUBREDDIT}.json |
jq ‘.dati.bambini | .[] | .dati.titolo .dati.url .dati.permalink’ |
mentre la lettura -r TITOLO; fare
leggere -r URL
leggere -r PERMALINK
echo-e “${TITOLO}t${URL}t${PERMALINK}” | tr –delete ” >> ${OUTPUT_FILE}
fatto

Questo script consente di verificare se l’utente ha fornito un subreddit nome. Se non, si esce con un messaggio di errore e un non-zero codice di ritorno.

A quel punto, che memorizza il primo argomento come la subreddit nome, e di costruire un data-timbro nome del file in cui l’output sarà salvato.

L’azione inizia quando l’arricciatura è chiamato con un header personalizzato e l’URL della subreddit per raschiare. L’uscita è convogliato jq dove è analizzato e ridotto a tre campi: Titolo, URL e Permalink. Queste linee sono leggere, uno-a-un-tempo, e salvato in una variabile utilizzando il comando di lettura, il tutto all’interno di un ciclo while, che continuerà fino a quando non ci sono più linee di lettura. L’ultima riga dell’interno, mentre il blocco echi tre campi, separati da un carattere di tabulazione, e quindi i tubi attraverso il comando tr in modo che le due citazioni, che possono essere rimossi. L’uscita è quindi aggiunti a un file.

Prima di poter eseguire questo script, è necessario assicurarsi che ha concesso le autorizzazioni di esecuzione. Utilizzare il comando chmod per applicare le autorizzazioni per il file:

chmod u+x scrape-reddit.sh

E, infine, eseguire lo script con un subreddit nome:

./scrape-reddit.sh MildlyInteresting

Un file di output viene generato stessa cartella e il suo contenuto sarà simile a questa:

Ogni linea contiene tre campi che ci interessa, separati da un carattere di tabulazione.

Di Andare Avanti

Reddit è una miniera di contenuti interessanti e media, e tutto è facilmente accessibile tramite le sue API JSON. Ora che si dispone di un modo per accedere ai dati di processo e i risultati che si possono fare cose come:

  • Afferrare i titoli delle ultime notizie da /r/WorldNews e li invia al vostro desktop utilizzando notify-send
  • Integrare le migliori battute da /r/DadJokes nel vostro sistema il Messaggio-Del-Giorno
  • La foto migliore dal /r/aww e rendere il vostro sfondo del desktop

Tutto questo è possibile utilizzando i dati forniti e gli strumenti che si hanno sul tuo sistema. Happy hacking!