NodeJSでSnoowrapを使ってRedditのAPIをスクレイピングする

私はサイドプロジェクトに取り組んでおり、ウェブ上の情報を集めています。この情報を不動産投資や資産管理に関する週刊ニュースレターで使用する予定です。興味がある方はニュースレターはこちらです。このプロジェクトの一部として、RedditのAPIから不動産や大家さんに関する興味深い投稿を見つけるためスクレイピングを行います。

ツール

NodeJSでRedditのAPIをスクレイピングするために必要なパッケージは一つだけです:snoowrap

Snoowrapは「Reddit API用のフル機能を持つjavascriptラッパー」です―GitHubリポジトリのインデックスページから引用。Snoowrapは本当に素晴らしく、投稿、コメント、スコアなどをクエリすることができます。

また、全てのレスポンスは独自の小さなオブジェクトとして包まれており、かなりよくドキュメント化されています。さらに、WebstormのようなIDEを使っている場合、プロジェクト内の非常に優れた型定義のおかげで関数やクラスを簡単にオートコンプリートすることができます。

Snoowrapのインストール

NodeJSで他のnpmパッケージをインストールするのと同じようにSnoowrapをインストールしてください:

npm install snoowrap --save

そして、これを要求してください:

var snoowrap = require('snoowrap');

Snoowrapの設定

Reddit APIに何か呼び出しを行う前に、oauth2を用いた初期設定を行い、アプリとトークンを生成する必要があります。これはかなり単純ですが、いくつかのステップが必要です。

  • https://not-an-aardvark.github.io/reddit-oauth-helper/にアクセスし、Redditアプリを作成する際に使用するリダイレクトURLをメモしてください(APIを呼び出すために使用するもの)。この文章を書いている時点では、URLはhttps://not-an-aardvark.github.io/reddit-oauth-helper/です。
  • https://www.reddit.com/prefs/apps/にアクセスし、新しいアプリを作成します。だいたいこのようになるはずです:

[Redditでの新しいウェブアプリの例の画像]
リダイレクトURIに注意

const r = new snoowrap({
  userAgent: 'ランダムな文字列。',
  clientId: 'oauth設定からのクライアントID',
  clientSecret: 'oauth設定からのクライアントシークレット',
  refreshToken: 'oauth設定からのトークン'
});

RealEstateサブレディットをクエリするスクリプト

snoowrapの設定が完了したら(よくやりましたね、あなたは賢い開発者です)。以下のスクリプトのようにNodeJSでRedditのAPIをクエリすることができます:

import snoowrap from 'snoowrap';

export async function scrapeSubreddit() {
  const r = new snoowrap({
    userAgent: 'ランダムな文字列。',
    clientId: 'oauth設定からのクライアントID',
    clientSecret: 'oauth設定からのクライアントシークレット',
    refreshToken: 'oauth設定からのトークン'
  });

  const subreddit = await r.getSubreddit('realEstate');
  const topPosts = await subreddit.getTop({time: 'week', limit: 3});

  let data = [];

  topPosts.forEach((post) => {
    data.push({
      link: post.url,
      text: post.title,
      score: post.score
    })
  });

  console.log(data);
};

結論

上記のスクリプトはRedditのRealEstate APIのトップ3投稿を出力します。なかなかいいでしょう? これは楽しい経験だったと思いますし、Snoowrapの仕組みが本当に好きです。今、私は作っているニュースレターを充実させるためにこのデータを利用できます。また、気になる方はこちらでチェックできます。

ありがとう、良い一日を!

こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/cpow/scraping-reddit-s-api-in-nodejs-with-snoowrap-2m9n