How to Scrape a List of Topics from a Subreddit Using Bash

Configurare noua (How To)

Situatie

Reddit oferă feed-uri JSON pentru fiecare subredit. Iată cum puteți crea un script Bash care să descarce și să analizeze o listă de postări din orice subreversiune dorită. Acesta este doar un lucru pe care îl puteți face cu feedurile Reddit JSON.

 

Solutie

Instalarea programului Curl și JQ

Vom folosi curl pentru a prelua feedul JSON din Reddit și jq pentru a analiza datele JSON și pentru a extrage câmpurile dorite din rezultate. Instalați aceste două dependențe utilizând apt-get pe Ubuntu și pe alte distribuții Linux bazate pe Debian. Pe alte distribuții Linux, utilizați în schimb instrumentul de gestionare a pachetelor de distribuție.

sudo apt-get install curl jq

Fetch Unele date JSON de la Reddit

Să vedem cum arată feedul de date. Utilizați curl pentru a prelua ultimele postări din subdreptul MildlyInteresting:

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

Rețineți modul în care opțiunile utilizate înainte de adresa URL: -s forțează curl pentru a rula în modul silențios, astfel încât să nu vedem nicio ieșire, cu excepția datelor de pe serverele Reddit. Următoarea opțiune și parametrul care urmează, -A “exemplu reddit răzuitor”, stabilește un șir personalizat de agent utilizator care ajută Reddit să identifice serviciul care accesează datele sale. Serverele API Reddit aplică limite de rată bazate pe șirul de agent utilizator. Setarea unei valori personalizate va determina Reddit să segmenteze limita noastră de rată de la alți apelanți și să reducă șansa de a obține o eroare HTTP 429 Rate Limit Exceeded.

Ieșirea ar trebui să umple fereastra terminalului și să arate astfel:

Există o mulțime de câmpuri în datele de ieșire, dar tot ce ne interesează este titlul, Permalink și adresa URL. Puteți vedea o listă exhaustivă de tipuri și câmpurile lor pe pagina de documentare API a Reddit: https://github.com/reddit-archive/reddit/wiki/JSON

Extragerea datelor din ieșirea JSON

Vrem să extragem titlul, Permalink și adresa URL, din datele de ieșire și să le salvăm într-un fișier delimitat de file. Putem folosi instrumente de procesare a textului precum sed și grep, dar avem la dispoziție un alt instrument care înțelege structurile de date JSON numite jq. Pentru prima încercare, să o folosim pentru a tipări destul de mult și pentru a codifica culoarea rezultatului. Vom folosi același apel ca înainte, dar de data aceasta, conduceți ieșirea prin jq și instruiți-l să analizeze și să imprime datele JSON.

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

Notați perioada care urmează comenzii. Această expresie analizează doar intrarea și imprimă-o ca-este. Ieșirea arată frumos formatată și colorată:

Să examinăm structura datelor JSON pe care le primim de la Reddit. Rezultatul rădăcină este un obiect care conține două proprietăți: tipul și datele. Acesta din urmă deține o proprietate numită copii, care include o serie de posturi pentru acest subdredin.

Fiecare element din matrice este un obiect care conține, de asemenea, două câmpuri numite gen și date. Proprietățile pe care vrem să le luăm sunt în obiectul de date. jq așteaptă o expresie care poate fi aplicată datelor de intrare și produce rezultatul dorit. Trebuie să descrie conținutul în ceea ce privește ierarhia și apartenența la o matrice, precum și modul în care trebuie transformate datele. Să executăm din nou întreaga comandă cu expresia corectă:

curl -s -A “reddit scraper example” https://www.reddit.com/r/MildlyInteresting.json | jq ‘.data.children | .[] | .data.title, .data.url, .data.permalink’

Ieșirea afișează titlul, adresa URL și fiecare post pe propria linie:

Să ne uitam în comanda jq pe care am apelat-o:

jq ‘.data.children | .[] | .data.title, .data.url, .data.permalink’

Există trei expresii în această comandă separate de două simboluri pentru țevi. Rezultatele fiecărei expresii sunt transmise la următoarea pentru o evaluare ulterioară. Prima expresie filtrează totul, cu excepția gamei de liste Reddit. Această ieșire este transmisă în a doua expresie și forțată într-o matrice. A treia expresie acționează asupra fiecărui element din matrice și extrage trei proprietăți. Mai multe informații despre jq și sintaxa expresiei sale pot fi găsite în manualul oficial al lui jq.

Punându-le pe toate împreună într-un script

Să punem împreună apelul API și postprocesarea JSON într-un script care va genera un fișier cu postările pe care le dorim. Vom adăuga suport pentru preluarea postărilor din orice subreversă, nu doar / r / MildlyInteresting.

Deschideți editorul și copiați conținutul acestui fragment într-un fișier numit scrape-reddit.sh

#!/bin/bash

if [ -z "$1" ]
  then
    echo "Please specify a subreddit"
    exit 1
fi

SUBREDDIT=$1
NOW=$(date +"%m_%d_%y-%H_%M")
OUTPUT_FILE="${SUBREDDIT}_${NOW}.txt"

curl -s -A "bash-scrape-topics" https://www.reddit.com/r/${SUBREDDIT}.json | 
        jq '.data.children | .[] | .data.title, .data.url, .data.permalink' | 
        while read -r TITLE; do
                read -r URL 
                read -r PERMALINK
                echo -e "${TITLE}t${URL}t${PERMALINK}" | tr --delete " >> ${OUTPUT_FILE}
        done

Acest script va verifica mai întâi dacă utilizatorul a furnizat un nume de subredit. În caz contrar, se încheie cu un mesaj de eroare și un cod de returnare diferit de zero.

Apoi, va stoca primul argument ca nume de subredit și va construi un nume de fișier marcat cu dată, în care va fi salvat rezultatul.

Acțiunea începe când se numește curl cu un antet personalizat, iar URL-ul subdrepturii pentru a se răsturna. Ieșirea este trimisă în jq unde este analizată și redusă la trei câmpuri: Titlu, URL și Permalink. Aceste linii sunt citite, o dată, și salvate într-o variabilă folosind comanda citire, toate în interiorul unei bucla timp, care va continua până când nu mai există linii de citit. Ultima linie a blocului intern în timp ce etichetează cele trei câmpuri, delimitată de un caracter tab și apoi o conduce prin comanda tr, astfel încât ghilimele duble să poată fi eliminate. Ieșirea este apoi atașată la un fișier.

Înainte de a putea executa acest script, trebuie să ne asigurăm că i sa acordat permisiuni de executare. Utilizați comanda chmod pentru a aplica aceste permisiuni în fișier:

chmod u+x scrape-reddit.sh

Și, în final, executați scriptul cu un nume de subredit:

./scrape-reddit.sh MildlyInteresting

Un fișier de ieșire este generat același director și conținutul său va arăta cam așa:

Fiecare rând conține cele trei câmpuri pe care le urmărim, separate folosind un caracter de file.

Reddit este o mină de aur de conținut interesant și media și este accesibilă cu ușurință utilizând API-ul JSON. Acum că aveți o modalitate de a accesa aceste date și de a procesa rezultatele puteți face lucruri precum:

Luați cele mai recente titluri din / r / WorldNews și le trimiteți pe desktop utilizând notificare-trimitere
Integrați cele mai bune glume de la / r / DadJokes în mesajul mesajului-of-the-day al sistemului dvs.
Obțineți cea mai bună imagine de astăzi din / r / aww și creați fundalul desktopului
Toate acestea sunt posibile folosind datele furnizate și instrumentele pe care le aveți în sistemul dvs. Hacking fericit!

Tip solutie

Permanent

Voteaza

(9 din 38 persoane apreciaza acest articol)

Despre Autor

Leave A Comment?