darkproxyscrape ロゴ

Pythonを使ってRedditをスクレイピングする方法

ハウツー, パイソン, スクレイピング, 11月02日-2022年5分で読める

目次

人々は、Facebook、Reddit、Twitterなどの複数のソースから簡単に情報を収集し、スクレイピングすることができます。スクレイパーは、ウェブページから正確かつ迅速にデータを抽出する専門ツールと考えることができる。スクレイピングAPIは、ウェブサイトが設置するアンチスクレイピング技術によってスクレイパーが禁止されるのを避けるのに役立つ。しかし、APIを使用するには、自分で管理するプロキシツールに比べてコストがかかる。

Redditを使ったことがありますか?もしあなたがソーシャル・リサーチャーで、オンラインで多くの時間を過ごしているなら、Redditの名前を聞いたことがあるかもしれない。Redditは "インターネットのフロントページ"を自称しています。これは、人々がコンテンツやニュースを共有したり、他の人の投稿にコメントしたりするオンラインディスカッションフォーラムです。そのため、インターネットマーケッターやソーシャルリサーチャーにとっては、信じられないほどのデータ源なのです。 

Redditには、Python Reddit API Wrapper(略称PRAW)と呼ばれる、データをクロールするためのAPIがある。このブログでは、Pythonを使ってRedditをスクレイピングする方法を紹介します。しかしその前に、なぜRedditをスクレイピングしなければならないのかを知っておく必要があります。

なぜRedditをスクレイピングする必要があるのか?

Redditのデザインについて話すなら、Redditは "subreddits "として知られるいくつかのコミュニティに分かれている。インターネット上で興味のあるトピックのサブレディットを見つけることができる。社会研究者は、特定のトピックに関するRedditのディスカッションを抽出すると、分析を実行し、推論を行い、実行可能な計画を実行する。 

Redditからは、次のような多くのデータをかき集めることができる:

  • リンク
  • コメント
  • 画像
  • サブレディット一覧
  • 各サブレディットへの投稿
  • ユーザー名
  • アップヴォート
  • ダウンヴォート

Redditからあなたのビジネスに関連するあらゆる情報をスクレイピングできるのは、次のようなニーズがあるからだ:

  • NLPアプリケーションの構築
  • 顧客の感情を追跡する
  • 市場動向を常に把握する
  • 消費者調査
  • マーケティング・キャンペーンの効果をモニターする

例えば、こうだ、 

  • ファッションブランドは、ファッション系サブレディットのコメントテキスト、タイトル、リンク、画像、キャプションをすべてスクレイピングする必要がある:
    • 適切な価格戦略の考案
    • カラートレンドの把握
    • さまざまなブランドでファッショニスタの悩みを発見
  • ジャーナリズムやニュース関係者は、自動テキスト要約のための機械学習アルゴリズムを訓練するために、ブログリンクを持つ著者の投稿をスクレイピングしなければならない。
  • 投資会社やトレーディング会社は、「株式市場」関連のサブレディットをかき集め、どの銘柄が議論されているかを解釈して投資計画を立てなければならない。

Redditスクレイピングの課題

Redditスクレイピングは、ウェブスクレイパー(コンピュータープログラム)を使用して、Redditウェブサイトから一般公開されているデータを抽出します。公式のReddit APIを使用すると制限に直面することになるため、Redditスクレイパーを使用する必要があります。しかし、Reddit APIを使用しないウェブスクレイパーを使用してRedditからデータを抽出すると、Redditの利用規約に違反することになります。しかし、ウェブスクレイピングが違法であることを意味するわけではありません。

スクレイピングセッションを滞りなく行うには、Redditのアンチスクレイピングシステムを回避する必要があります。Redditが使用する最も一般的なアンチ・スクレイピング・テクニックは以下の通りです:

  • IPトラッキング
  • キャプチャ

IPトラッキングの問題は、プロキシやIPローテーションの助けを借りて解決できます。一方、Captchaの問題は、2CaptchaのようなCaptchaソルブを使用することで解決できます。

Pythonを使ってRedditをスクレイピングする方法

Redditをスクレイピングする方法は5つある:

  • 手動スクレイピング - 最も簡単だが、スピードとコストの点で最も効率の悪い方法である。しかし、一貫性の高いデータを得ることができる。
  • Reddit APIを使う - Reddit APIを使ってRedditをスクレイピングするには、基本的なコーディング・スキルが必要だ。これはデータを提供するが、Redditスレッドの投稿数は1000に制限される。
  • 砂糖でコーティングされたサードパーティAPI - 効果的で拡張性のあるアプローチだが、コスト効率は悪い。
  • ウェブスクレイピングツール - これらのツールは拡張性があり、マウスを使う基本的なノウハウしか必要としない。
  • カスタム・スクレイピング・スクリプト - カスタマイズ性と拡張性に優れているが、高いプログラミング能力を必要とする。

それでは、Reddit APIを使ってどのようにRedditをスクレイピングできるか、以下のステップで見てみよう。

Reddit APIアカウントを作成する

先に進む前にRedditアカウントを作成する必要があります。PRAWを使用するには、このリンクからReddit APIに登録する必要があります。

パッケージとモジュールのインポート

まず、Pandasの組み込みモジュールであるdatetimeと、2つのサードパーティーモジュールであるPRAWとPandasをインポートする:

インポートpraw
pdとしてpandas をインポート
dtとしてdatetimeをインポートする

RedditとサブRedditのインスタンスを取得する

Praw(PythonのReddit API Wrapperの略)を使ってRedditのデータにアクセスできる。まず、praw.Reddit関数を呼び出して変数に格納することで、Redditに接続する必要があります。その後、関数に以下の引数を渡す必要があります。

reddit= praw.Reddit(client_id='PERSONAL_USE_SCRIPT_14_CHARS', \
                    client_secret='SECRET_KEY_27_CHARS ', \
                    user_agent='YOUR_APP_NAME', \
                    ユーザー名='YOUR_REDDIT_USER_NAME', \
                    password='YOUR_REDDIT_LOGIN_PASSWORD')
これで、好きなサブレディットを取得できる。そこで、redditから.subredditインスタンスを呼び出し(変数)、アクセスしたいサブレディットの名前を渡します。例えば、r/Nootropicsというサブレディットを使うことができます。
subreddit= reddit.subreddit('Nootropics')

スレッドにアクセスする

各サブレディットには、Redditorsによって作成されたトピックを整理するための以下の5つの異なる方法があります:

  • 新しい
  • ホット
  • 賛否両論
  • 金メッキ
  • トップ

最も多く投票されたトピックをつかむことができる:

top_subreddit= subreddit.top()

r/Nootropicsの上位100件の投稿を持つリストのようなオブジェクトが得られます。ただし、Redditのリクエスト上限は1000なので、.topに上限を渡すことでサンプルサイズをコントロールできます:

top_subreddit=subreddit.top(limit=600)

データの解析とダウンロード

どんなデータでもスクレイピングできます。しかし、我々はトピックに関する以下の情報をスクレイピングする:

  • アイドル
  • タイトル
  • スコア
  • 作成日
  • 本文

辞書にデータを格納し、以下のようにforループを使用します。

topics_dict = { "title":[], \
                "score":[], \
                "id":[], "url":[], \
                "created": [], \
                "body":[]}

これで、Reddit API からデータをスクレイピングできるようになりました。top_subreddit オブジェクトを繰り返し処理することで、情報を辞書に追加していきます。

forsubmissionintop_subreddit:
    topics_dict["id"].append(submission.id)
    topics_dict["title"].append(submission.title)
    topics_dict["score"].append(submission.score)
    topics_dict["created"].append(submission.created)
    topics_dict["body"].append(submission.selftext)

さて、Pythonの辞書は読みにくいので、データをPandasのDataframesに入れます。

topics_data= pd.DataFrame(topics_dict)

CSVエクスポート

Pandasで様々な形式のデータファイルを作成するのは非常に簡単なので、以下のコード行を使用してデータをCSVファイルにエクスポートします。

topics_data.to_csv('FILENAME.csv',index=False)

2021年ベストRedditプロキシ

Redditがプロキシ使用制限に関してそれほど厳密なウェブサイトではないことはご存知でしょう。しかし、プロキシを使用せずにReddit上での行動を自動化した場合、あなたは捕まり、ペナルティを受ける可能性があります。 

そこで、2つのカテゴリーに分類されるRedditのベスト・プロキシを見てみよう:

レジデンシャル・プロキシ -インターネット・サービス・プロバイダー(ISP)が特定の物理的場所にあるデバイスに割り当てるIPアドレスです。これらのプロキシは、ユーザーがウェブサイトにログインするために使用するデバイスの実際の位置を明らかにします。
データセンター・プロキシ - インターネット・サービス・プロバイダーから発信されていないさまざまなIPアドレスです。クラウドサービスプロバイダーから取得します。

以下は、Reddit用のトップクラスの住宅用およびデータセンター用プロキシです。

スマートプロキシ

Smartproxyは、Redditの自動化に効果的であるため、トップクラスのプレミアム家庭用プロキシプロバイダの1つです。広範なIPプールを持ち、サービスに加入するとすべてのIPにアクセスできる。 

ストームプロキシ

Stormproxiesの価格設定と無制限の帯域幅は良い選択です。手頃な価格で安く利用できます。様々なユースケースに対応したプロキシがあり、Redditオートメーションに最適な住宅用プロキシを提供しています。

ProxyScrape

ProxyScrapeは、スクレイピングのためのプロキシを提供することに焦点を当てた人気のあるプロキシサービスプロバイダの一つです。また、共有データセンター-プロキシと一緒に専用のデータセンター-プロキシを提供しています。それはあなたがインターネット上のウェブサイトからデータをスクレイピングするために使用することができます40k以上のデータセンター-プロキシを持っています。

ProxyScrape の3種類のサービスを提供している、 

ハイプロキシー

Highproxiesは Redditで動作し、プロキシの次のカテゴリを持っています:
  • 共有プロキシ
  • プライベート・プロキシ
  • クラシファイドサイトのプロキシ
  • 発券プロキシ
  • メディア・プロキシ

インスタントプロキシ

Instantproxiesは非常に安全で、信頼性が高く、高速で、稼働率は約99.9%なので、Redditの自動化に使用することもできます。データセンター・プロキシの中では最も安価です。

なぜRedditプロキシを使うのか?

Redditでいくつかの自動ツールを使用する場合、プロキシが必要です。Redditは非常に繊細なウェブサイトであるため、自動的なアクションを簡単に検出し、プラットフォームへのアクセスからIPをブロックしてしまうからです。 そのため、投票、投稿、グループへの参加/脱退、複数のアカウントの管理などのタスクを自動化している場合は、悪い結果を避けるためにプロキシを使用する必要があります。

Redditをスクレイピングする代替ソリューション

Redditスクレイピングの要件が小さい場合は、手動スクレイピングを行うことができます。しかし、要件が大きくなる場合は、ウェブスクレイピングツールやカスタムスクリプトなどの自動スクレイピング手法を活用する必要があります。日々のスクレイピング要件が数百万投稿以内であれば、ウェブスクレイパーがコストとリソース効率に優れていることがわかります。

それでは、大量のRedditデータをスクレイピングするための最適なソリューションとして、最高のRedditスクレイパーをいくつか見てみましょう。

スクラップストローム

Scrapestormは、Redditのスクレイピングに関しては非常に素晴らしい働きをするので、市場で入手可能な最高のスクレイピングツールの一つである。人工知能を利用して、ウェブページ上の重要なデータポイントを自動的に特定する。

ApifyのRedditスクレイパー

ApifyのRedditスクレイパーを使えば、Reddit APIを使わずに簡単にデータを抽出することができます。つまり、商用利用のためにデータをダウンロードするために、開発者APIトークンとRedditからの承認が必要ないのです。また、アピファイプラットフォームの統合されたプロキシサービスを使用することで、スクレイピングを最適化することができます。 

結論

Redditのデータをスクレイピングする5つの方法について説明したが、最も簡単なのはReddit APIを使う方法だ。PRAWはReddit APIのPythonラッパーで、きれいなPythonインターフェースでReddit APIを使うことができる。しかし、大規模なRedditスクレイピングが必要な場合は、Redditスクレイパーの助けを借りて、Redditウェブサイトから一般公開されているデータを抽出することができます。Redditウェブサイト上のアクションを自動化するには、データセンターまたは居住型プロキシを使用する必要があります。