Reddit nudi JSON fidove za svaki subreddit. U ovom tekstu ćete saznati kako da napravite Bash skriptu koja preuzima i analizira listu objava sa bilo kog subreddita koji vas interesuje. Ovo je samo jedan od načina na koji možete iskoristiti Reddit JSON fidove.
Instaliranje Curl i JQ
Koristićemo `curl` za preuzimanje JSON fida sa Reddita, a `jq` za parsiranje JSON podataka i izdvajanje željenih polja iz rezultata. Instalirajte ove dve zavisnosti koristeći `apt-get` na Ubuntu i drugim Debian-baziranim Linux distribucijama. Za ostale Linux distribucije, koristite alat za upravljanje paketima vaše distribucije.
sudo apt-get install curl jq
Preuzimanje JSON podataka sa Reddita
Hajde da pogledamo kako izgleda fid podataka. Koristite `curl` da preuzmete najnovije objave sa MildlyInteresting subreddita:
curl -s -A "reddit scraper example" https://www.reddit.com/r/MildlyInteresting.json
Obratite pažnju na opcije korišćene pre URL-a: `-s` prisiljava `curl` da radi u tihom režimu, tako da ne vidimo nikakav izlaz osim podataka sa Reddit servera. Sledeća opcija i parametar koji sledi, „reddit scraper example“, postavlja prilagođeni string korisničkog agenta koji pomaže Redditu da identifikuje uslugu koja pristupa njihovim podacima. Reddit API serveri primenjuju ograničenja brzine na osnovu stringa korisničkog agenta. Postavljanje prilagođene vrednosti će omogućiti da Reddit segmentira naše ograničenje brzine od drugih korisnika i smanjiće šanse da dobijemo HTTP 429 grešku zbog prekoračenja ograničenja brzine.
Izlaz bi trebalo da popuni prozor terminala i izgleda otprilike ovako:
Postoji mnogo polja u izlaznim podacima, ali nas zanimaju samo naslov, stalna veza i URL. Možete pogledati iscrpnu listu tipova i njihovih polja na stranici Reddit API dokumentacije: https://github.com/reddit-archive/reddit/wiki/JSON
Ekstrakcija podataka iz JSON izlaza
Želimo da izdvojimo naslov, stalnu vezu i URL iz izlaznih podataka i sačuvamo ih u datoteci razdvojenoj tabulatorima. Možemo koristiti alate za obradu teksta kao što su `sed` i `grep`, ali na raspolaganju imamo još jedan alat koji razume JSON strukture podataka, a to je `jq`. Za početak, koristimo ga za lepo formatiranje i bojenje izlaza. Koristićemo isti poziv kao i ranije, ali ovaj put usmeravamo izlaz kroz `jq` i nalažemo mu da analizira i odštampa JSON podatke.
curl -s -A "reddit scraper example" https://www.reddit.com/r/MildlyInteresting.json | jq .
Obratite pažnju na tačku koja sledi nakon komande. Ovaj izraz jednostavno analizira ulaz i štampa ga onako kakav jeste. Izlaz izgleda lepo formatiran i obojen:
Hajde da ispitamo strukturu JSON podataka koje dobijamo sa Reddita. Osnovni rezultat je objekat koji sadrži dva svojstva: `vrstu` i `podatke`. Potonji ima svojstvo pod nazivom `deca`, koje uključuje niz objava na ovom subredditu.
Svaka stavka u nizu je objekat koji takođe sadrži dva polja koja se zovu `vrsta` i `podaci`. Svojstva koja želimo da dohvatimo nalaze se u objektu `podaci`. `jq` očekuje izraz koji se može primeniti na ulazne podatke i proizvodi željeni izlaz. On mora opisati sadržaj u smislu njihove hijerarhije i pripadnosti nizu, kao i kako bi podaci trebalo da se transformišu. Hajde da ponovo pokrenemo celu komandu sa ispravnim izrazom:
curl -s -A "reddit scraper example" https://www.reddit.com/r/MildlyInteresting.json | jq '.data.children | .[] | .data.title, .data.url, .data.permalink'
Izlaz prikazuje naslov, URL i stalnu vezu, svaki u svom redu:
Pogledajmo detaljnije `jq` komandu koju smo pozvali:
jq '.data.children | .[] | .data.title, .data.url, .data.permalink'
U ovoj komandi postoje tri izraza razdvojena sa dva simbola cevi (`|`). Rezultati svakog izraza se prosleđuju sledećem radi dalje evaluacije. Prvi izraz filtrira sve osim niza Reddit listinga. Ovaj izlaz se prenosi u drugi izraz i pretvara u niz. Treći izraz deluje na svaki element u nizu i izdvaja tri svojstva. Više informacija o `jq` i njegovoj sintaksi izraza možete pronaći u zvaničnom `jq` priručniku.
Sastavljanje svega u skriptu
Spojimo API poziv i JSON obradu u skriptu koja će generisati datoteku sa objavama koje želimo. Dodaćemo podršku za preuzimanje objava sa bilo kog subreddita, ne samo sa /r/MildlyInteresting.
Otvorite uređivač teksta i kopirajte sadržaj ovog isečka u datoteku pod nazivom `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
Ova skripta prvo proverava da li je korisnik uneo ime za subreddit. Ako nije, izlazi sa porukom o grešci i povratnim kodom koji nije nula.
Zatim će sačuvati prvi argument kao ime subreddita i kreirati ime datoteke sa datumom gde će se sačuvati izlaz.
Akcija počinje kada se pozove `curl` sa prilagođenim zaglavljem i URL-om subreddita za skrejpovanje. Izlaz se šalje u `jq` gde se parsira i svodi na tri polja: `Naslov`, `URL` i `Permalink`. Ovi redovi se čitaju jedan po jedan i čuvaju u promenljivoj pomoću komande `read`, sve unutar `while` petlje, koja će se nastaviti sve dok više ne bude redova za čitanje. Poslednji red unutrašnjeg `while` bloka reflektuje tri polja, razdvojena tabulatorom, a zatim ga prosleđuje kroz komandu `tr` tako da se dvostruki navodnici mogu ukloniti. Izlaz se zatim dodaje datoteci.
Pre nego što možemo da izvršimo ovu skriptu, moramo da se uverimo da su joj dodeljene dozvole za izvršavanje. Koristite komandu `chmod` da primenite ove dozvole na datoteku:
chmod u+x scrape-reddit.sh
I, na kraju, izvršite skriptu sa imenom subreddita:
./scrape-reddit.sh MildlyInteresting
Izlazna datoteka se generiše u istom direktorijumu i njen sadržaj će izgledati otprilike ovako:
Svaki red sadrži tri polja koja tražimo, razdvojena tabulatorom.
Šta dalje?
Reddit je bogat izvor zanimljivog sadržaja i medija, a svemu mu se lako pristupa pomoću JSON API-ja. Sada kada imate način da pristupite ovim podacima i obradite rezultate, možete da uradite sledeće:
Preuzmite najnovije naslove sa /r/WorldNews i pošaljite ih na radnu površinu koristeći notify-send.
Integrirajte najbolje šale iz /r/DadJokes u poruku svog sistema.
Preuzmite najbolju današnju sliku sa /r/aww i postavite je kao pozadinu radne površine.
Sve ovo je moguće pomoću podataka i alata koje imate na svom sistemu. Srećno hakovanje!