粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

TwitterScraperを使ってTweet情報を収集する

概要

  • Twitter APIを申請しなくても使えるTweetScraperを使う
  • pipのインストールにハマったのでDockerでビルドする
  • キーワードやユーザなどで検索できるが,一部取得できないTweetもある?

注意:Twitter社はAPIを通さないスクレイピングを禁止しているようなので本記事の手法は近いウチに使えなくなるかもしれません。 TwitterScraperを使ってスクレイピングできるのでは - Qiita

追記:対抗ツールtwintについて

似たようなツールとしてTwintというものもありました。

github.com

TwitterScraperと違って自己言及しているツイートも収集できるのでこちらを使ったほうが良さそうです。

追記2:

これを活用して作ったのが以下の記事です。

ossyaritoori.hatenablog.com

背景

有用なTweetをしている人のTweet内容をスクレイピングしてデータベース化したい。そんなときがあります。

スクレイピングに使えるTwitter APIは申請時に結構面倒な作文を要求されるので面倒な作業のいらないものを探していた所,Twitterscraperというものを見つけました。

github.com

煩雑な作文(英語)を求められるTwitter APIを介さずともTweetを取得できるようなのでこちらを使ったスクレイピングをやっていきたいと思います。

pip install twittercraperでインストールできるようですが, 自分の散らかったPython環境だと上手く行かなかったのと,Python環境がPC毎に違うのでDockerでやることにしました。

非常に紛らわしいのですがTwieetScraperというのもあるようです。どっちが優れているのかおいおい確認したいと思います。

github.com

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>

上から軽く説明すると

  1. dockerを起動して
  2. <PATH_TO_SOME_SHARED_FOLDER_FOR_RESULTS>:に適当なディレクトリを直接表記で指定してDocker側の/appと関連付けた後に,
  3. <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していることが判明しました。 他の方の環境で再現するかは不明ですが余裕があればそのへんも調査していきたいと思います。

TODO

  • Tweet完全に取得できない問題の調査
  • tweetscraperとの比較
  • そもそもTwitter API取得の英作文の所でだるくなってやめたけど結構簡単に申請通る?