🍣

GASを用いたスクレイピングでカクヨムの情報を自動収集しよう

2022/12/18に公開

TL;DR

  • GoogleAppsScriptを用いてスクレイピングをするよ
  • カクヨムの情報(☆ふぁぼ)を自動で収集するよ
  • 収集した情報はスプレッドシートに保存されるよ

注意点

  • 細かいこと(仕様)は説明しません。
  • コードは適当(動けばええんや精神)
  • スキーマ設計も適当(グラフ作るなら日時の形式を変えた方がいいかも)
  • カクヨムさんはスクレイピング許してくれてるのかな?
  • 一時間ごとなら許してくれそう。
  • 明文化はされていないみたい。暗黙の了解?

実装

まず、スプレッドシートのページに移動しましょう。
こちら

空白をクリックして、新規のスプレッドシートを作成しましょう。

そしたら「拡張機能」→「Apps Script」をクリック。
新規タブが開かれます。

まず、必要なライブラリをインストールします。
左の「ライブラリ」の「+」をクリックして、下のライブラリIDを入力してください。

1Mc8BthYthXx6CoIz90-JiSzSafVnT6U3t0z_W3hLTAX5ek4w0G_EIrNw

次に右のエディタ部分を編集します。

以下のコードを丸コピしてください。

function myFunction() {
  const sheet_id = 'xxxxxxxxxxxxxx';
  const sheet_name = 'シート1';

  const sheet = SpreadsheetApp.openById(sheet_id).getSheetByName(sheet_name);
 
  // カラム名を書き込み
  if (sheet.getDataRange().isBlank()){
    let columns = ["Year", "Month", "Date", "Hours", "Minutues", "Stars", "Reviews", "Rating", "Followers"];
    sheet.appendRow(columns);
  }

  // 現在日時等を取得
  var today = new Date();
  year = Number(today.getFullYear());
  month = Number(today.getMonth()) + 1; 
  date = Number(today.getDate());
  hour = Number(today.getHours());
  minitue = Number(today.getMinutes());

 // URLフェッチ
 // スクレイピング対象のURLを指定
  let url = "https://kakuyomu.jp/works/yyyyyyyyyyyyy";
 // フェッチ実行
  let response = UrlFetchApp.fetch(url);
  let content = response.getContentText();

 // 星の数を取得
  let texts = Parser.data(content).from('<span class="js-total-review-point-element">').to('</span>').iterate();
  let star = texts[0];
  star = Number(star.replace(',',''));

  // フォロワー数を取得
  texts = Parser.data(content).from('<span class="js-follow-button-follower-counter" data-follower-count="').to('">').iterate();
  let follower = texts[0];
  follower = Number(follower.replace(',',''));

  // レビュー数を取得
  texts = Parser.data(content).from('<dd><a href="/works/16817330649393159284/reviews">').to('人</a>').iterate();
  let num_reviews = texts[0];
  num_reviews = Number(num_reviews.replace(',',''));

  // 星/レビュー数より星レーティングを計算
  let rating = star / num_reviews;

  // シートに書き込み
  const addArray = [year, month, date, hour, minitue, star, num_reviews, rating, follower];
  sheet.appendRow(addArray)

  // デバッグ用の標準出力
  console.log(star, follower, num_reviews, rating);
}

少し編集を加えます。

xxxxxxxxxxxxxxにはご自身のスプレッドシートのURLのIDを入力してください。
この例ですと"1ac5-F9xK4-nb-v7Y7nXLAa0kxei38dfKTUP0ARO-v64"になります。

yyyyyyyyyyyyyには取得したい作品のURL最後部(たぶん作品ID)を入力してください。

そしたら「実行」を押して、正しく動くことを確認してください。
スプレッドシートに書き込まれていたら成功です。

次に左タブにある時計マークの「トリガー」をクリック

上のような画面になったら、右下の「トリガーを追加」をクリック

こんな感じで設定して完了です。

これで一時間おきに自動収集してくれます。

Discussion