Reddit為每個subreddit提供JSON提要。下面是如何建立一個Bash指令碼,從您喜歡的任何subreddit下載並解析帖子列表。這只是Reddit的JSON提要可以做的一件事。
我們將使用curl從Reddit和jq獲取JSON提要,解析JSON資料並從結果中提取所需的欄位。在Ubuntu和其他基於Debian的Linux發行版上使用apt-get安裝這兩個依賴項。在其他Linux發行版上,請改用發行版的包管理工具。
sudo apt-get install curl jq讓我們看看資料提要是什麼樣子的。使用curl從MildlyInteresting subreddit獲取最新帖子:
curl -s -A “reddit scraper example” https://www.reddit.com/r/MildlyInteresting.json注意URL:-s之前使用的選項是如何強制curl在靜默模式下執行的,這樣除了Reddit伺服器上的資料外,我們就看不到任何輸出了。下一個選項和後面的引數,-A“reddit scraper example”設定一個自定義使用者代理字串,幫助reddit識別訪問其資料的服務。redditapi伺服器基於使用者代理字串應用速率限制。設定一個自定義值將導致Reddit將我們的速率限制與其他呼叫者分開,並減少出現http429速率限制超出錯誤的可能性。
輸出應該填滿終端視窗,如下所示:
輸出資料中有很多欄位,但我們感興趣的只是標題、永久連結和URL。您可以在Reddit的API文件頁面上看到型別及其欄位的詳盡列表:https://github.com/reddit-archive/reddit/wiki/JSON
我們要從輸出資料中提取Title、Permalink和URL,並將其儲存到一個以製表符分隔的檔案中。我們可以使用sed和grep這樣的文字處理工具,但是我們還有另一個可以理解JSON資料結構的工具,稱為jq。在我們的第一次嘗試中,讓我們使用它來漂亮地列印輸出並對輸出進行顏色編碼。我們將使用與前面相同的呼叫,但是這次,透過jq管道輸出並指示它解析和列印JSON資料。
curl -s -A “reddit scraper example” https://www.reddit.com/r/MildlyInteresting.json | jq .注意命令後面的句點。這個表示式只是解析輸入並按原樣列印。輸出的格式和顏色很好:
讓我們檢查一下從Reddit返回的JSON資料的結構。根結果是一個包含兩個屬性的物件:kind和data。後者擁有一個名為children的屬性,其中包含一個指向此子reddit的post陣列。
陣列中的每個項都是一個物件,它還包含兩個名為kind和data的欄位。我們要獲取的屬性在資料物件中。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後處理放在一個指令碼中,這個指令碼將生成一個包含我們想要的post的檔案。我們將新增對從任何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名稱。否則,它將退出並返回一條錯誤訊息和一個非零返回程式碼。
接下來,它將第一個引數儲存為subreddit名稱,並建立一個帶有日期戳的檔名來儲存輸出。
當使用自定義頭和要刮取的子reddit的URL呼叫curl時,操作開始。輸出透過管道傳輸到jq,在jq中解析並簡化為三個欄位:Title、URL和Permalink。這些行一次讀取一行,然後使用read命令儲存到一個變數中,所有這些行都在while迴圈中,該迴圈將一直持續到沒有其他行可讀取為止。內部while塊的最後一行回顯由製表符分隔的三個欄位,然後透過tr命令傳遞它,以便可以去掉雙引號。然後將輸出附加到檔案。
在執行此指令碼之前,必須確保已授予它執行許可權。使用chmod命令將這些許可權應用於檔案:
chmod u+x scrape-reddit.sh最後,使用subreddit名稱執行指令碼:
./scrape-reddit.sh MildlyInteresting輸出檔案在同一目錄下生成,其內容如下所示:
每行包含我們要查詢的三個欄位,用製表符分隔。
Reddit是一個有趣的內容和媒體的金礦,使用它的jsonapi很容易訪問。現在您有了訪問這些資料和處理結果的方法,您可以執行以下操作:
使用提供的資料和系統上的工具,所有這些都是可能的。快樂駭客!
... 本課程將帶您瞭解Linux的“如何”和“為什麼”,並展示各種Linux命令的工作方式、它們的真實結構以及記住這些命令的正確方法。 ...
... 但您不太可能從一開始就擁有訂閱的預設subreddits的體驗。讓我們來談談為什麼它們通常都很糟糕,最好的subredits你應該遵循。 ...
...式設計師和極客的天堂。我們已經寫了很多關於作業系統如何適合從學生到藝術家的每個人的文章,但是是的,Linux是一個很好的程式設計平臺。無論您是考慮到開放精神還是整個生態系統,都有很多理由考慮讓Linux成為您編寫...
...址或電話號碼可能被誤用。現在是時候問問自己了---“我如何找到所有與我的電子郵件地址連結的帳戶?” ...
Reddit有那麼多人在這麼多subreddit上談論這麼多事情。你怎樣才能輕易地得到最好的推薦?嗯,有一些網站和應用程式收集了Reddit的精華。 ...
... Android和iOS都有自己的subreddits,它們是各種應用程式(包括****)的推薦和交易寶庫。他們有一個活躍的追隨者與成千上萬的訂戶誰張貼相當定期。這些主題涵蓋了從一般彙編到技巧和竅門,您...
...為輸入執行它。這些特殊的應用程式被稱為水滴。下面是如何建立一個: ...
... 如何在windows10上安裝linux bash shell ...