pythonでTwitterスクレイピングして脅威インテリジェンスを集める

情報のキャッチアップ力を上げたい


そう思い立った時、最初はTwitterで垢を作成して著名人や情報を流してくれる方をフォローして回っていましたが、これだとずっとTLを見ていないと情報が入ってこないので億劫でした。
そこでスクレピングちゃんの出番DA!と気づきました。

スクレイピングとは

Webデータ収集のこと。
圧倒的な情報収集のスピード、自動でファイル出力もできるし、話のネタの収集とトレンドの収集も出来て時間の効率化がえげつないです。
実現方法はいくつかあるのですが、今回はTwitter APIを利用したpythonのプログラムを作成して利用します。

今回のプログラムの特徴

リツイートの除外。できるだけユニークなデータが欲しい。
URLが載っているツイートの収集。情報のソースを確かめたい。
idを保持して情報のフレッシュさの維持。時間の重複による同じデータの収集を避けたい。

実際のプログラム

Google Colaboratoryで書きました。パッケージの管理とか環境構築いらないので。。。らくちん

import tweepy
import json
import numpy as np
import pandas as pd

# APIを使用するための認証情報
consumer_key = "YOURS"
consumer_key_secret = "YOURS"

access_token = "YOURS"
access_token_secret = "YOURS"

"tweepyによるTwitter APIを使用するための認証のセットアップ"
auth = tweepy.OAuthHandler(consumer_key, consumer_key_secret)
auth.set_access_token(access_token, access_token_secret)

# パラメータwait_on_rate_limitを有効化して、APIの問い合わせ回数の上限に達した場合は必要時間だけ待機
api = tweepy.API(
    auth,
    parser = tweepy.parsers.JSONParser(),
    wait_on_rate_limit = True,
    wait_on_rate_limit_notify = True
)

#検索ワードとしてexploitとhttpを使用してリツイートは対象外
search_term = "exploit http -filter:retweets"

#一番古いツイートidを保存する変数
oldest_tweet = None

# 回収したツイートの一覧を格納するためのリスト
TempDict = []

# 回収したツイート数のカウンター
counter = 0

# 10回ループして合計1000件のツイートを対象にする
for x in range(10):
  # 最新のツイートから100件を抽出しテキストをすべて収集する
  public_tweets = api.search(search_term,
                             count=100,
                             result_type = "recent",
                             tweet_mode = "extended",
                             max_id = oldest_tweet)
# 条件に一致するツイートの収集
for tweet in public_tweets["statuses"]:
  # 引用リツイートも除外
  if not 'quoted_status' in tweet:
    TempDict.append(tweet)

    # カウンターに1を追加
    counter += 1
  
  # 検索結果の一番古いツイートidを代入して次の検索結果はこの一番古いidより古いものにする
  oldest_tweet = tweet["id"]

print("Tweet {}件収集しました".format(counter))

これをDataFrameにしてURLの列からソースへアクセスします。暇なときにこうやって眺めると面白そうなサイトがいくつも拾えるので滅茶苦茶面白いです。

data = pd.DataFrame(
    data = [tweet['full_text'] for tweet in TempDict],
    columns = ['TweetText']
)

import re
URLPATTERN = r'(https?://\S+)'

data['URL'] = data["TweetText"].str.extract(URLPATTERN, expand=False).str.strip()

スクレイピング結果の一部

最後に

今回はDataFrameにする方法や環境構築(APIの取得法など)を省きましたが、簡単なので調べてやってみてください。
今は簡単なスクレイピングをしてますが、もっと複雑なデータ収集法も覚えて情報の精度を上げていきたい!それでは!