Bashを使用してSubredditからトピックのリストを取得する方法

Mar 26, 2025
クラウドとインターネット
Fatmawati Achmad Zaenuri / Shutterstock.com

Redditは、各subredditのJSONフィードを提供します。好きなsubredditから投稿のリストをダウンロードして解析するBashスクリプトを作成する方法は次のとおりです。これは、RedditのJSONフィードで実行できることの1つにすぎません。

CurlとJQのインストール

使用します カール RedditからJSONフィードをフェッチして jq JSONデータを解析し、結果から必要なフィールドを抽出します。を使用してこれら2つの依存関係をインストールします apt-get Ubuntuおよびその他のDebianベースのLinuxディストリビューション。他のLinuxディストリビューションでは、代わりにディストリビューションのパッケージ管理ツールを使用してください。

sudo apt-get install curl jq

RedditからJSONデータを取得する

データフィードがどのように見えるか見てみましょう。使用する カール から最新の投稿を取得するには ややおもしろい subreddit:

curl -s-「redditスクレーパーの例」https://www.reddit.com/r/MildlyInteresting.json

URLの前に使用されているオプションに注意してください。 -s 強制的にcurlをサイレントモードで実行し、Redditのサーバーからのデータ以外の出力が表示されないようにします。次のオプションとそれに続くパラメータ、 -「redditスクレーパーの例」 、Redditがデータにアクセスするサービスを識別するのに役立つカスタムユーザーエージェント文字列を設定します。 Reddit APIサーバーは、ユーザーエージェント文字列に基づいてレート制限を適用します。カスタム値を設定すると、Redditはレート制限を他の呼び出し元からセグメント化し、HTTP429レート制限超過エラーが発生する可能性を減らします。

出力はターミナルウィンドウを埋め、次のようになります。

出力データには多くのフィールドがありますが、関心があるのはタイトル、パーマリンク、およびURLだけです。 RedditのAPIドキュメントページで、タイプとそのフィールドの完全なリストを確認できます。 hっtps://ぎてゅb。こm/れっぢtーあrちゔぇ/れっぢt/うぃき/Jそん

JSON出力からのデータの抽出

出力データからタイトル、パーマリンク、およびURLを抽出し、タブ区切りファイルに保存します。次のようなテキスト処理ツールを使用できます そして そして グリップ 、しかし、JSONデータ構造を理解する別のツールがあります。 jq 。最初の試みとして、これを使用して出力をきれいに印刷し、色分けしてみましょう。以前と同じ呼び出しを使用しますが、今回は出力をパイプします jq JSONデータを解析して印刷するように指示します。

curl -s-「redditスクレーパーの例」https://www.reddit.com/r/MildlyInteresting.json | jq。

コマンドに続く期間に注意してください。この式は、入力を解析してそのまま出力するだけです。出力は適切にフォーマットされ、色分けされているように見えます。

Redditから取得したJSONデータの構造を調べてみましょう。ルート結果は、kindとdataの2つのプロパティを含むオブジェクトです。後者はと呼ばれるプロパティを保持します 子供達 、このsubredditへの投稿の配列が含まれています。

配列の各項目は、kindとdataという2つのフィールドも含むオブジェクトです。取得するプロパティはデータオブジェクトにあります。 jq 入力データに適用でき、目的の出力を生成できる式が必要です。階層と配列のメンバーシップ、およびデータの変換方法の観点からコンテンツを記述する必要があります。正しい式を使用して、コマンド全体をもう一度実行してみましょう。

curl -s-「redditスクレーパーの例」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 ’

このコマンドには、2つのパイプ記号で区切られた3つの式があります。各式の結果は、さらに評価するために次の式に渡されます。最初の式は、Redditリストの配列を除くすべてを除外します。この出力は2番目の式にパイプされ、配列に強制されます。 3番目の式は、配列の各要素に作用し、3つのプロパティを抽出します。についての詳細 jq そしてその式の構文はで見つけることができます jqの公式マニュアル

すべてを1つのスクリプトにまとめる

API呼び出しとJSON後処理をスクリプトにまとめて、必要な投稿を含むファイルを生成しましょう。 / r / MildlyInterestingだけでなく、任意のsubredditから投稿をフェッチするためのサポートを追加します。

エディターを開き、このスニペットの内容をscrape-reddit.shというファイルにコピーします

#!/ bin / bash

[ -z "$1" ]の場合
  その後
    echo "subredditを指定してください"
    出口1
fi

SUBREDDIT = $ 1
NOW = $(日付+ "%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 '| \
        -rTITLEを読みながら;行う
                -rURLを読む
                読む-rパーマリンク
                echo -e "$ {TITLE} \ t $ {URL} \ t $ {PERMALINK}" | tr --delete \ ">> $ {OUTPUT_FILE}
        完了

このスクリプトは、最初にユーザーがsubreddit名を指定したかどうかを確認します。そうでない場合は、エラーメッセージとゼロ以外のリターンコードで終了します。

次に、最初の引数をsubreddit名として保存し、出力が保存される日付スタンプ付きのファイル名を作成します。

アクションは次のときに始まります カール カスタムヘッダーとスクレイプするsubredditのURLを使用して呼び出されます。出力はにパイプされます jq ここで解析され、タイトル、URL、パーマリンクの3つのフィールドに縮小されます。これらの行は一度に1つずつ読み取られ、readコマンドを使用して変数に保存されます。すべてwhileループ内で、読み取る行がなくなるまで続行されます。内側のwhileブロックの最後の行は、タブ文字で区切られた3つのフィールドをエコーし​​、パイプでつなぎます。 tr 二重引用符を削除できるようにコマンドを実行します。次に、出力がファイルに追加されます。

このスクリプトを実行する前に、実行権限が付与されていることを確認する必要があります。使用 chmod これらの権限をファイルに適用するコマンド:

chもd う+x scらぺーれっぢt。sh

そして最後に、subreddit名でスクリプトを実行します。

./scrape-reddit.shMildlyInteresting

出力ファイルは同じディレクトリで生成され、その内容は次のようになります。

各行には、タブ文字を使用して区切られた3つのフィールドが含まれています。

もっと遠く行く

Redditは興味深いコンテンツとメディアの宝庫であり、JSONAPIを使用してすべて簡単にアクセスできます。これで、このデータにアクセスして結果を処理する方法ができたので、次のようなことができます。

  • / r / WorldNewsから最新のヘッドラインを取得し、を使用してデスクトップに送信します。 通知-送信
  • / r / DadJokesの最高のジョークをシステムのMessage-Of-The-Dayに統合します
  • / r / awwから今日の最高の写真を入手して、デスクトップの背景にします

これはすべて、提供されたデータとシステムにあるツールを使用して可能です。ハッピーハッキング!

Using Scrapy On Reddit.com


クラウドとインターネット - 最も人気のある記事

iOS 10にロールバックする方法(iOS 11ベータ版を使用している場合)

クラウドとインターネット Jul 6, 2025

未取得のコンテンツ だからあなたは iOS11ベータ版をインストールしました そして、まあ、あなたはそれを愛していません..


無料のストレージを提供するすべてのクラウドストレージサービス

クラウドとインターネット Jul 16, 2025

未取得のコンテンツ クラウドストレージは、PC後のモバイルに焦点を当てたテクノロジーの世界の夢ですが、まだ実現していません�..


真の映画館体験のためにプレックス映画に予告編を追加する方法

クラウドとインターネット May 8, 2025

未取得のコンテンツ あなたが映画の予告編、プレロール、そして映画のような体験につながる期待の積み重ねのファンなら、私たち�..


これらのキーボードショートカットでYouTubeの「スペースバーの問題」を解決する

クラウドとインターネット Mar 8, 2025

これはおなじみですか? YouTubeで動画の視聴を開始し、一時停止したいとします。そのため、キーボードのスペースバーを押しますが�..


ChromebookでCroutonLinuxシステムを管理する方法

クラウドとインターネット Apr 8, 2025

Googleの従業員によって作成されたCroutonは、ChromebookでLinuxを実行するための理想的なソリューションです。 Croutonユーザーの場合、知っ�..


テザリング時にコンピュータのブラウザが使用するデータを少なくする方法

クラウドとインターネット Jul 14, 2025

未取得のコンテンツ Webサイト(少なくともデスクトップバージョン)はブロードバンド接続用に設計されており、かつてないほど大�..


Chromeで毎日新しいランダムゲームをプレイする

クラウドとインターネット Mar 19, 2025

未取得のコンテンツ 毎日少しの間くつろぐことができると、時間がとても良くなり、気分がリフレッシュするのに役立ちます。リラックス�..


Firefox3でInternetExplorerと同じようにWindowsVistaGlassを使用する

クラウドとインターネット Jun 13, 2025

VistaでFirefoxを実行することについて私を本当に悩ませていることの1つは、InternetExplorerがナビゲーションバー全体に広がるAeroGlassで非常に滑ら..


カテゴリ