APIなしでTwitterをスクレイピングする【Python x twint】
この記事では、PythonでTwitterのつぶやきを抽出する方法(スクレイピング)をご紹介します。twintライブラリを使うと簡単に実現できます。
また、特定のツイートを取得してSlackへ自動投稿させるプログラムもご紹介します。Twitterでのエゴサーチを、自動化しちゃおうという計画です。
開発環境は「macOS Big Sur」となります。
項目 | バージョン |
---|---|
パソコン | macOS Big Sur 11.2.3 |
Python | 3.9.4 |
この記事は次のような方に参考となる内容です。
- TwitterのAPIが面倒なのでさくっとスクレイピングしたい
- 特定のワードでツイートがあったらSlackへ投稿させたい
- Twitterのエゴサーチの手間を省きたい
twintとは?
twintとは、Twitter APIを使わずにツイートを抽出できるPythonライブラリです。Twitter APIは、通常OAuthなどの手続きがあり、導入しようとするとなかなか敷居が高くめんどうです。twintなら、めんどうな手続きの必要なく、PythonでさくっとTwitterのツイートを抽出かのうです。twintはPythonプログラムだけでなく、コマンドラインからの実行も可能です。
twintのインストール
Macのターミナルを使って、twintをインストールする方法を紹介します。Python3が既にインストールされていることを想定してます。また、Pythonはバージョン3.9.4を使用してます。お使いのPythonのバージョンは、$ python3 --versionで確認できます。
▼ pip3を使ってGithubからtwintをインストールします。
$ pip3 install --user --upgrade git+https://github.com/twintproject/twint.git@origin/master#egg=twint
▼ twintをコマンドラインで使う場合、環境変数PATHを通す必要があります。私の場合は、次のように設定しました。
$ export PATH="$PATH:/Users/ユーザー名/Library/Python/3.9/bin"
twintの使い方(コマンドライン)
ここでは、コマンドラインでtwintを使う例を紹介します。
ユーザーのツイート取得
特定のユーザーのツイートを取得するには、次のように-uオプションを使います。
$ twint -u ユーザー名
キーワードでツイート取得
特定のキーワードが含まれているツイートを取得したい場合は-sオプションを使います。
$ twint -s キーワード
Pythonでtwintを使ってみよう
つぎに、Pythonでtwintを使ってみます。
▼ 次のプログラムは、特定のキーワードで検索してヒットしたツイートを、csvファイルで保存してます。
import twint
c = twint.Config()
c.Search = '検索ワード'
c.Limit = 10 # Not working.
c.Store_csv = True
c.Output = "result.csv"
twint.run.Search(c)
Twitterでエゴサーチ、Slackへ自動投稿
そもそもTwitterをスクレイピングしたかったのは、エゴサーチの手間を省きたいというよこしまな理由からでした。(^_^;)自分のブログに関するツイートをたまに検索したりするので、つぶやかれたら定期的に自動取得して通知してほしかったのです。 ここでは、それらを実現すべくtwintで抽出したツイートを、Slackへ自動投稿させる方法をご紹介します。
具体的には、Pythonプログラムでtwintを使って特定の検索ワードでTwitterを検索し、抽出したデータをSlackへ投稿するプログラムをつくります。そのプログラムを、1日1回、Macのcronへ登録して定期実行させるようにします。
ツイートをSlackへ投稿する
ここでは、検索したツイートをSlackへ投稿させるプログラムを紹介します。紹介するプログラムでは、大まかに次の3つに分けられます。
- 検索ワードのツイートを、前日から現時点抽出しCSVファイルへ保存する
- CSVファイルをTweetオブジェクト化する
- ツイートがあれば、Webhook URLを使ってSlackへ投稿する
Webhook URL
Slackへ投稿するためにWebhook URLを使用してます。Webhookの使い方はここでは詳しく説明しません。 SlackのIncomingWebhooksを使い倒す-Qiita また、WebhookをPythonで使えるように、slackwebをインストールします。
$ pip3 install slackweb
Pythonプログラム
こちらが、検索したツイートをSlackへ投稿させるプログラムです。
# Created by Toshihiko Arai.
# https://101010.fun/programming/python-scraping-twitter.html
import twint
import csv
import os
from datetime import datetime, timedelta
import slackweb
output_file = 'result.csv'
class Tweet:
date = ''
time = ''
link = ''
tweet = ''
def fetch_tweet(query):
try:
os.remove(output_file)
except:
pass
c = twint.Config()
c.Search = query
c.Store_csv = True
c.Output = output_file
today = datetime.today()
yesterday = today - timedelta(days=1)
c.Since = datetime.strftime(yesterday, '%Y-%m-%d')
twint.run.Search(c)
def parse_csv():
data = []
i = 0
with open(output_file, 'r', encoding="utf-8") as f:
reader = csv.reader(f)
for row in reader:
if i == 0:
pass
else:
t = Tweet()
t.date = row[3]
t.time = row[4]
t.tweet = row[10]
t.link = row[20]
data.append(t)
i += 1
return data
def send_slack(t):
webhook_url = 'Webhook URL'
message = "New tweet -> {}".format(t.link)
slack = slackweb.Slack(url=webhook_url)
slack.notify(text=message)
search = '検索ワード'
fetch_tweet(search)
try:
data = parse_csv()
for t in data:
send_slack(t)
except:
pass
cronで定期的にチェック
最後に、先ほどのプログラムを定期的に実行できるようにしていきます。 Linuxではcronが定番ですが、Macでもcronを使うことができます。ターミナルを開き、$ crontab -eを実行して次の一文を記入します。
0 20 * * * /usr/local/bin/python3 /SomeWhere/ScrapingTwitter.py
これで、毎日20:00になると、書いた通りのシェルを実行してくれます。
Macでcronが使えない
ただし、Macでcronを使うためには、「Full Disk Access」に「cron」を追加する必要があります。「Full Disk Access」へ「cron」を追加するには、次の通り行ってください。
- 「Security & Privacy」を開く
- 「Privacy」タブを選択
- 「Full Disk Access」を選択
- 編集ロックを外す
- 「+」ボタンを押す
- command⌘ + shift + Gでパスの入力ダイアログを表示(図2)
- 「/usr/sbin/cron」を入力してOKする
これでcronを使ってプログラムが定期実行されるはずです。
以上で、本記事の内容を終わります。