APIなしでTwitterをスクレイピングする【Python x twint】

APIなしでTwitterをスクレイピングする【Python x twint】
APIなしでTwitterをスクレイピングする【Python x twint】

この記事では、PythonでTwitterのつぶやきを抽出する方法(スクレイピング)をご紹介します。twintライブラリを使うと簡単に実現できます。

また、特定のツイートを取得してSlackへ自動投稿させるプログラムもご紹介します。Twitterでのエゴサーチを、自動化しちゃおうという計画です。

開発環境は「macOS Big Sur」となります。

項目バージョン
パソコンmacOS Big Sur 11.2.3
Python3.9.4

この記事は次のような方に参考となる内容です。

  1. TwitterのAPIが面倒なのでさくっとスクレイピングしたい
  2. 特定のワードでツイートがあったらSlackへ投稿させたい
  3. Twitterのエゴサーチの手間を省きたい

twintとは?

twintとは?
twintとは?

twintとは、Twitter APIを使わずにツイートを抽出できるPythonライブラリです。Twitter APIは、通常OAuthなどの手続きがあり、導入しようとするとなかなか敷居が高くめんどうです。twintなら、めんどうな手続きの必要なく、PythonでさくっとTwitterのツイートを抽出かのうです。twintはPythonプログラムだけでなく、コマンドラインからの実行も可能です。

GitHub-twintproject/twint

twintのインストール

Macのターミナルを使って、twintをインストールする方法を紹介します。Python3が既にインストールされていることを想定してます。また、Pythonはバージョン3.9.4を使用してます。お使いのPythonのバージョンは、$ python3 --versionで確認できます。

pip3を使ってGithubからtwintをインストールします。

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

▼ twintをコマンドラインで使う場合、環境変数PATHを通す必要があります。私の場合は、次のように設定しました。

shell
$ export PATH="$PATH:/Users/ユーザー名/Library/Python/3.9/bin"

$ pip3 twintでもインストールできましたが、なぜか下記のようなエラーを吐いて動作しませんでした。 CRITICAL:root:twint.run:Twint:Feed:noDataExpecting value: line 1 column 1

twintの使い方(コマンドライン)

ここでは、コマンドラインでtwintを使う例を紹介します。

ユーザーのツイート取得

特定のユーザーのツイートを取得するには、次のように-uオプションを使います。

shell
$ twint -u ユーザー名

キーワードでツイート取得

特定のキーワードが含まれているツイートを取得したい場合は-sオプションを使います。

shell
$ twint -s キーワード

Pythonでtwintを使ってみよう

つぎに、Pythonでtwintを使ってみます。

▼ 次のプログラムは、特定のキーワードで検索してヒットしたツイートを、csvファイルで保存してます。

py
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へ登録して定期実行させるようにします。

図1. Incoming WebhooksでツイートURLをSlackへ投稿
図1. Incoming WebhooksでツイートURLをSlackへ投稿

ツイートをSlackへ投稿する

ここでは、検索したツイートをSlackへ投稿させるプログラムを紹介します。紹介するプログラムでは、大まかに次の3つに分けられます。

  1. 検索ワードのツイートを、前日から現時点抽出しCSVファイルへ保存する
  2. CSVファイルをTweetオブジェクト化する
  3. ツイートがあれば、Webhook URLを使ってSlackへ投稿する

Webhook URL

Slackへ投稿するためにWebhook URLを使用してます。Webhookの使い方はここでは詳しく説明しません。 SlackのIncomingWebhooksを使い倒す-Qiita また、WebhookをPythonで使えるように、slackwebをインストールします。

shell
$ pip3 install slackweb

Pythonプログラム

こちらが、検索したツイートをSlackへ投稿させるプログラムです。

py
# 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」を追加するには、次の通り行ってください。

  1. 「Security & Privacy」を開く
  2. 「Privacy」タブを選択
  3. 「Full Disk Access」を選択
  4. 編集ロックを外す
  5. 「+」ボタンを押す
  6. command⌘ + shift + Gでパスの入力ダイアログを表示(図2)
  7. 「/usr/sbin/cron」を入力してOKする

図2. パスの入力ダイアログを表示
図2. パスの入力ダイアログを表示

Full Disk Access」に「cron」を追加
Full Disk Access」に「cron」を追加

これでcronを使ってプログラムが定期実行されるはずです。

以上で、本記事の内容を終わります。

関連記事

 
最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

Python学習にオススメの本をご紹介!
Pandasでデータサイエンスはじめよう!
スクレイピングにオススメの書籍

▼ Beautiful Soup4を使ったWebクローリングをはじめ、表データをpandasやOpenPyXL、matplotでデータ解析、グラフ表示などのスクレイピングのやり方が分かりやすく説明されてます。図解が多いのでPython初心者の方でも読み進められる内容となってます。