TwitterScraperを使ってTweet情報を収集する
概要
- Twitter APIを申請しなくても使えるTweetScraperを使う
- pipのインストールにハマったのでDockerでビルドする
- キーワードやユーザなどで検索できるが,一部取得できないTweetもある?
注意:Twitter社はAPIを通さないスクレイピングを禁止しているようなので本記事の手法は近いウチに使えなくなるかもしれません。 TwitterScraperを使ってスクレイピングできるのでは - Qiita
追記:対抗ツールtwintについて
似たようなツールとしてTwintというものもありました。
TwitterScraperと違って自己言及しているツイートも収集できるのでこちらを使ったほうが良さそうです。
追記2:
これを活用して作ったのが以下の記事です。
背景
有用なTweetをしている人のTweet内容をスクレイピングしてデータベース化したい。そんなときがあります。
スクレイピングに使えるTwitter APIは申請時に結構面倒な作文を要求されるので面倒な作業のいらないものを探していた所,Twitterscraperというものを見つけました。
煩雑な作文(英語)を求められるTwitter APIを介さずともTweetを取得できるようなのでこちらを使ったスクレイピングをやっていきたいと思います。
pip install twittercraper
でインストールできるようですが,
自分の散らかったPython環境だと上手く行かなかったのと,Python環境がPC毎に違うのでDockerでやることにしました。
非常に紛らわしいのですがTwieetScraperというのもあるようです。どっちが優れているのかおいおい確認したいと思います。
DockerでのBuild
Cloneしたディレクトリに移動後,
docker build -t twitterscraper:build .
でビルドします。が,私がやったときは下記のようなエラーがでました。
Please make sure the libxml2 and libxslt development packages are installed.
依存関係が上手くいってないのでここを見て DockerfileをFixします。
変更したDockerfile詳細
FROM python:3.7-alpine COPY . /app WORKDIR /app RUN apk add --no-cache \ gcc \ libc-dev \ libxml2-dev \ libxslt-dev RUN python setup.py install CMD ["twitterscraper"]
環境にも寄りますがCorei5-3000番台の古いPCではビルドに2~3分かかりました。
使い方
今の所更新されていませんが公式の使い方ではにあるコマンドを実行してもファイルが生成されませんでした。
自分の環境では以下のように実行しました。
docker run --rm -it -v <PATH_TO_SOME_SHARED_FOLDER_FOR_RESULTS>:/app twitterscraper:build <YOUR_QUERY>
上から軽く説明すると
- dockerを起動して
- <PATH_TO_SOME_SHARED_FOLDER_FOR_RESULTS>:に適当なディレクトリを直接表記で指定してDocker側の
/app
と関連付けた後に, - <YOUR_QUERY>に示す適当な検索コマンドを実行しコンテナを終了
となります。
2つ目の工程を経ることでDocker環境内で作成したファイルをホストのディレクトリ内に生成することが出来ます。
【Docker】Dockerでホストのディレクトリをマウントする - Qiita
- ヘルプを見る
docker run --rm -it twitterscraper:build twitterscraper --help
特定のユーザのTweetをスクレイピング
試しによくサーベイ情報を載せてくれているslam_hubさんのTweetをスクレイピングしてみましょう。
特定のユーザのTweetを抜き出すには--user
オプションを用いる手法とfrom:<USERNAME>
のクエリを指定する2通りの方法がありました。
得られるデータに若干の違いがありましたが,取得したTweetの総数は前者のほうが多かったので前者をおすすめします。
--user
オプションを用いる手法
docker run --rm -it -v /home/yoshi/Documents/GitHub/MyMemo/src/Twitter:/app twitterscraper:build twitterscraper slam_hub --user -o slamhub.json --lang ja -l 1200
from:<USERNAME>
オプションを用いる手法
docker run --rm -it -v /home/yoshi/Documents/GitHub/MyMemo/src/Twitter:/app twitterscraper:build twitterscraper "from:slam_hub" -o slamhub2.json --lang ja -l 2000
出来たこと,出来なかったこと
得られたTweetの中身をざっと見ると,テキストだけでなく,ユーザ反応やリンクの有無など細かな情報が得られていることがわかります。
サーベイ記事だけ抜き出したかったのでリンクの有無やちょっとしたキーワードから結果を絞れそうですね。 後でMarkdownなどを介して読み物形式にまとめたいと思います。
{'has_media': True, 'hashtags': [], 'img_urls': ['https://pbs.twimg.com/media/Ec2t_Y-UcAAYEyM.png'], 'is_replied': True, 'is_reply_to': False, 'likes': 26, 'links': ['https://arxiv.org/abs/2004.01793'], 'parent_tweet_id': '', 'replies': 1, 'reply_to_users': [], 'retweets': 9, 'screen_name': 'slam_hub', 'text': '画像からの物体方向推定を,self-supervisedに学習する枠組みを提案.画像から3次元方向とスタイル特徴量を抽出し,それらの潜在変数を元に幾何学的変換を行うGenerator(GAN)を用いて学習.損失には一貫性と水平対称性を利用し,教師あり学習に匹敵する性能を達成.\nhttps://arxiv.org/abs/2004.01793\xa0pic.twitter.com/Qr4LM3uTxA', 'text_html': '<p class="TweetTextSize TweetTextSize--normal js-tweet-text tweet-text" data-aria-label-part="0" lang="ja">画像からの物体方向推定を,self-supervisedに学習する枠組みを提案.画像から3次元方向とスタイル特徴量を抽出し,それらの潜在変数を元に幾何学的変換を行うGenerator(GAN)を用いて学習.損失には一貫性と水平対称性を利用し,教師あり学習に匹敵する性能を達成.\n<a class="twitter-timeline-link" data-expanded-url="https://arxiv.org/abs/2004.01793" dir="ltr" href="https://t.co/rEGIDLI41f" rel="nofollow noopener" target="_blank" title="https://arxiv.org/abs/2004.01793"><span class="tco-ellipsis"></span><span class="invisible">https://</span><span class="js-display-url">arxiv.org/abs/2004.01793</span><span class="invisible"></span><span class="tco-ellipsis"><span class="invisible">\xa0</span></span></a><a class="twitter-timeline-link u-hidden" data-pre-embedded="true" dir="ltr" href="https://t.co/Qr4LM3uTxA">pic.twitter.com/Qr4LM3uTxA</a></p>', 'timestamp': '2020-07-14T03:02:09', 'timestamp_epochs': 1594695729, 'tweet_id': '1282872986467397633', 'tweet_url': '/slam_hub/status/1282872986467397633', 'user_id': '1244129482132209664', 'username': 'SLAM-Hub', 'video_url': ''}
一方,確認した問題として自分へのリプライ形式で綴られる連投タイプの子Tweetを取得できないというのがあり,有用な情報をいくつもLostしていることが判明しました。 他の方の環境で再現するかは不明ですが余裕があればそのへんも調査していきたいと思います。