Twitterからユーザー情報の取得・スクレイピングを行う方法

Twitterでは、APIを介さないスクレイピング行為が明確に禁止されています。

ユーザーはまた、たとえばTwitterサービスの妨害や当社が提供するインターフェースおよび手順以外の方法を使ったTwitterサービスへのアクセスにより、Twitterサービスの不正利用をしないことにも同意するものとします。ユーザーは、本サービスへのアクセスまたはその使用中に、次のいずれも行ってはなりません。
(iii)Twitterから提供される(かつ該当する利用条件に従う場合にのみ提供される)、当社の現在利用可能な公開インターフェース以外の方法(自動プログラムか否かを問わない)で、本サービスへのアクセスもしくはその探索またはアクセスもしくは探索の試み(ただし、Twitterとの個別契約で特に許可されている場合は除く)(注:本サービスへのクローリングは、robots.txtファイルの定めによる場合は認められていますが、Twitterによる事前の同意がないまま本サービスのスクレイピングをすることは明示的に禁止されています)

Twitterが提供するインターフェイスであるAPIを介して行うスクレイピングはOKだが、それ以外のマニュアル的なスクレイピングは事前の同意がなければ明確にNGだと書かれています。

「そもそも同意のとり方が『みなし同意』であり、同意の有効性に疑問が大きい。同意した覚えのない利用規約に従う必要はない」、「自分は登録しておらず、ユーザーではないからユーザーとの取り決めである利用規約の適用は受けない」と解釈している記事を見かけましたが…!

まぁ確かに、と思える節はあります。ただし、大なり小なりリスクがある点はご承知おきください。

どうやって自動化禁止サイトをスマートに確認できるか? 基本的には利用規約を見ましょう。 私はだいたい「Ctrl + F」でページ内検索をかけて、「自動」「ボット」「スクレイピング」などで検索してヒットした部分しか読んでいません。

Twitter API経由でユーザー情報を取得する

image
Twitter API v2でできること たとえばTwitter API v2に搭載されている「Twitter APIの中の Search API」という機能を使い、特定の条件に合わせたツイートやフォロワー数といった情報の収集を行います。 収集する情報の精度は、書き込む内容によって異なります。

Twitter APIの各プランによる過去ツイート検索の違いについて

Standardプランでは、ツイート検索については直近7日間のツイートデータのみ検索対象の"Recent Search"のみ利用可能。

Search Tweets > Recent search

直近7日間のツイートから情報を取得。

直近7日間だけでなく、過去30日間からの検索"Premium Search"または期間をさだめず全ての期間で検索可能な"Full-archive search"は有料プラン契約が必要です。

Standardは過去7日間のツイートデータを無料で手に入れることができ、Premiumは過去30日間/もしくは2006年過去ログ全てからの抽出(一部無料で使えるので混乱しやすい)という分類となります。
取得できるデータ上限数は少ないものの、PremiumプランにSandboxという、一部無料で使うことができるプランがあることが分かります。
無料で使うにはPremiumプランのSandboxが最適(過去30日データなら月間25,000ツイート、フルアーカイブなら月間5,000ツイートまで取得可能)

広告アカウントと紐付けたりしない限り、Sandboxのみの利用も可能のようです。

Sandbox has lower rate limits because it’s only for trying out calls if you do not have an ads account set up (or for trying different configurations of funding instruments).

下記はFull Archive Searchの設定方法についての説明動画。

Twitter API設定例

以下、Recent searchでの設定例です。

queryキーの値に対象となるキーワードを設定。フィールドに設定を行います。

今回は該当のキーワードについて発信したTwitterユーザーの情報を取得したいので、user.fieldsキーの値に下記fieldsなどを設定。

  • create_at // ユーザーアカウントが作成された時刻
  • description // ユーザーのプロフィール文 (bio)
  • public_metrics // フォロワー数、フォロー数、累計つぶやき回数、リスト被登録数
  • url // ユーザーが自身のTwitterのURL欄に入力しているURL。(Twitterユーザープロフィールページのurlではなく、たとえば自身のWebサイトやブログ、ECサイトなどの主に外部サイトへのリンク)

これらをコンマ区切りでuser.fieldsに設定しますが、コンマの前後に半角スペースなどを入れてはいけません。空白等なく、コンマ区切りでfieldを入力します。

該当ユーザーTwitterプロフィールページへのリンクは、username情報を利用することで取得可能。

https://twitter.com/username が該当ユーザーのプロフィールページURLとなります。

なお、id, name, usernameの値はデフォルトで入力済として扱われるので、特にuser.fieldsキーの値として入力する必要はありません。

Userオブジェクトでのfieldの値については下記URL参照。

さらに、Userオブジェクト(user.fields)を利用するためには、expansionキーの値に下記いずれかを入力する必要があります。

  • author_id
  • in_reply_to_user_id

このexpansionキーを入力しないと、Tweet内容とUserオブジェクトを紐付けて検索・取得してくることができないようです。

The user object can also be found as a child object and expanded in the Tweet object. The object is available for expansion with ?expansions=author_id or ?expansions=in_reply_to_user_id to get the condensed object with only default fields.

サンドボックスの設定方法

冒頭で説明した過去30日間のツイートデータ検索や全期間のツイートデータ検索を無料で可能とするサンドボックス環境の設定方法について。

以下の手順が必要なようです。

  • サンドボックス環境を作成し、ラベル名をつけてプロジェクトアプリに紐付ける
  • Premiumプランを契約(Premiumアカウント用のトークン等でAPI接続?)
  • Sandboxのラベルを指定してAPIコール

サンドボックス環境の作成は、Developer Portalから簡単にできました。

Products > Premium > Dev Environments

で各Sandbox環境を作成してラベル名をつけ、プロジェクトアプリに紐付ける

image

Sandboxのラベルを指定してAPIコールする方法

Pythonの場合はライブラリ"Tweepy"を使えばAPI接続を簡略化できる

後述するTwintとは異なり、TweepyはあくまでTwitter APIを介しての接続・設定を簡単にしてくれるPythonライブラリです。

APIを使わずにTwintでユーザー情報を取得

APIを利用せず、マニュアルでスクレイピングを行う方法です。

冒頭でも説明しましたが、利用規約違反となる可能性が大きい行為なので、その点ご注意ください。

Pythonライブラリ"twint"を利用

twintとは、Twitter APIを使わずにツイートを抽出できるPythonライブラリである。Pythonだけでなく、コマンドラインからの実行も可能となっている。

APIを利用しない場合のスクレイピングの利点としては、各APIプランの上限など制限にこだわらず、柔軟に取得ができるという点でしょうか。