Hvordan skrape en liste over emner fra en Subreddit ved hjelp av Bash

Reddit tilbyr JSON-feeder for hver subreddit. Slik lager du et Bash-skript som laster ned og analyserer en liste over innlegg fra hvilken som helst subreddit du liker. Dette er bare én ting du kan gjøre med Reddits JSON-feeder.

Installerer Curl og JQ

Vi skal bruke curl for å hente JSON-feeden fra Reddit og jq for å analysere JSON-dataene og trekke ut feltene vi ønsker fra resultatene. Installer disse to avhengighetene ved å bruke apt-get på Ubuntu og andre Debian-baserte Linux-distribusjoner. På andre Linux-distribusjoner bruker du distribusjonens pakkehåndteringsverktøy i stedet.

sudo apt-get install curl jq

Hent noen JSON-data fra Reddit

La oss se hvordan datastrømmen ser ut. Bruk curl for å hente de siste innleggene fra Mildt interessant subreddit:

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

Legg merke til hvordan alternativene som ble brukt før URL-en: -s tvinger curl til å kjøre i stille modus slik at vi ikke ser noen utdata, bortsett fra dataene fra Reddits servere. Det neste alternativet og parameteren som følger, -Et «reddit scraper example» , setter en tilpasset brukeragentstreng som hjelper Reddit med å identifisere tjenesten som får tilgang til dataene deres. Reddit API-servere bruker hastighetsgrenser basert på brukeragentstrengen. Å angi en egendefinert verdi vil føre til at Reddit segmenterer takstgrensen vår bort fra andre innringere og reduserer sjansen for at vi får en HTTP 429 Rate Limit Exceeded-feil.

  Helium legger til vær, bokmerker og Reddit-feed til ny faneside [Chrome]

Utgangen skal fylle opp terminalvinduet og se omtrent slik ut:

Det er mange felt i utdataene, men alt vi er interessert i er Tittel, Permalink og URL. Du kan se en uttømmende liste over typer og deres felt på Reddits API-dokumentasjonsside: https://github.com/reddit-archive/reddit/wiki/JSON

Trekker ut data fra JSON-utdata

Vi ønsker å trekke ut Tittel, Permalink og URL fra utdataene og lagre dem i en tabulatordelt fil. Vi kan bruke tekstbehandlingsverktøy som sed og grep , men vi har et annet verktøy til rådighet som forstår JSON-datastrukturer, kalt jq . For vårt første forsøk, la oss bruke den til å skrive ut og fargekode utskriften. Vi bruker det samme kallet som før, men denne gangen, rør utdataene gjennom jq og instruer den til å analysere og skrive ut JSON-dataene.

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

Legg merke til perioden som følger kommandoen. Dette uttrykket analyserer ganske enkelt inndataene og skriver det ut som det er. Utgangen ser pent formatert og fargekodet ut:

La oss undersøke strukturen til JSON-dataene vi får tilbake fra Reddit. Rotresultatet er et objekt som inneholder to egenskaper: type og data. Sistnevnte har en egenskap kalt barn, som inkluderer en rekke innlegg til denne subredditen.

Hvert element i matrisen er et objekt som også inneholder to felt kalt type og data. Egenskapene vi ønsker å hente er i dataobjektet. jq forventer et uttrykk som kan brukes på inngangsdataene og produserer ønsket utgang. Den må beskrive innholdet i form av deres hierarki og medlemskap til en matrise, samt hvordan dataene skal transformeres. La oss kjøre hele kommandoen på nytt med riktig uttrykk:

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

Utdataene viser Tittel, URL og Permalink hver på sin egen linje:

  Hvordan laste ned videoer fra reddit

La oss dykke ned i jq-kommandoen vi kalte:

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

Det er tre uttrykk i denne kommandoen atskilt med to rørsymboler. Resultatene av hvert uttrykk overføres til neste for videre evaluering. Det første uttrykket filtrerer ut alt bortsett fra rekken av Reddit-oppføringer. Denne utgangen overføres til det andre uttrykket og tvinges inn i en matrise. Det tredje uttrykket virker på hvert element i matrisen og trekker ut tre egenskaper. Mer informasjon om jq og dets uttrykkssyntaks finner du i jqs offisielle manual.

Sette alt sammen i et manus

La oss sette API-kallet og JSON-etterbehandlingen sammen i et skript som vil generere en fil med innleggene vi ønsker. Vi vil legge til støtte for å hente innlegg fra enhver subreddit, ikke bare /r/MildlyInteresting.

Åpne redigeringsprogrammet og kopier innholdet av denne kodebiten til en fil kalt 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

Dette skriptet vil først sjekke om brukeren har oppgitt et subreddit-navn. Hvis ikke, avsluttes den med en feilmelding og en returkode som ikke er null.

Deretter vil den lagre det første argumentet som subreddit-navnet, og bygge opp et datostemplet filnavn der utdataene vil bli lagret.

  Hvordan bla gjennom Reddit fra Linux-skrivebordet med Giara

Handlingen begynner når curl kalles med en egendefinert overskrift og URL-en til subredditen for å skrape. Utdata sendes til jq hvor det analyseres og reduseres til tre felt: Tittel, URL og Permalink. Disse linjene leses, én om gangen, og lagres i en variabel ved å bruke lesekommandoen, alt inne i en while-løkke, som vil fortsette til det ikke er flere linjer å lese. Den siste linjen i den indre mens-blokken gjengir de tre feltene, avgrenset av et tabulatortegn, og sender den deretter gjennom tr-kommandoen slik at doble anførselstegn kan fjernes. Utdata legges deretter til en fil.

Før vi kan kjøre dette skriptet, må vi sørge for at det har fått kjøretillatelser. Bruk chmod-kommandoen for å bruke disse tillatelsene til filen:

chmod u+x scrape-reddit.sh

Og til slutt, utfør skriptet med et subreddit-navn:

./scrape-reddit.sh MildlyInteresting

En utdatafil genereres i samme katalog og innholdet vil se omtrent slik ut:

Hver linje inneholder de tre feltene vi er ute etter, atskilt med et tabulatortegn.

Gå videre

Reddit er en gullgruve av interessant innhold og media, og alt er lett tilgjengelig ved hjelp av JSON API. Nå som du har en måte å få tilgang til disse dataene og behandle resultatene kan du gjøre ting som:

Ta tak i de siste overskriftene fra /r/WorldNews og send dem til skrivebordet ditt ved hjelp av varsle-send
Integrer de beste vitsene fra /r/DadJokes i systemets Message-Of-The-Day
Få dagens beste bilde fra /r/aww og gjør det til skrivebordsbakgrunnen din

Alt dette er mulig ved å bruke dataene som er gitt og verktøyene du har på systemet ditt. Lykke til med hacking!