Sådan skraber du en liste over emner fra en Subreddit ved hjælp af Bash

Reddit tilbyder JSON-feeds for hver subreddit. Sådan opretter du et Bash-script, der downloader og analyserer en liste over indlæg fra enhver subreddit, du kan lide. Dette er kun én ting, du kan gøre med Reddits JSON-feeds.

Installation af Curl og JQ

Vi kommer til at bruge curl til at hente JSON-feedet fra Reddit og jq til at parse JSON-dataene og udtrække de felter, vi ønsker, fra resultaterne. Installer disse to afhængigheder ved hjælp af apt-get på Ubuntu og andre Debian-baserede Linux-distributioner. På andre Linux-distributioner skal du bruge din distributions pakkehåndteringsværktøj i stedet.

sudo apt-get install curl jq

Hent nogle JSON-data fra Reddit

Lad os se, hvordan datafeedet ser ud. Brug curl til at hente de seneste indlæg fra Mildt interessant subreddit:

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

Bemærk, hvordan indstillingerne, der blev brugt før URL’en: -s tvinger curl til at køre i lydløs tilstand, så vi ikke ser noget output, undtagen dataene fra Reddits servere. Den næste mulighed og parameteren, der følger, -Et “reddit scraper-eksempel” sætter en tilpasset brugeragentstreng, der hjælper Reddit med at identificere den tjeneste, der får adgang til deres data. Reddit API-serverne anvender hastighedsgrænser baseret på brugeragentstrengen. Indstilling af en brugerdefineret værdi vil få Reddit til at segmentere vores takstgrænse væk fra andre opkaldere og reducere chancen for, at vi får en HTTP 429 Rate Limit Exceeded-fejl.

  Hvad handler om:blank, og hvordan fjerner du det?

Outputtet skulle fylde terminalvinduet og se sådan ud:

Der er masser af felter i outputdataene, men alt, hvad vi er interesseret i, er Titel, Permalink og URL. Du kan se en udtømmende liste over typer og deres felter på Reddits API-dokumentationsside: https://github.com/reddit-archive/reddit/wiki/JSON

Udtræk af data fra JSON-output

Vi ønsker at udtrække titel, Permalink og URL fra outputdataene og gemme dem i en tabulator-separeret fil. Vi kan bruge tekstbehandlingsværktøjer som sed og grep , men vi har et andet værktøj til vores rådighed, der forstår JSON-datastrukturer, kaldet jq . Til vores første forsøg, lad os bruge det til at udskrive og farvekode outputtet. Vi bruger det samme kald som før, men denne gang skal du røre outputtet gennem jq og instruere det i at parse og udskrive JSON-dataene.

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

Bemærk den periode, der følger efter kommandoen. Dette udtryk analyserer simpelthen inputtet og udskriver det, som det er. Outputtet ser pænt formateret og farvekodet ud:

Lad os undersøge strukturen af ​​de JSON-data, vi får tilbage fra Reddit. Rodresultatet er et objekt, der indeholder to egenskaber: type og data. Sidstnævnte har en egenskab kaldet børn, som inkluderer en række indlæg til denne subreddit.

Hvert element i arrayet er et objekt, der også indeholder to felter kaldet type og data. De egenskaber, vi vil have fat i, er i dataobjektet. jq forventer et udtryk, der kan anvendes på inputdataene og producerer det ønskede output. Den skal beskrive indholdet i form af deres hierarki og medlemskab af et array, samt hvordan dataene skal transformeres. Lad os køre hele kommandoen igen med det korrekte udtryk:

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

Outputtet viser titel, URL og permalink hver på deres egen linje:

  Volume+ tilføjer musikkontroller og mere til lydstyrke-HUD [Jailbreak]

Lad os dykke ned i jq-kommandoen, vi kaldte:

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

Der er tre udtryk i denne kommando adskilt af to rørsymboler. Resultaterne af hvert udtryk overføres til det næste til yderligere evaluering. Det første udtryk bortfiltrerer alt undtagen rækken af ​​Reddit-lister. Dette output føres ind i det andet udtryk og tvinges ind i et array. Det tredje udtryk virker på hvert element i arrayet og udtrækker tre egenskaber. Mere information om jq og dets udtrykssyntaks kan findes i jq’s officielle manual.

At sætte det hele sammen i et script

Lad os sætte API-kaldet og JSON-efterbehandlingen sammen i et script, der genererer en fil med de indlæg, vi ønsker. Vi tilføjer understøttelse til at hente indlæg fra enhver subreddit, ikke kun /r/MildlyInteresting.

Åbn din editor og kopier indholdet af dette uddrag til en fil kaldet 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 script vil først kontrollere, om brugeren har angivet et subreddit-navn. Hvis ikke, afsluttes den med en fejlmeddelelse og en returkode, der ikke er nul.

Dernæst vil det gemme det første argument som subreddit-navnet og opbygge et datostemplet filnavn, hvor outputtet gemmes.

  Opret albums fra kameraappen og gem billeder til den [Jailbreak]

Handlingen begynder, når curl kaldes med en brugerdefineret header og URL’en på subreddit til at skrabe. Outputtet sendes til jq, hvor det parses og reduceres til tre felter: Titel, URL og Permalink. Disse linjer læses, én ad gangen, og gemmes i en variabel ved hjælp af read-kommandoen, alt inden for en while-løkke, som fortsætter, indtil der ikke er flere linjer at læse. Den sidste linje i den indre mens-blok afspejler de tre felter, afgrænset af et tabulatortegn, og sender det derefter gennem tr-kommandoen, så de dobbelte anførselstegn kan fjernes. Outputtet føjes derefter til en fil.

Før vi kan udføre dette script, skal vi sikre, at det har fået udførelsestilladelser. Brug kommandoen chmod til at anvende disse tilladelser til filen:

chmod u+x scrape-reddit.sh

Og til sidst skal du udføre scriptet med et subreddit-navn:

./scrape-reddit.sh MildlyInteresting

En outputfil genereres i samme mappe, og dens indhold vil se sådan ud:

Hver linje indeholder de tre felter, vi leder efter, adskilt med et tabulatortegn.

Går videre

Reddit er en guldgrube af interessant indhold og medier, og det hele er let tilgængeligt ved hjælp af dets JSON API. Nu hvor du har en måde at få adgang til disse data og behandle resultaterne, kan du gøre ting som:

Få fat i de seneste overskrifter fra /r/WorldNews og send dem til dit skrivebord vha underrette-sende
Integrer de bedste vittigheder fra /r/DadJokes i dit systems Message-Of-The-Day
Få dagens bedste billede fra /r/aww og gør det til din skrivebordsbaggrund

Alt dette er muligt ved hjælp af de leverede data og de værktøjer, du har på dit system. God fornøjelse med hacking!