Hur Skrapa en Lista över tillgängliga Ämnen från en Subreddit för att Använda Nfs

0
341
Fatmawati Achmad Zaenuri/Shutterstock.kom

Reddit har JSON-feed för varje subreddit. Här är hur man skapar ett Bash-skript som hämtar och tolkar en lista med inlägg från någon subreddit du vill. Detta är bara en sak du kan göra med Reddit JSON-feeds.

Installera Curl och JQ

Vi kommer att använda curl för att hämta JSON-feed från Reddit och jq att tolka JSON-data och extrahera fält vi vill ha resultat. Installera dessa två beroenden med hjälp av apt-get på Ubuntu och andra Debian-baserade Linux-distributioner. På andra Linux-distributioner, använda din distributions pakethanterare verktyg istället.

sudo apt-get install curl jq

Hämta JSON-Data från Reddit

Låt oss se vad den data flöde ser ut. Använd curl för att hämta de senaste inläggen från MildlyInteresting subreddit:

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

Notera hur val används före URL: -s styrkor curl för att köra i tyst läge så att vi inte ser något utdata, förutom data från Reddit ‘ s servrar. Nästa alternativ och den parameter som följer, En “reddit skrapa exempel” , anger en anpassad user agent-strängen som hjälper Reddit identifiera tjänsten komma åt sina data. Den Reddit API servrar gäller hastighetsgränser baserade på user agent-strängen. Ange en anpassad värde kommer att orsaka Reddit att segmentera våra priser limit bort från andra ringer och minska risken för att vi får en HTTP 429 Gräns Överskriden fel.

Produktionen ska fylla upp det terminal-fönster och ser ut ungefär så här:

Det finns massor av områden i utdata, men allt vi är intresserade av är Titel, Permalänk, och URL. Du kan se en fullständig lista över typer och deras fält på Reddit ‘ s API-dokumentationen sida: https://github.com/reddit-archive/reddit/wiki/JSON

Att extrahera Data från JSON-Utgång

Vi vill extrahera en Titel, Permalänk, och URL, från produktionen data och spara den till en tabbavgränsad fil. Vi kan använda text-bearbetning verktyg som sed och grep , men vi har ett annat verktyg till vårt förfogande som förstår JSON-data strukturer, kallade jq . För våra första försök, låt oss använda den för att pretty-print och färg-kod produktionen. Vi använder samma samtal som innan, men den här gången, spritsa ut genom jq och instruera den att tolka och skriva ut JSON-data.

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

Observera den period som följer kommandot. Detta uttryck helt enkelt tolkar input och skriver ut det som det är. Produktionen ser snyggt formaterad och färgkodade:

Låt oss undersöka strukturen för JSON data som vi får tillbaka från Reddit. Roten resultatet är ett objekt som innehåller två egenskaper: typ och data. Den senare har en egenskap som kallas barn, som inkluderar en mängd av tjänster att detta subreddit.

Varje objekt i en array är ett objekt som innehåller också två områden som kallas typ och data. De egenskaper som vi vill ta tag i data objekt. jq förväntar sig ett uttryck som kan tillämpas på indata och ger önskad effekt. Det måste beskriva innehållet i termer av hierarki och medlemskap i en array, samt hur data ska omvandlas. Låt oss köra hela kommandot igen med korrekt uttryck:

curl -s -A “reddit skrapa exempel” https://www.reddit.com/r/MildlyInteresting.json | jq ‘.uppgifter.barn | .[] | .uppgifter.titel .uppgifter.webbadress .uppgifter.permalänk för”

Produktionen visar Titel, URL och Permalänk var och en på sin egen linje:

Låt oss dyka in i den jq kommandot heter vi:

jq ‘.uppgifter.barn | .[] | .uppgifter.titel .uppgifter.webbadress .uppgifter.permalänk för”

Det finns tre uttryck i kommandot separerade av två rör symboler. Resultaten av varje uttryck som är vidare till nästa för ytterligare utvärdering. Det första uttrycket filtrerar bort allt utom utbud av Reddit listor. Denna utgång leds in i den andra uttryck och tvingas in i en array. Det tredje uttrycket verkar på varje element i matrisen och extrakt tre egenskaper. Mer information om jq och dess uttryck-syntax kan hittas i jq: s officiella manual.

Att sätta Ihop Allt i ett Skript

Låt oss sätta API-anrop och JSON efter behandling tillsammans i ett skript som kommer att generera en fil med de tjänster vi vill ha. Vi kommer att lägga till stöd för att hämta inlägg från någon subreddit, inte bara till /r/MildlyInteresting.

Öppna editorn, och kopiera innehållet i denna snutt i en fil som heter scrape-reddit.sh

#!/bin/bash

if [ -z “$1” ]
sedan
echo “ange en subreddit”
utgång 1
fi

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

curl -s -A “bash-skrapa-ämnen” https://www.reddit.com/r/${SUBREDDIT}.json |
jq ‘.uppgifter.barn | .[] | .uppgifter.titel .uppgifter.webbadress .uppgifter.permalänk’ |
medan läs -r AVDELNING. göra
läs -r-URL
läs -r PERMALINK
echo -e “${TITLE}t${URL}t${LÄNK}” | tr-ta bort ” >> ${OUTPUT_FILE}
gjort

Detta skript kommer först att kontrollera om användaren har lämnat en subreddit namn. Om inte, är det avslutas med ett felmeddelande och en icke-noll returkod.

Nästa, kommer det att lagra det första argumentet som subreddit namn och bygga upp ett datum-stämplade filnamn där utgången kommer att sparas.

Handlingen börjar när curl kallas med ett anpassat sidhuvud och URL: en för subreddit för att skrapa. Produktionen leds till jq där det analyseras och reduceras till tre fält: Titel, URL och Permalänk. Dessa rader finns att läsa, en-på-en-gång, och sparas i en variabel med hjälp av read-kommandot, alla inne i en while-loop, som kommer att fortsätta tills det inte finns fler rader att läsa. Den sista raden i det inre, medan block ekon de tre fält, separerat med ett tab-tecken, och då rör det genom tr-kommandot så att den dubbla citattecken kan tas bort. Produktionen är då att läggas till i en fil.

Innan vi kan köra detta skript, måste vi se till att det inte har beviljats körningsbehörighet. Använda kommandot chmod för att tillämpa dessa behörigheter till en fil:

chmod u+x scrape-reddit.sh

Och, slutligen, köra skriptet med en subreddit namn:

./scrape-reddit.sh MildlyInteresting

En output fil genereras samma katalog och dess innehåll kommer att se något liknande detta:

Varje linje innehåller tre områden som vi är ute efter, separeras med ett tabb-tecken.

Gå Vidare

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

  • Ta tag i de senaste rubrikerna från /r/WorldNews och skicka dem till din dator med underrätta-skicka
  • Integrera de bästa skämt från /r/DadJokes i ditt system Message-Of-The-Dagen
  • Få dagens bästa bild från /r/aww och gör det till din skrivbordsbakgrund

Allt detta är möjligt med hjälp av de uppgifter och de verktyg du har i ditt system. Happy hacking!