Hoe te Schrapen met een Lijst van Onderwerpen uit een Subreddit het Gebruik van Bash

0
326
Fatmawati Achmad Zaenuri/Shutterstock.com

Reddit biedt JSON feeds voor elke subreddit. Hier is hoe te maken van een Bash-script dat downloads en parseert een lijst van berichten van een subreddit je wilt. Dit is slechts één ding dat u kunt doen met Reddit JSON feeds.

Het installeren van Krullen en JQ

We gaan gebruiken om krullen te halen de JSON-feed van Reddit en jq te ontleden om de JSON-gegevens en uitpakken van de velden die we van de resultaten. Installeer deze twee afhankelijkheden met apt-get op Ubuntu en andere Debian gebaseerde Linux-distributies. Op andere Linux distributies, gebruik je de verdeling van de package beheer tool voor in de plaats.

sudo apt-get install krullen jq

Halen JSON-Gegevens van Reddit

Laten we eens kijken wat de gegevens feed eruit ziet. Gebruik curl voor het ophalen van de laatste berichten van de MildlyInteresting subreddit:

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

Merk op hoe de opties die gebruikt worden voor de URL: -s krachten krullen uitgevoerd in de stille modus zodat we niet elke uitgang, met uitzondering van de gegevens van Reddit ‘ s servers. De volgende optie en de parameter die volgt, -Een “reddit schraper voorbeeld” , stelt een custom user agent string, dat helpt Reddit identificeren van de dienst toegang tot hun gegevens. De Reddit-API servers van toepassing tarief limieten op basis van de user agent string. Het instellen van een aangepaste waarde zal Reddit voor het segmenteren van onze snelheidslimiet uit de buurt van andere bellers en de kans te verkleinen dat we een HTTP 429 snelheidslimiet Overschreden fout.

De output moet vullen het terminal-venster en ziet er ongeveer zo uit:

Er zijn veel velden in de output van gegevens, maar alles wat we geïnteresseerd in zijn Titel, Permalink, en de URL. U ziet een volledige lijst van soorten en hun velden op Reddit de API-documentatie pagina: https://github.com/reddit-archive/reddit/wiki/JSON

Het extraheren van Gegevens van de JSON Output

We willen uitpakken Titel, Permalink, en de URL van de output van gegevens en het opslaan in een door tabs gescheiden bestand. We kunnen gebruiken om de tekst te verwerken tools zoals sed en grep , maar we hebben een tool ter beschikking die begrijpt JSON data structuren, de zogenaamde jq . Voor onze eerste poging, laten we het gebruiken om mooie print en kleur-code van de uitvoer. Gebruiken We dezelfde oproep als voorheen, maar deze keer, de output met een pijp door jq en de opdracht geven het te verwerken en afdrukken van de gegevens van JSON.

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

Let op de periode die volgt op de opdracht. Deze expressie gewoon analyseert de invoer en drukt het is zoals het is. De uitgang ziet er mooi opgemaakt en kleur-gecodeerde:

Laten we eens kijken naar de structuur van de JSON-gegevens krijgen we terug van Reddit. De root resultaat is een object met twee eigenschappen: soort en gegevens. De laatste bezit een eigenschap met de naam kinderen, waaronder een reeks van berichten aan deze subreddit.

Elk item in de array is een object dat ook bevat twee velden type en gegevens. De eigenschappen die wij willen grijpen in het data-object. jq verwacht een uitdrukking die kan worden toegepast op de invoer van gegevens en produceert u met de gewenste output. Het moet de inhoud beschrijven in termen van hun hiërarchie en het lidmaatschap van een matrix, evenals hoe de gegevens moeten worden omgezet. Laten we de hele opdracht weer met de juiste expressie:

curl -s-A “reddit schraper voorbeeld” https://www.reddit.com/r/MildlyInteresting.json | jq ‘.de gegevens.kinderen | .[] | .de gegevens.titel, .de gegevens.url .de gegevens.permalink’

De output laat de Titel, de URL en de Permalink elk op hun eigen regel:

Duik in het jq opdracht noemden we:

jq ‘.de gegevens.kinderen | .[] | .de gegevens.titel, .de gegevens.url .de gegevens.permalink’

Er zijn drie uitdrukkingen in deze opdracht gescheiden door twee buizen symbolen. De resultaten van elke expressie worden doorgegeven aan de volgende voor verdere evaluatie. De eerste expressie filtert alles behalve de matrix van Reddit aanbiedingen. Deze uitgang wordt doorgesluisd naar de tweede expressie en gedwongen in een matrix. De derde expressie treedt op in elk element in de array en extracten drie eigenschappen. Meer informatie over jq en de syntaxis van expressies kunnen worden gevonden in jq de officiële handleiding.

Putting het Allemaal Samen in een Script

Laten we de API-aanroep en de JSON-post-processing samen in een script dat wordt het genereren van een bestand met de berichten die we willen. We zullen het toevoegen van ondersteuning voor het ophalen van berichten van een subreddit, en niet alleen /r/MildlyInteresting.

Open je tekstverwerker en kopieer de inhoud van deze code in een bestand met de naam scrape-reddit.sh

#!/bin/bash

if [ -z “$1” ]
dan
echo “geef een subreddit”
afslag 1
fi

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

curl -s-A “bash-schraap-onderwerpen” https://www.reddit.com/r/${SUBREDDIT}.json |
jq ‘.de gegevens.kinderen | .[] | .de gegevens.titel, .de gegevens.url .de gegevens.permalink’ |
tijdens het lezen -r TITEL; doen
lees -r URL
lees -r PERMALINK
echo -e “${TITEL}t${URL}t${LINK}” | tr –delete ” >> ${OUTPUT_FILE}
gedaan

Dit script zal eerst controleren of de gebruiker heeft geleverd een subreddit naam. Zo niet, dan eindigt met een foutmelding en een niet-nul return code.

Naast, op te slaan in het eerste argument als de subreddit naam, en het opbouwen van een datum-stempel bestandsnaam waar de output zal worden opgeslagen.

De actie begint wanneer krullen heet met een aangepaste koptekst en de URL van de subreddit te schrapen. De output is doorgesluisd naar jq waar het geanalyseerd en teruggebracht tot drie velden: Titel, URL en de Permalink. Deze regels zijn te lezen, een-op-een-tijd, en opgeslagen in een variabele met behulp van de read commando, worden alle binnenkant van een while-lus, die zal doorgaan totdat er geen meer lijnen te lezen. De laatste regel van de innerlijke terwijl blok echo ‘ s van de drie velden, gescheiden door een tab-teken, en dan pijpen door de tr-opdracht, zodat de dubbele aanhalingstekens kunnen worden ontdaan. De uitgang wordt dan toegevoegd aan een bestand.

Voordat we kunnen het uitvoeren van dit script, moeten we ervoor zorgen dat deze heeft verleend, de machtiging uitvoeren. De opdracht chmod gebruiken om toepassing van deze machtigingen voor het bestand:

chmod u+x scrape-reddit.sh

En, ten slotte, het uitvoeren van het script met een subreddit naam:

./scrape-reddit.sh MildlyInteresting

Een output-bestand is gegenereerd dezelfde map en de inhoud zullen er als volgt uitzien:

Elke regel bevat de drie velden we na, van elkaar gescheiden met een tab-teken.

Verder Te Gaan

Reddit is een goudmijn van interessante content en media, en het is allemaal gemakkelijk te bereiken met de JSON API. Nu dat je een manier om toegang te krijgen tot deze gegevens en het verwerken van de resultaten kunt u verschillende dingen doen zoals:

  • Grijp de laatste headlines van de /r/WorldNews en stuur ze naar je bureaublad met de hoogte-verzenden
  • De integratie van de beste grappen van /r/DadJokes in uw systeem-Bericht-Van-De-Dag
  • Voor de beste foto van de /r/aww en maken het je desktop achtergrond

Dit alles is mogelijk met behulp van de verstrekte gegevens en de hulpmiddelen die u op uw systeem. Happy hacking!