Project Fx 2.0

怪文書と備忘録を書きます

QiitaのLGTMをエクスポートするツールを作った

Qiita離れの動きが加速している昨今[要出典]、LGTM・ストックしていた良記事が作者のQiita退会に伴い見れなくなってしまうということが増えてきました。

「自分が面白いと思った情報が自分の与り知らない所で自分の視界からフェードアウトしてしまう」というのは私にとってとても腹立たしい事なので、 今のうちに自分が面白いと思った記事を全てアーカイブする準備を進めています。 その一環として、Qiitaで自分がLGTMした記事の情報を取得してCSVに出力するツールを書きました。

最初こそ「ストックがAPIで取れるんだからLGTMも簡単に行けるっしょー」と思っていたのですが、 よく調べたところQiita APIでは自分がLGTMした記事を取得することができないことが判明したため、 puppeteerを使ってスクレイピングしました。

コードはこちらに置いてあります。yarnを叩けば動くはずです。
実行すると「記事タイトル・記事URL・記事著者名・LGTM数・記事の投稿日時」を取得し、CSVに吐き出してくれます。

github.com

なぜpuppeteerなのか

手順

大したことはしていません。
各ユーザのLGTM一覧ページ (https://qiita.com/ユーザー名/lgtms?page=数字) 内の要素を抜き出し、CSVにまとめているだけです。
ユーザー名の部分を変更すれば任意のユーザーのLGTMを取得できるはずです。 記事タイトルや記事作成日時などといった情報の正確な値は記事のURLさえ分かればQiita APIで取得できますが、今回はそこまで正確な情報は不要だったためLGTM一覧ページから直接スクレイピングすることにしました。

なお、ツール内にTwitter連携でQiitaにログインするコードが含まれていますが、 これは「同じクライアントから未ログイン状態で立て続けに10回以上Qiitaにアクセスした場合、Qiitaへのアカウント登録を促すプロンプトが出現する」という仕様を回避するために付けたものです。 その後、プロンプトが出ていても目的のスクレイピングの実行に支障は出ないことが判明し、このログイン機構の存在意義は端から無かったことが分かりました。
もしかしたら、このログイン機構も実は限定公開記事の情報を取得するのに便利だったりするのかもしれません。 限定公開記事を見たことがないので知りませんが。

CSVの出力が地味に一番の難関でした。 自前での実装が厳しかったので、結局papaparseという専用のライブラリを使っています。

www.papaparse.com

所感

  • スクレイピング楽しかったです。欲しい情報を適切に切り出すことに成功した時のエクスタシーは何物にも代えがたいですね。
  • puppeteerは色々と自由度が高いですが、それゆえに適切な調整の仕方を見つけ出すのが中々難しいという事が分かりました。
  • この記事をQiitaに投稿してLGTMが欲しい

追記

2021年2月26日に行われたQiitaの大規模アップデートにより、LGTM一覧ページが改修されました。

qiita.com

これに伴い、puppeteer_qiita.jsに以下の変更を施しました:

  • コード内で使用していたXPathをすべて書き換える
  • 記事の作者・記事の更新日時の情報がLGTM一覧ページに表示されなくなったため、これらを出力する機能を削除