自前でTwitter APIを用意するのが規約上面倒くさくなっているけど、Twitterをスクレイピングしたいってことあると思います。
OSSでTwitterScraperというPythonライブラリがある(みたいです)。
はじめに
Twitter社的には、Twitterの事前の承諾なしにスクレイピングすることは禁止されています。
そのため、当記事はあくまでこんな風に使えるかもしれないという想像の記事です。(という予防線を張っておきます)
(iii) Twitterから提供されている当社の現在利用可能な公開インターフェースを経由する (かつ、該当する使用条件に従う) ことなく、その他の何らかの手段 (自動その他を問わず) で本サービスへのアクセスもしくはその検索を行うか、またはアクセスもしくは検索を試みること。ただし、Twitterと別途締結した契約によりこれを行うことが特に認められている場合はこの限りではありません (注: 本サービスのクローリングは、robots.txtファイルの定めによる場合には許されます。ただし、Twitterの事前の承諾なしに本サービスのスクレイピングを行うことは明示的に禁じられています)。
https://twitter.com/ja/tos/previous/version_9
これを見て使ってみようという人はあくまで自己責任でお願いします。
やりたいこと
「コンプティーク 2019年10月号」でアイカツオンパレード!の特集記事が掲載されました。
その中で、「アイカツオンパレード緊急読者アンケート」なる企画があり、Twitter上で2019年8月23日18:00~2019年8月25日17:59の短い期間でしたがアンケートが行われました。
そのアンケート回答の収集として使えたらいいなというのがやりたかったことになります。
実装
from twitterscraper import query_tweets
import datetime as dt
import pandas as pd
# input
begin_date = dt.date(2019,8,23)
end_date = dt.date(2019,9,1)
pool_size = (end_date - begin_date).days
# tweetの収集
tweets = query_tweets("#コンプアイカツアンケート", begindate=begin_date, enddate=end_date, poolsize=pool_size, lang="ja")
tuple_tweet=[(tweet.user_id, tweet.text.replace("\n","\t"), tweet.timestamp) for tweet in tweets]
# ツイートが重複しているので重複削除する
df = pd.DataFrame(set(tuple_tweet), columns=['user_id', 'tweet', 'post'])
df.sort_values('post').reset_index(drop=True)
欲しい情報はあくまでツイート内容のみなので、不要なユーザ名やリツイート回数などは除去しています。
この後前処理として整形作業が必要なので、改行をタブ区切りに変更して作業しやすくしています。
注意点として、TwitterScraperは単純に処理しようとするとレコードが重複します。
(ぱっと見、begindate
、enddate
の期間が重複して取れるという感じではないっぽいけど、詳細は分からないです。)
そのため、setで重複削除しています。
poolsize
もよくわからなかったのですが、内部の処理を見る限りsinceとuntilの期間の設定に必要でデフォルト値が20のため、そのままデフォルト値を使うと同日のデータが生まれてしまうので、終了-開始の日付をセットしています。
最後に
『アイカツオンパレード!』は
テレビ東京系 毎週土曜日 午前10時30分~
BSテレ東毎週月曜日夕方5時~
から好評放送中です!
また、分析結果についてははてなブログ上でやっているので、興味あれば併せてみてもらえればと思います。