ねほり.com

何もないから何かみつかる

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

      2020/06/07

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

政府の発表にて小学校の自宅学習は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を使ってスクレイピングをしてみる

ライブラリは下記です。

https://github.com/taspinar/twitterscraper

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’}

 - 2020年(社会人16年), テクノロジー, Web技術

  関連記事

2009年テニス納会用に作成した動画

2009年10月30日(金) 残念な感じです・・・V 先週末は、寮でカップラーメ …

VBScriptのスクリプトをアイコン変更してEXEとして公開

2010年08月18日(火) Windowsフリーソフト公開 EXEファイルを初 …

坂月川でガサガサしてカダヤシとヌマエビ捕獲(千葉市若葉区)

千葉県(市)の川や池の在来種調査を目的として、色々な川や公園の沼を回ってきました …

printf関数が自作できないと「C言語が書ける」と言うなかれ

2005年07月10日(日) C言語 プリンタを購入。やっぱ必要になりました・・ …

花見川で初めてのミミズでテナガエビ釣り(千葉市花見川区)

日経平均株価は2万3000円まで到達し、10日で25万円稼いだという同僚が言って …

大学院生活は大変(授業と研究の両立&論文作成&後輩フォロー&輪講)

ネタが無かったので、日記の更新をサボってました…。 近況報告をお伝えします。 & …

ポケットに入る?VAIO Pを購入

2010年05月31日(月) VAIO PはiPadの夢を見るか? 3台目のノー …

金環日食のステマによる人気は凄かった

「金環日食」を舐めてた。 朝7:30という時間、東京で観測できるためテレビ全局( …

Java AppletとCGIの連携方法が全く分からない

何にもやる気が出ない…。  明日からは「介護体験」が始まる…。&nbs …

機械学習を使った株価予測(ファンダメンタルズ指標導入でAUC=0.70超え)

株式投資は、予測するものではなくルールに沿って選ぶものです。 その際に、選んだ銘 …