Hur man skrapar en lista över ämnen från en Subreddit med Bash

Mar 26, 2025
Moln och Internet
Fatmawati Achmad Zaenuri / Shutterstock.com

Reddit erbjuder JSON-flöden för varje subreddit. Så här skapar du ett Bash-skript som laddar ner och analyserar en lista med inlägg från alla subreddit du gillar. Det här är bara en sak du kan göra med Reddits JSON-flöden.

Installera Curl och JQ

Vi ska använda ringla för att hämta JSON-flödet från Reddit och jq för att analysera JSON-data och extrahera de fält vi vill ha från resultaten. Installera dessa två beroenden med apt-get på Ubuntu och andra Debian-baserade Linux-distributioner. På andra Linux-distributioner använder du istället din distributionens pakethanteringsverktyg.

sudo apt-get install curl jq

Hämta några JSON-data från Reddit

Låt oss se hur dataflödet ser ut. Använda sig av ringla för att hämta de senaste inläggen från Mildt intressant subreddit:

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

Observera hur alternativen som används före webbadressen: -s tvingar curl att köra i tyst läge så att vi inte ser någon utdata, förutom data från Reddits servrar. Nästa alternativ och parametern som följer, -Ett “reddit scraper-exempel” , ställer in en anpassad användaragentsträng som hjälper Reddit att identifiera tjänsten som får åtkomst till deras data. Reddit API-servrar tillämpar hastighetsgränser baserat på användaragentsträngen. Om du ställer in ett anpassat värde kommer Reddit att segmentera vår taktsgräns från andra som ringer och minska risken för att vi får ett HTTP 429 Rate Limit Exceeded error.

Utgången ska fylla terminalfönstret och se ut så här:

Det finns många fält i utdata, men allt vi är intresserade av är Titel, Permalink och URL. Du kan se en uttömmande lista över typer och deras fält på Reddits API-dokumentationssida: https://github.com/reddit-archive/reddit/wiki/JSON

Extrahera data från JSON-utgången

Vi vill extrahera titel, permalänk och URL från utdata och spara den i en flikavgränsad fil. Vi kan använda textbehandlingsverktyg som och och grep , men vi har ett annat verktyg till förfogande som förstår JSON-datastrukturer, kallat jq . För vårt första försök, låt oss använda den för att vackert skriva ut och färgkoda utdata. Vi kommer att använda samma samtal som tidigare, men den här gången genomföra resultatet jq och instruera den att analysera och skriva ut JSON-data.

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

Observera perioden som följer kommandot. Detta uttryck analyserar helt enkelt inmatningen och skriver ut den som den är. Utgången ser snyggt formaterad och färgkodad ut:

Låt oss undersöka strukturen för JSON-data vi får tillbaka från Reddit. Rotresultatet är ett objekt som innehåller två egenskaper: typ och data. Den senare har en egendom som heter barn , som innehåller en rad inlägg till denna underreddit.

Varje objekt i matrisen är ett objekt som också innehåller två fält som kallas typ och data. Egenskaperna vi vill ta är i dataobjektet. jq förväntar sig ett uttryck som kan tillämpas på indata och ger önskad utdata. Den måste beskriva innehållet i termer av deras hierarki och medlemskap i en matris, samt hur data ska omvandlas. Låt oss köra hela kommandot igen med rätt uttryck:

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

Utgången visar titel, URL och permalänk var och en på sin egen rad:

Låt oss dyka in i jq kommando vi kallade:

jq ‘.data.barn | . [] | .data.title, .data.url, .data.permalink '

Det finns tre uttryck i detta kommando åtskilda av två rörsymboler. Resultaten av varje uttryck skickas till nästa för vidare utvärdering. Det första uttrycket filtrerar bort allt utom matrisen av Reddit-listor. Denna utgång rörs in i det andra uttrycket och tvingas in i en matris. Det tredje uttrycket verkar på varje element i matrisen och extraherar tre egenskaper. Mer information om jq och dess uttryckssyntax finns i jqs officiella manual .

Att lägga allt i ett skript

Låt oss sätta API-samtalet och JSON-efterbehandlingen tillsammans i ett skript som genererar en fil med de inlägg vi vill ha. Vi lägger till stöd för att hämta inlägg från valfri subreddit, inte bara / r / MildlyInteresting.

Öppna din redigerare och kopiera innehållet i detta utdrag till en fil som heter scrape-reddit.sh

#! / bin / bash

om [ -z "$1" ]
  sedan
    echo "Ange en subreddit"
    avfart 1
fi

SUBREDDIT = $ 1
NU = $ (datum + "% 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.barn | . [] | .data.title, .data.url, .data.permalink '| \
        medan läs -r TITEL; do
                läs -r-URL
                läs -r PERMALINK
                eko -e "$ {TITLE} \ t $ {URL} \ t $ {PERMALINK}" | tr --delete \ ">> $ {OUTPUT_FILE}
        Gjort

Detta skript kommer först att kontrollera om användaren har angett ett underrediterat namn. Om inte, avslutas den med ett felmeddelande och en returkod som inte är noll.

Därefter lagras det första argumentet som subreddit-namn och det skapas ett datumstämplat filnamn där utdata kommer att sparas.

Handlingen börjar när ringla kallas med en anpassad rubrik och URL för subreddit att skrapa. Utgången rörs till jq där den analyseras och reduceras till tre fält: Titel, URL och Permalink. Dessa rader läses, en i taget, och sparas i en variabel med hjälp av läskommandot, allt inuti en stundslinga, som fortsätter tills det inte finns fler rader att läsa. Den sista raden i det inre medan blocket ekar de tre fälten, avgränsade med en tabbtecken, och rör sedan den genom tr kommandot så att dubbla citat kan tas bort. Utdata läggs sedan till en fil.

Innan vi kan köra det här skriptet måste vi se till att det har beviljats ​​exekveringsbehörigheter. Använd chmod kommando för att tillämpa dessa behörigheter på filen:

chmod u + x scrape-reddit.sh

Och slutligen, kör skriptet med ett subreddit-namn:

./scrape-reddit.sh MildlyInteresting

En utdatafil genereras i samma katalog och dess innehåll ser ut så här:

Varje rad innehåller de tre fälten vi letar efter, åtskilda med hjälp av ett fliktecken.

Går längre

Reddit är en guldgruva med intressant innehåll och media, och det är lätt att nå med JSON API. Nu när du har ett sätt att komma åt dessa data och bearbeta resultaten kan du göra saker som:

  • Ta de senaste rubrikerna från / r / WorldNews och skicka dem till ditt skrivbord med meddela-skicka
  • Integrera de bästa skämt från / r / DadJokes i ditt systems Message-of-the-Day
  • Få dagens bästa bild från / r / aww och gör den till din skrivbordsbakgrund

Allt detta är möjligt med hjälp av de uppgifter som tillhandahålls och de verktyg du har på ditt system. Lycklig hacking!

.post-innehåll .inmatningsfot

Using Scrapy On Reddit.com


Moln och Internet - Mest populära artiklar

Hur man använder Netflix hemliga kategorikoder för att mätta alla filmbegär

Moln och Internet Mar 6, 2025

Om du använder Netflix tillräckligt länge kan du bara få en känsla av att du har sett alla kategorier de har att erbjuda, men det kan inte vara längre ifrån sanningen. Genom ..


Hur får jag tillbaka det gamla Gmail-fönstret

Moln och Internet Nov 3, 2024

Om du älskar Gmail men du hatar det nya popupfönstret, vad kan du göra? Läs vidare när vi hjälper en HTG-läsare att komma tillbaka till det skrivfönster han längtar efter. ..


Hur man döljer Sök / Cortana-rutan och uppgiftsvisningsknappen i Aktivitetsfältet i Windows 10

Moln och Internet Oct 25, 2025

Windows 10 lägger till lite mer i aktivitetsfältet: nu kan du söka (eller använda Cortana) utan att trycka på Start-knappen, och du kan klicka på "Task View" -knappen för att..


Förstå de nya synkroniseringsinställningarna i Windows 10

Moln och Internet Jul 27, 2025

OBEHANDLAT INNEHÅLL Windows-synkroniseringsinställningar har varit en del av operativsystemet sedan Windows 8 men i Windows 10 får de en makeover och lite välbehövlig konsoli..


Nya 64-bitars versioner av Google Chrome Dev och Kanarieöarna är nu tillgängliga

Moln och Internet Jun 3, 2025

Letar du efter den "hetaste" kombinationen av Google Chrome och 64-bitars Windows-system? Då vill du definitivt prova de nya 64-bitarsversionerna av Google Chrome i kanalerna Dev o..


Hur man hanterar Internet-bandbreddskåpor

Moln och Internet Apr 29, 2025

OBEHANDLAT INNEHÅLL Vissa Internet-leverantörer har hårda begränsningar för hur mycket bandbredd du kan använda på en månad, vilket kostar extra om du går över bandbredd..


Använd Aero Snap med Internet Explorer 9-flikar i Windows 7

Moln och Internet Sep 16, 2025

Som ni vet släppte Microsoft Internet Explorer 9 Beta till allmänheten igår. En av de intressanta funktionerna är att använda Aero Snap med flikar i Windows 7, och vi tar en snabb titt p..


Gör Google Chrome öppet med fästa flikar

Moln och Internet Feb 18, 2025

Gillar du att använda den nya fästa flikfunktionen i Chrome och vill göra den permanent? Då är allt du behöver en liten kommandobyckelmagi och en lista över dina favoritwebbplatser. ..


Kategorier