Google スプレッドシートに書かれているURLからタイトルとmeta descriptionを取得する。タイトルそのままです。

「Google スプレッドシートのデータの取得と書き込み」のようなタイトルの記事は先人たちがすでに大量にアップしているのでニッチなタイトルにしようかと思ったのですが、実際にはこのネタもすでに数多く公開されているんですよね。しかも思ったよりも簡単な方法で・・・。

Google スプレッドシートを使った簡単スクレイピング

Google スプレッドシートで簡単なスクレイピングができてしまいます。やり方は簡単。スプレッドシートに以下を書き込むだけで https://lets-csharp.com/ のタイトルを取得することができます。

タイトルタグはひとつのページにひとつしかないものですが、WordPressのプラグインを使っていると複数生成される場合があります。この場合、スプレッドシートの2行に出力されてしまうので最初のひとつだけを出力させるためにINDEX関数を使っています。

またA列にurlを書きこんでB列に以下のように書くとurlから簡単にタイトルを抜き出すことができます。

タイトル以外にも抜き出せます。SEOではタイトルと同様に重要なものとしてメタディスクリプション(meta description)があります。meta descriptionは検索順位に直接影響を与えるものではなく、そのページの要約を端的にまとめたものです。検索結果にタイトルとともに表示されるため、クリック率に大きな影響を与えます。そのmeta descriptionも簡単に抜き出すことができます。

以上で終わります。・・・とはなりません。実はこの方法で大量のurlを取得しようとすると固まってしまうという問題点があります。手軽さでいえばこの方法がベストですが、柔軟性と自由度でいえば他の方法を考えたほうがいいかもしれません。

Google Sheets APIでスクレイピングの結果を書き込む

そこでGoogle Sheets APIをつかってA列のurlを取得して対象ページをスクレイピングして結果をB列とC列に書き込むアプリケーションを作成します。

スプレッドシートの内容を取得したり書き込むためにはGoogle Cloudでプロジェクトを作成します。

Google Cloudでプロジェクトを作成する

まずはここへアクセスしましょう。Googleアカウントにログインしていない場合はログインするように表示されるのでログインします。すると[新しいプロジェクト] ページが表示されます。

Google Cloudでプロジェクトを作成する

[プロジェクト名]は表示されている名前をそのまま使用するか、別の名前を入力します。プロジェクト名はいつでも変更できます。ただしプロジェクト IDは変更できません。そのプロジェクトがなにかわかりやすい ID を設定するべきですが、機密情報は含めないようにしてください。

あとは以下の方法でGoogle Sheets APIを有効にしてサービスアカウントを作成し、Googleスプレッドシート側からサービスアカウントに編集権限を追加します。Googleスプレッドシートを自由に操作できる権限があるのであればこの方法が一番簡単だと思います。

C#でアプリをつくる

パッケージマネージャーでGoogle.Apis.Sheets.v4をインストールします。またHTMLを解析するためにAngleSharpをインストールします。

ボタンをクリックしたらスプレッドシートのA列に書かれているurlを取得してタイトルとdescriptionを取得してこれを書き込みます。

urlと取得したタイトルとdescriptionを格納するクラスを定義します。

SheetsServiceを取得する

事前にダウンロードしておいたjsonファイルからスプレッドシートにアクセスするためのサービスを作成して取得する処理を示します。

Sheetからデータを取得する

スプレッドシートの内容を取得する処理を示します。IList<IList<Object>>型で返されるので、これを文字列の配列のリストに変換します。

URLからタイトルとdescriptionを取得する

URLからタイトルとdescriptionを取得する処理を示します。このとき引数として渡された文字列が空文字列であったりurlではなかったり、アクセスしても403や404などのエラーステータスコードが返される場合があります。そのため例外処理をしています。

Sheetにデータを書き込む

スプレッドシートの内容を書き込む処理を示します。request.ValueInputOptionを指定しないと例外が発生するので注意が必要です。ValueInputOptionをUSERENTEREDにすると関数の書き込みも可能になります。RAWだと指定された文字列がそのまま入ります。

完成させる

ボタンをクリックしたときの処理を示します。ここでは対象とするシートのIDと列の範囲を指定しなければなりません。アクセスしようとしているurlのスプレッドシートは https://docs.google.com/spreadsheets/d/XXXXXXX/edit#gid のようになっていますが、XXXXXXXの部分がIDになります。範囲は[シート名!A2:C]のように指定します。

[シート名!A2:C10]だとA列からC列の2行目から10列目までがデータの取得と書き込みの対象となります。A列が何列あるのかわからない場合は[シート名!A2:C]とすることでA列からC列の2行目から最後までが対象となります。