TwitterからツイートをTwitterScraperでスクレイピングする

新コロナウイルスの猛威の中、ゴールデン・ウィークに突入しました。

政府の発表にて小学校の自宅学習は5月末まで延長されたようです。

サラリーマンも同じような状況ですが、これ以上は業績への影響が大きいので、段階的に緩和される傾向です。

 

因みにゴールデン・ウィークにどこにも行けない子供連れの家族は公園に向かうようです。

お砂場が三密状態です。

逆効果じゃない・・・?

 
 

私のWebサイトではTwitter投稿内容をスクレイピングして、サイトに関わるコメントを表示しています。

ですが2017年頃から正しく記事がスクレイピングできておらず放置していました。

さすがにお粗末なので更新してみました。

Twitter APIの制約を確認する

噂には聞いていましたが、Twitter APIは年々制限が厳しくなっています。

特にUser Streams APIが廃止されるなど、サードパーティのクライアントの開発はなかなか難しい状況です。

例えば、Twitterの検索APIを使用すると、15分ごとに180リクエストしか送信できません。

リクエストあたりの最大ツイート数が100であるため、1時間あたり4 x 180 x 100 = 72.000ツイートをマイニングできるだけです。

更に、過去7日間に書かれたツイートにしかアクセスできません。

Twitterのスクレイピング規約は?

Twitter社的には、Twitterの事前の承諾なしにスクレイピングすることは禁止しています。

ユーザーは、本サービスへアクセスし、またはこれを利用している間、次のいずれをも行ってはならないものとします。
…(省略)
Twitterの事前の承諾なしに本サービスのスクレイピングを行うことは明示的に禁じられています

とは言われても、そもそも私はTwitterのユーザ登録していないからユーザじゃない。

そして、Web公開されているパブリックな自分のサイトのコメントデータを手動で収集する代わりに自動でやってるに過ぎません。

なので、他に方法が無いかと調べたら、OSSにTwitterScraperというPythonライブラリがありました。

TwitterScraperを使ってスクレイピングをしてみる

ライブラリは下記です。

GitHub - taspinar/twitterscraper: Scrape Twitter for Tweets
Scrape Twitter for Tweets. Contribute to taspinar/twitterscraper development by creating an account on GitHub.

Web上によいサンプルが存在しませんでした。

スクレイピング禁止と書かれているため公開するのを躊躇っているのかもしれません。

 

数少ないサンプルを見ながら作成したコードは次のようになります。

poolsize は、同時実行させるスレッドプールの数です。多くすると高速に処理されますが大量のメモリが必要となります。

さくらインターネットサーバーではpoolsize = 10でもキツかったです。

実行結果

実行すると日付順に

ID、ソート用日付、日付、私のサイトURL、Twitterへのリンク、投稿者名、コメント

が出力されます。

例)

617,20200427,2020/04/27,https://私のサイト名/…,/aaaa/status/125483139,太郎,日本人にとってコロナは深刻な問題 https://私のサイト名/?…

どうやってスクレイピングを実現しているか?

実行ログは次のようなものが出力されていました。

TwitterScraperの実装としては、次のような仕組みで同一IPアドレスからのアクセスを回避しているようです。

  • プロセスごとに異なるProxyサーバ経由でアクセスする
  • ランダムにUser-Agentを書き換えながらツイートをスクレイピングする

これ凄いね・・・・。

この考えは他にも応用できそうです。

ソースコード的には次の部分です。

ただし、Proxyサーバーが死んだら使えなくなります。

まとめ

やりたいことは実現できました。

ただし、イタチごっこのような気がします。

感情・流行関係の研究テーマとして、過去のツイート情報は非常に有益だと思いますが、年々厳しくする目的がよく分かりません。

【追記 2020.6.6】

利用できなくなりました。

公式に次のような変更が加わりました。イタチごっこ・・・・。

Indeed, this can be fixed by modifying the header dictionary in query.py from
HEADER = {‘User-Agent’: random.choice(HEADERS_LIST)}
to
HEADER = {‘User-Agent’: random.choice(HEADERS_LIST), ‘X-Requested-With’: ‘XMLHttpRequest’}

【追記 2021.2.11】

新しい方法を調査しました。

Twitterからのスクレイピング方法 2021年版(twint を使ってTwitter API呼び出しなしで実現)
年収がニ年間で100万円以上下がった。会社から地面に叩きつけられ、蹴飛ばされ、挙げ句の果てには踏みつけられ気分だ。この数ヶ月は、平日の食費を削って100円単位で小遣いを貯めてきた。平日の昼食は...
タイトルとURLをコピーしました