🍣
GASを用いたスクレイピングでカクヨムの情報を自動収集しよう
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