PythonでTwitterスクレイピング

PythonでTwitterスクレイピング

この記事ではPythonでTwitterをスクレイピングする方法を解説する。twintというライブラリを使うと一瞬で特定のツイートを抽出することができる。

とくに、この記事では次のような方へ向けた内容となっている。

  1. TwitterのAPIが面倒なのでスクレイピングしたい
  2. 特定のワードでツイートがあったらSlackへ投稿させたい
  3. エゴサーチの手間を省きたい
スクレイピング・ハッキング・ラボ Pythonで自動化する未来型生活
スクレイピング・ハッキング・ラボ Pythonで自動化する未来型生活
KindleAmazon

はじめに

そもそもTwitterをスクレイピングしたかったのは、3番のエゴサーチの手間を省きたいというのが大きい理由である。人気有名人ならまだしも、無名のものがエゴサーチしたところで頻繁に呟かれるはずもない。エゴサーチして「呟かれていない」などと、わざわざ自分で落ち込むような行動はまったくの無駄である。

そこで今回は、特定の検索ワードでTwitterを検索し、呟かれていたらSlackへ投稿されるようにする。また、1日1回定時にプログラムを実行させるようにcronへ登録していく。

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

これらの作業は次の開発環境で行った。

項目バージョン
パソコンmacOS Big Sur 11.0.1
Python3.7.3

twintとは?

twintとは、Twitter APIを使わずにツイートを抽出できるPythonライブラリである。Pythonだけでなく、コマンドラインからの実行も可能となっている。

twintのインストール

twintはpip3を使ってインストールできる。しかし次のようにしてインストールすると動かなかった。

$ pip3 install twint

上記の方法で動かない場合は、一度twintをアンインストールして、こちらの方法で再度インストールするとうまく動作できるだろう。

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

ただし、コマンドラインで使う場合はパスを通す必要があるかもしれない。

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

twintの使い方

特定のユーザーのツイートは次のようにする。ただし、すべてのツイートを取得してしまうので注意しよう。

$ twint -u ユーザー名

特定の検索ワードが含まれているツイートを取得したい場合はこちら。

$ twint -s キーワード

Pythonでtwintを使ってみよう

それではPythonでtwintを使ってみよう。twintで取得したツイートは、csvまたはjsonファイルで保存されるようになっている。

import twint

c = twint.Config()

c.Search = '検索ワード'
c.Limit = 10  # Not working.
c.Store_csv = True
c.Output = "result.csv"

twint.run.Search(c)

検索したツイートをMacへアラート表示するまで

Pythonプログラム

ここでは、検索したツイートをSlackへ登録するまでのプログラムを紹介する。プログラムでやっていることは次の通り。

  1. 検索ワードで前日から現時点までのツイートをCSVへ保存
  2. CSVをTweetオブジェクト化して使いやすいようにする
  3. ツイートがあれば、Webhookを使ってSlackへ投稿

Webhookの設定はこちらの記事を参考に

# 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で定期的に実行

Macでスクリプトを定期的に実行するには、cronが便利だろう。$ crontab -eを実行して、次のように記述する。これは毎日20:00にプログラムを実行するという意味である。

0 20 * * * /usr/local/bin/python3 /SomeWhere/ScrapingTwitter.py 

しかしmacOS Big Sur 11.0.1ではデフォルトではcronの実行がされなかった。解決するためには「Full Disc Access」に「cron」を追加する必要がある(図1)。

図1. Full Disc Access」に「cron」を追加
図1. Full Disc Access」に「cron」を追加

「Full Disc 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. パスの入力ダイアログを表示

これでcronが実行されるようになった。Twitter APIを使わずツイートを抽出できるのは非常に便利だ。

こちらの記事ではGoogleのスクレイピングも試しているので興味ある方はご参考に。

スクレイピング・ハッキング・ラボ Pythonで自動化する未来型生活
スクレイピング・ハッキング・ラボ Pythonで自動化する未来型生活
KindleAmazon
Python2年生 スクレイピングのしくみ 体験してわかる!会話でまなべる!
Python2年生 スクレイピングのしくみ 体験してわかる!会話でまなべる!
KindleAmazon
Contieaks(コンティークス) ゲーミングチェア ルセル オットマン付き グリーン
Contieaks(コンティークス) ゲーミングチェア ルセル オットマン付き グリーン
Amazon

人気のラズパイ

Raspberry Pi 4 Model B 8GB 技適マーク入 正規品!ラズベリーパイ4 モデルB
Raspberry Pi 4 Model B 8GB 技適マーク入 正規品!ラズベリーパイ4 モデルB
Amazon
TRASKIT Raspberry Pi 4 Model B Starter Kit
TRASKIT Raspberry Pi 4 Model B Starter Kit
Amazon
Raspberry Pi Zero W - ヘッダー ハンダ付け済み
Raspberry Pi Zero W - ヘッダー ハンダ付け済み
Amazon

人気のラズパイ周辺機器

10 インチRaspberry Pi用タッチモニター EleDuino HDMI モバイルディスプレイ
10 インチRaspberry Pi用タッチモニター EleDuino HDMI モバイルディスプレイ
Amazon
Raspberry Pi4 Model B /アルミニウム金属ケース/ファンレス/放熱シート付き
Raspberry Pi4 Model B /アルミニウム金属ケース/ファンレス/放熱シート付き
Amazon
Freenove Raspberry Pi 4 B 3 B+ 400用の究極のスターターキット
Freenove Raspberry Pi 4 B 3 B+ 400用の究極のスターターキット
Amazon
KEYESTUDIO DC 5V 4チャンネル リレーシールドモジュール 拡張ボード for Raspberry Pi
KEYESTUDIO DC 5V 4チャンネル リレーシールドモジュール 拡張ボード for Raspberry Pi
Amazon

Raspberry Piのオススメ入門書

Raspberry Piクックブック 第3版 (Make:PROJECTS)
Raspberry Piクックブック 第3版 (Make:PROJECTS)
Amazon
これ1冊でできる! ラズベリー・パイ 超入門 改訂第6版 Raspberry Pi 4/Zero W対応
これ1冊でできる! ラズベリー・パイ 超入門 改訂第6版 Raspberry Pi 4/Zero W対応
KindleAmazon
写真や図解でよくわかる ラズパイZeroを使い倒す本 Raspberry Pi Zero W対応
写真や図解でよくわかる ラズパイZeroを使い倒す本 Raspberry Pi Zero W対応
KindleAmazon
記事に関するご質問などがあれば、ぜひTwitterへお返事ください。