1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Python3】Twitterから特定ユーザーの画像無しのツイートのみを取得する方法

Last updated at Posted at 2021-05-18

やりたいこと

  • ツイッターから特定ユーザーのツイートのみを大量に取得したい
  • 画像付きのツイートは除外する

最近関係している業務で、↑のような状況が発生したので、やり方をメモっておきます。

Twitterから特定ユーザーのツイートを取れるだけ取得する方法

ユーザーを指定して、ツイートを大量取得する方法はいくつかありますが、今回はtwintというツールを使用します。

参考:Twint

twintであればTwitterのAPIを使用する必要がなく、従って簡単に使い始めることができます。。
もちろん完全無料です。

twintのインストール方法

既にPythonやpipが使えつ環境であれば、twintをインストールするのは滅茶苦茶簡単です。
下記のコマンドを実行してください。

pip3 install --user --upgrade git+https://github.com/twintproject/twint.git@origin/master#egg=twint

正常にインストールが完了していれば、
twint -h
でヘルプ情報が表示されるはずです。

twintはターミナルから直接コマンドとして使用する方法とPythonコード中でライブラリとしてインポートして使う方法があるようです。
今回は主に直接ターミナルから使います。

ユーザーを指定してtweetを取得する

特定ユーザーのtweetを一気に取得してcsvファイルに保存します。
下記コマンドでOKです。

twint -u ユーザー名 -o output.csv --csv

ユーザー名のところは@を除いたtwitterIDです。
例えばオバマ元大統領のツイートを取得したい時は

twint -u BarackObama -o output.csv --csv

で行けます。

画像付きツイートのみを取得する

引数imagesを与えることで、画像付きツイートのみを取得することも出来ます。

twint -u BarackObama -o output.csv --csv --images

非常に簡単なので特に他に言うことは無いです笑

画像無しツイートのみを取得する

調べたところ、画像なしのツイートのみを取得する引数は無かったので無理やりやります。
おおよそ、以下のような流れです。

  1. 全てのツイートを取得する
  2. 画像ありツイートのみを取得する
  3. 1から2と重複する箇所を削除する

1,2はコマンドで、3はPythonコードで行います。
また、3のステップをより正確に記述すると、以下のような感じです。

  • ステップ1 : 全てのツイートを格納したpandasのデータフレームと、画像つきツイートを格納したデータフレームを縦に結合する。
  • ステップ2 : 結合したデータフレームから重複行を削除する。

お気づきの通り、指定ユーザーが元々全く同じつぶやきを何回もしていた場合はそのツイートは削除されてしまいます。
ですが、今回の案件ではあまりその心配をする必要は無いっぽかったので、ここはそのままにしておきました。

1,2,3のステップを実行するには、以下のmain.shを実行します。

sh main.sh

main.sh
echo "まずtweetをスクレイピングします。処理にしばらく時間がかかります。"
twint -u $1 -o all-tweet.csv --csv
twint -u $1 -o tweet-image-only.csv --csv --images


echo "pythonでcsvを処理して画像つきのものを除外します。"
python3 remove-tweets-with-image.py

同ディレクトリに以下のPythonファイル(remove-tweets-with-image.py)を置いておけば正常に実行できます。

remove-tweets-with-image.py
import csv
import pandas as pd

col_names=["id","conversation_id","created_at","date","time","timezone","user_id","username","name","place","tweet","language","mentions","urls","photos","replies_count","retweets_count",
"likes_count","hashtags","cashtags","link","retweet","quote_url","video","thumbnail","near","geo","source","user_rt_id","user_rt","retweet_id","reply_to","retweet_date",
"translate","trans_src","trans_dest"
]

all_tweets_df = pd.read_csv("all-tweet.csv", names = col_names)
tweets_with_images_df=pd.read_csv("tweet-image-only.csv",names = col_names)

df_concat = pd.concat([tweets_with_images_df, all_tweets_df])

df_concat = df_concat[df_concat.duplicated(keep=False,subset='id')==False]

df_concat.to_csv("result.csv")

目的の成果物が、result.csvとして吐き出されているはずです。

ちなみに、自分のリポジトリにコードをまとめてあります。

【補足】TwitterのAPIを利用してツイートを取得する方法もある

twitterはAPIを一般公開しています。
なので、PythonからAPIを使ってツイートを取得することもできます。

詳細なやり方については以下の動画講座が詳しいです。

TweepyによるTwitter APIを利用したpythonプログラム開発

ただ取得するだけでなく、

  • 定期的にツイートや画像、動画を保存する
  • 取得したデータをwordpressに保存する
  • twetter bot開発

といったトピックも網羅されているのでこういったことがやりたい場合はオススメです。

※ Python初心者でAPIというもの自体がよく分からないという場合は下のリンク先の方がオススメかもです。
プログラミングを業務で活かす!PythonによるWeb API活用講座

こちらではtwitter以外にも

  • Googleスプレッドシート
  • gmail
  • LINE Notify API
  • 楽天市場
  • slack

などのAPI操作が一気に学べて、プログラムから自動操作できるようになります。

その他、webスクレイピングについて知りたい方は下記動画講座が役立つと思います。
(スクレイピングとは、プログラムを使ってwebサイトから自動的にデータを取得していくことを指します)

PythonによるWebスクレイピング〜入門編〜【業務効率化への第一歩】

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?