Πώς να ξύσετε μια λίστα θεμάτων από ένα Subreddit χρησιμοποιώντας το Bash

Το Reddit προσφέρει ροές JSON για κάθε subreddit. Δείτε πώς μπορείτε να δημιουργήσετε ένα σενάριο Bash που κατεβάζει και αναλύει μια λίστα αναρτήσεων από οποιοδήποτε subreddit που θέλετε. Αυτό είναι μόνο ένα πράγμα που μπορείτε να κάνετε με τις ροές JSON του Reddit.

Εγκατάσταση Curl και JQ

Θα χρησιμοποιήσουμε το curl για να ανακτήσουμε τη ροή JSON από το Reddit και το jq για να αναλύσουμε τα δεδομένα JSON και να εξαγάγουμε τα πεδία που θέλουμε από τα αποτελέσματα. Εγκαταστήστε αυτές τις δύο εξαρτήσεις χρησιμοποιώντας το apt-get στο Ubuntu και σε άλλες διανομές Linux που βασίζονται στο Debian. Σε άλλες διανομές Linux, χρησιμοποιήστε το εργαλείο διαχείρισης πακέτων της διανομής σας.

sudo apt-get install curl jq

Λήψη ορισμένων δεδομένων JSON από το Reddit

Ας δούμε πώς φαίνεται η ροή δεδομένων. Χρησιμοποιήστε το curl για να λάβετε τις τελευταίες δημοσιεύσεις από το Ήπια Ενδιαφέρον subreddit:

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

Σημειώστε πώς οι επιλογές που χρησιμοποιούνται πριν από τη διεύθυνση URL: -s αναγκάζουν το curl να εκτελείται σε αθόρυβη λειτουργία, έτσι ώστε να μην βλέπουμε καμία έξοδο, εκτός από τα δεδομένα από τους διακομιστές του Reddit. Η επόμενη επιλογή και η παράμετρος που ακολουθεί, -Ένα “παράδειγμα reddit scraper” , ορίζει μια προσαρμοσμένη συμβολοσειρά παράγοντα χρήστη που βοηθά το Reddit να αναγνωρίσει την υπηρεσία που έχει πρόσβαση στα δεδομένα του. Οι διακομιστές Reddit API εφαρμόζουν όρια ρυθμού με βάση τη συμβολοσειρά παράγοντα χρήστη. Ο ορισμός μιας προσαρμοσμένης τιμής θα αναγκάσει το Reddit να τμηματοποιήσει το όριο χρέωσης από άλλους καλούντες και να μειώσει την πιθανότητα να λάβουμε σφάλμα υπέρβασης ορίου χρέωσης HTTP 429.

  Πώς να ανοίξετε αρχεία MS Office στο Google Suite στα Windows 10

Η έξοδος πρέπει να γεμίσει το παράθυρο του τερματικού και να μοιάζει κάπως έτσι:

Υπάρχουν πολλά πεδία στα δεδομένα εξόδου, αλλά το μόνο που μας ενδιαφέρει είναι ο τίτλος, ο μόνιμος σύνδεσμος και η διεύθυνση URL. Μπορείτε να δείτε μια εξαντλητική λίστα με τους τύπους και τα πεδία τους στη σελίδα τεκμηρίωσης API του Reddit: https://github.com/reddit-archive/reddit/wiki/JSON

Εξαγωγή δεδομένων από την έξοδο JSON

Θέλουμε να εξαγάγουμε τον τίτλο, τον μόνιμο σύνδεσμο και τη διεύθυνση URL από τα δεδομένα εξόδου και να τα αποθηκεύσουμε σε ένα αρχείο οριοθετημένο με στηλοθέτες. Μπορούμε να χρησιμοποιήσουμε εργαλεία επεξεργασίας κειμένου όπως το sed και το grep, αλλά έχουμε ένα άλλο εργαλείο στη διάθεσή μας που κατανοεί τις δομές δεδομένων JSON, που ονομάζεται jq. Για την πρώτη μας προσπάθεια, ας το χρησιμοποιήσουμε για να εκτυπώσουμε όμορφα και να κωδικοποιήσουμε έγχρωμα την έξοδο. Θα χρησιμοποιήσουμε την ίδια κλήση όπως πριν, αλλά αυτή τη φορά, διοχετεύουμε την έξοδο μέσω του jq και δίνουμε εντολή να αναλύσει και να εκτυπώσει τα δεδομένα JSON.

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

Σημειώστε την περίοδο που ακολουθεί την εντολή. Αυτή η έκφραση απλώς αναλύει την είσοδο και την εκτυπώνει ως έχει. Η έξοδος φαίνεται όμορφα διαμορφωμένη και χρωματικά κωδικοποιημένη:

Ας εξετάσουμε τη δομή των δεδομένων JSON που λαμβάνουμε από το Reddit. Το ριζικό αποτέλεσμα είναι ένα αντικείμενο που περιέχει δύο ιδιότητες: είδος και δεδομένα. Το τελευταίο κατέχει μια ιδιότητα που ονομάζεται παιδιά, η οποία περιλαμβάνει μια σειρά αναρτήσεων σε αυτό το subreddit.

Κάθε στοιχείο στον πίνακα είναι ένα αντικείμενο που περιέχει επίσης δύο πεδία που ονομάζονται είδος και δεδομένα. Οι ιδιότητες που θέλουμε να αρπάξουμε βρίσκονται στο αντικείμενο δεδομένων. Το jq αναμένει μια έκφραση που μπορεί να εφαρμοστεί στα δεδομένα εισόδου και παράγει την επιθυμητή έξοδο. Πρέπει να περιγράφει τα περιεχόμενα ως προς την ιεραρχία και τη συμμετοχή τους σε έναν πίνακα, καθώς και τον τρόπο μετασχηματισμού των δεδομένων. Ας εκτελέσουμε ξανά ολόκληρη την εντολή με τη σωστή έκφραση:

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

Η έξοδος εμφανίζει τίτλο, διεύθυνση URL και μόνιμο σύνδεσμο το καθένα στη δική του γραμμή:

  Δημιουργήστε και μοιραστείτε Συλλογές Ενδιαφέροντος Περιεχομένου

Ας βουτήξουμε στην εντολή jq που ονομάσαμε:

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

Υπάρχουν τρεις εκφράσεις σε αυτήν την εντολή που χωρίζονται με δύο σύμβολα σωλήνα. Τα αποτελέσματα κάθε έκφρασης περνούν στην επόμενη για περαιτέρω αξιολόγηση. Η πρώτη έκφραση φιλτράρει τα πάντα εκτός από τη σειρά των καταχωρίσεων του Reddit. Αυτή η έξοδος διοχετεύεται στη δεύτερη έκφραση και εξαναγκάζεται σε έναν πίνακα. Η τρίτη έκφραση δρα σε κάθε στοιχείο του πίνακα και εξάγει τρεις ιδιότητες. Περισσότερες πληροφορίες σχετικά με το jq και τη σύνταξη έκφρασής του μπορείτε να βρείτε στο το επίσημο εγχειρίδιο της jq.

Βάζοντας τα όλα μαζί σε ένα σενάριο

Ας βάλουμε την κλήση API και τη μετα-επεξεργασία JSON σε ένα σενάριο που θα δημιουργήσει ένα αρχείο με τις αναρτήσεις που θέλουμε. Θα προσθέσουμε υποστήριξη για τη λήψη αναρτήσεων από οποιοδήποτε subreddit, όχι μόνο από /r/MildlyInteresting.

Ανοίξτε το πρόγραμμα επεξεργασίας και αντιγράψτε τα περιεχόμενα αυτού του αποσπάσματος σε ένα αρχείο που ονομάζεται 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

Αυτό το σενάριο θα ελέγξει πρώτα εάν ο χρήστης έχει παράσχει ένα όνομα subreddit. Εάν όχι, κλείνει με ένα μήνυμα σφάλματος και έναν μη μηδενικό κωδικό επιστροφής.

  Πώς να διορθώσετε τη μονάδα Flash όταν τα αρχεία γίνονται συντομεύσεις (ΛΥΣΕΙΣ)

Στη συνέχεια, θα αποθηκεύσει το πρώτο όρισμα ως όνομα subreddit και θα δημιουργήσει ένα όνομα αρχείου με σφραγίδα ημερομηνίας όπου θα αποθηκευτεί η έξοδος.

Η ενέργεια ξεκινά όταν καλείται το curl με μια προσαρμοσμένη κεφαλίδα και τη διεύθυνση URL του subreddit για scrape. Η έξοδος διοχετεύεται στο jq όπου αναλύεται και μειώνεται σε τρία πεδία: Τίτλος, URL και Μόνιμος Σύνδεσμος. Αυτές οι γραμμές διαβάζονται, μία κάθε φορά, και αποθηκεύονται σε μια μεταβλητή χρησιμοποιώντας την εντολή ανάγνωσης, όλες μέσα σε ένα βρόχο while, που θα συνεχιστεί μέχρι να μην υπάρχουν άλλες γραμμές για ανάγνωση. Η τελευταία γραμμή του εσωτερικού μπλοκ while αντηχεί τα τρία πεδία, που οριοθετούνται από έναν χαρακτήρα καρτέλας, και στη συνέχεια τη διοχετεύει μέσω της εντολής tr έτσι ώστε τα διπλά εισαγωγικά να μπορούν να αφαιρεθούν. Στη συνέχεια, η έξοδος προσαρτάται σε ένα αρχείο.

Προτού μπορέσουμε να εκτελέσουμε αυτό το σενάριο, πρέπει να διασφαλίσουμε ότι του έχουν παραχωρηθεί δικαιώματα εκτέλεσης. Χρησιμοποιήστε την εντολή chmod για να εφαρμόσετε αυτά τα δικαιώματα στο αρχείο:

chmod u+x scrape-reddit.sh

Και, τέλος, εκτελέστε το σενάριο με ένα όνομα subreddit:

./scrape-reddit.sh MildlyInteresting

Ένα αρχείο εξόδου δημιουργείται στον ίδιο κατάλογο και τα περιεχόμενά του θα μοιάζουν κάπως έτσι:

Κάθε γραμμή περιέχει τα τρία πεδία που αναζητούμε, χωρισμένα χρησιμοποιώντας έναν χαρακτήρα καρτέλας.

Προχωρώντας Παραπέρα

Το Reddit είναι ένα χρυσωρυχείο ενδιαφέροντος περιεχομένου και πολυμέσων, και όλα είναι εύκολα προσβάσιμα χρησιμοποιώντας το JSON API του. Τώρα που έχετε έναν τρόπο πρόσβασης σε αυτά τα δεδομένα και επεξεργασίας των αποτελεσμάτων, μπορείτε να κάνετε πράγματα όπως:

Πάρτε τους πιο πρόσφατους τίτλους από το /r/WorldNews και στείλτε τους στην επιφάνεια εργασίας σας χρησιμοποιώντας ειδοποιώ-αποστέλλω
Ενσωματώστε τα καλύτερα αστεία από το /r/DadJokes στο Message-Of-The-Day του συστήματός σας
Λάβετε την καλύτερη εικόνα σήμερα από το /r/aww και κάντε την το φόντο της επιφάνειας εργασίας σας

Όλα αυτά είναι δυνατά χρησιμοποιώντας τα δεδομένα που παρέχονται και τα εργαλεία που έχετε στο σύστημά σας. Καλό hacking!