ねほり.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技術

  関連記事

NW-X1060のフォルダ再生が公式対応された

2010年02月28日(日) NW-X1060フォルダ再生対応 昨年「MP3のタ …

17,220人/日 のアクセス数を達成しました(晒され記念日)

中間発表終ったぁ~ 先生の顔が、非常にパッとしませんでしたが、気にしな~い。 と …

推薦論文の査読結果&キッズGooでWebサイトが表示されるために

推薦論文 「推薦論文」の査読結果が返ってきた・・・・   & …

「ティッカー」アプリを作ってみました

東京、釣り無理 一足先に東京へ行った釣り仲間の A 氏から電話・・・ &nbsp …

機械学習で株価予測(Pythonのバックテストライブラリ調査)

前回、機械学習で解いた予測結果がどれだけ利益が出ているのか詳しく知ることが出来ま …

検見川浜突堤・稲毛海浜公園の年間釣り魚情報まとめ(千葉市美浜区)

印旛沼周辺には何度か釣りに行きましたが、まったく釣れませんでした。 遊漁料も必要 …

読書の秋に池田敏雄やアラン・クーパーの言葉を胸に

神奈川の知人 S からのメール・・・・    &n …

不老不死に向けた研究はどこまで進んでいるか?

「不老不死」 それは、歴史上、中国・秦の始皇帝が追い求め、多くの独裁者にとっての …

社内アイデアコンテストに9件提出して部門長奨励賞を頂く

やり切りました。。 ホールの1ブロック占拠して、9件のデモを展示しました。 顔を …

人工知能で「くずし字」の文字認識の現状調査

日本人の多くは、日本人が150年前の文書が読めません。 家系図調査は「除籍謄本」 …