A Reddit JSON-hírcsatornákat kínál minden alprogramhoz. Így hozhat létre olyan Bash szkriptet, amely letölti és elemzi a hozzászólások listáját bármilyen tetszőleges alprogramból. Ez csak egy dolog, amit tehet a Reddit JSON-hírcsatornáival.
A Curl és a JQ telepítése
Használni fogjuk
becsavar
hogy lehívja a JSON hírcsatornát a Reddit és
jq
a JSON-adatok elemzése és a kívánt mezők kibontása az eredményekből. Telepítse ezt a két függőséget a
apt-get
az Ubuntu és más Debian-alapú Linux disztribúciókon. Más Linux disztribúciók esetén használja a disztribúció csomagkezelő eszközét.
sudo apt-get install curl jq
Hívjon néhány JSON-adatot a Redditből
Lássuk, hogyan néz ki az adatcsatorna. Használat
becsavar
letölteni a legfrissebb bejegyzéseket a
Enyhén Érdekes
subreddit:
curl -s - „Reddit lehúzó példa” https://www.reddit.com/r/MildlyInteresting.json
Vegye figyelembe, hogy az URL előtt használt opciók:
-s
arra kényszeríti a curl-t, hogy csendes üzemmódban fusson, így nem látunk semmilyen kimenetet, kivéve a Reddit szervereiről származó adatokat. A következő opció és az azt követő paraméter,
-Reddit lehúzó példa
, beállít egy egyéni felhasználói ügynök karakterláncot, amely segít a Reddit-nek azonosítani az adataikhoz hozzáférő szolgáltatást. A Reddit API-kiszolgálók sebességkorlátokat alkalmaznak a felhasználói ügynök karakterláncán alapulva. Egyéni érték beállítása arra készteti a Reddit-t, hogy szegmensünket szegmentálja más hívóktól, és csökkentse annak esélyét, hogy HTTP 429-es túllépési sebesség túllépési hibát kapjunk.
A kimenetnek ki kell töltenie a terminál ablakát, és így kell kinéznie:
Rengeteg mező van a kimeneti adatokban, de csak a cím, az állandó link és az URL érdekel minket. A típusok és azok mezőinek teljes listáját a Reddit API dokumentációs oldalán láthatja: https://github.com/reddit-archive/reddit/wiki/JSON
Adatok kinyerése a JSON kimenetből
Szeretnénk kibontani a címet, az állandó linket és az URL-t a kimeneti adatokból, és egy tabulátorral elválasztott fájlba menteni. Használhatunk például szövegszerkesztő eszközöket
és
és
markolat
, de van egy másik eszközünk, amely megérti a JSON adatstruktúrákat, az úgynevezett
jq
. Első kísérletünkre használjuk a kimenet szép nyomtatásához és színkódolásához. Ugyanazt a hívást fogjuk használni, mint korábban, de ezúttal vezesse át a kimenetet
jq
és utasítsa a JSON-adatok elemzésére és kinyomtatására.
curl -s -A „reddit lehúzó példa” https://www.reddit.com/r/MildlyInteresting.json | jq.
Vegye figyelembe a parancsot követő időszakot. Ez a kifejezés egyszerűen elemzi a bemenetet és kinyomtatja. A kimenet szépen formázott és színkódolt:
Vizsgáljuk meg a Reddit-től visszakapott JSON-adatok szerkezetét. A gyökéreredmény egy olyan objektum, amely két tulajdonságot tartalmaz: fajta és adat. Ez utóbbi birtokában van egy úgynevezett ingatlan
gyermekek
, amely tartalmaz egy sor bejegyzést ehhez a subreddithez.
A tömb minden eleme egy objektum, amely két fajta és adat mezőt is tartalmaz. Azok a tulajdonságok, amelyeket meg akarunk ragadni, az adatobjektumban találhatók.
jq
olyan kifejezést vár, amely alkalmazható a bemeneti adatokra, és előállítja a kívánt kimenetet. Le kell írnia a tartalmat hierarchiájuk és tömb tagságuk szempontjából, valamint azt, hogy az adatokat hogyan kell átalakítani. Futtassuk újra az egész parancsot a helyes kifejezéssel:
curl -s -A „reddit lehúzó példa” https://www.reddit.com/r/MildlyInteresting.json | jq ’.adatok.gyerekek | . [] | .data.title, .data.url, .data.permalink ’
A kimenet a címet, az URL-t és az állandó linket a saját sorukon mutatja:
Merüljünk el a
jq
parancsot hívtuk:
jq ’.adatok.gyerekek | . [] | .data.title, .data.url, .data.permalink ’
Ebben a parancsban három kifejezés van, amelyeket két csőszimbólum választ el. Az egyes kifejezések eredményeit továbbadjuk a következőnek további értékelés céljából. Az első kifejezés mindent kiszűr, kivéve a Reddit listák tömbjét. Ez a kimenet a második kifejezésbe kerül és egy tömbbe kényszerül. A harmadik kifejezés a tömb minden elemére hat, és három tulajdonságot von ki. További információ
jq
és kifejezési szintaxisa megtalálható a
jq hivatalos kézikönyve
.
Az egészet összeírva egy szkriptben
Helyezzük össze az API hívást és a JSON utófeldolgozást egy szkriptbe, amely létrehoz egy fájlt a kívánt bejegyzésekkel. Támogatást fogunk adni a bejegyzések letöltéséhez bármilyen subredditből, nem csak a / r / MildlyInteresting szolgáltatásból.
Nyissa meg a szerkesztőt, és másolja a kódrészlet tartalmát a scrape-reddit.sh nevű fájlba
#! / bin / bash
ha [ -z "$1" ]
azután
echo "Kérjük, adjon meg egy albreddit"
kilépés 1
fi
SUBREDDIT = 1 USD
MOST = $ (dátum + "% m_% d_% y-% H_% M")
OUTPUT_FILE = "$ {SUBREDDIT}_ $ {NOW}.txt"
göndör -s -A "bash-kaparós témák" https://www.reddit.com/r/${SUBREDDIT}.json | \
jq '.adatok.gyerekek | . [] | .data.title, .data.url, .data.permalink '| \
olvasás közben -r TITLE; csináld
read -r URL
olvassa -r PERMALINK
echo -e "$ {TITLE} \ t $ {URL} \ t $ {PERMALINK}" | tr --delete \ ">> {OUTPUT_FILE} USD
Kész
Ez a szkript először ellenőrzi, hogy a felhasználó megadta-e a subbreddit nevet. Ha nem, akkor hibaüzenettel és nullától eltérő visszatérési kóddal lép ki.
Ezután tárolja az első argumentumot subreddit névként, és felépíti a dátummal bélyegzett fájlnevet, ahová a kimenet mentésre kerül.
A cselekvés akkor kezdődik
becsavar
meghívásra kerül egy egyéni fejléccel és a kaparandó albreddit URL-jével. A kimenetet csövezzük
jq
ahol elemzett és három mezőre redukálva van: Cím, URL és Permalink. Ezeket a sorokat egyszerre olvassuk el, és a read paranccsal egy változóba mentsük őket, mindezt egy darab ciklus belsejében, amely addig folytatódik, amíg nincs több sor olvasható. A belső, míg a belső blokk utolsó sora visszhangozza a három mezőt, amelyet egy tabulátor karakter határoz meg, majd átvezeti a
tr
parancsot, hogy a dupla idézőjelek lehúzhatók legyenek. A kimenetet ezután egy fájlhoz csatolják.
Mielőtt futtathatnánk ezt a szkriptet, meg kell győződnünk arról, hogy megkapta-e végrehajtási engedélyeket. Használja a
chmod
parancs az alábbi engedélyek alkalmazásához a fájlhoz:
chmod u + x kaparás-reddit.sh
Végül hajtsa végre a szkriptet egy subbreddit névvel:
./scrape-reddit.sh Enyhén Érdekes
A kimeneti fájl ugyanazt a könyvtárat hozza létre, és annak tartalma így néz ki:
Minden sor azt a három mezőt tartalmazza, amelyek után vagyunk, egy tabulátor karakterrel elválasztva.
Tovább megyek
A Reddit érdekes tartalom és média aranybányája, és mindez könnyen elérhető a JSON API segítségével. Most, hogy módja van hozzáférni ezekhez az adatokhoz és feldolgozni az eredményeket, a következőket teheti:
- Fogja meg a / r / WorldNews legfrissebb címsorait, és a gombbal küldje el az asztalra értesít-küld
- Integrálja a / r / DadJokes legjobb poénjait a rendszer napi üzenetébe
- Szerezd meg a mai legjobb képet a / r / aww fájlból, és állítsd az asztal hátterévé
Mindez a rendelkezésre álló adatok és a rendszeren lévő eszközök segítségével lehetséges. Boldog hackelést!