【GAS】UrlFetchApp.fetchの使い方

GASgetAs,getBlob,getContentText,getHeaders,getResponseCode,UrlFetchApp,UrlFetchApp.fetch,スクレイピング

GASでスクレイピングの方法を調べると、UrlFetchApp.fetchという記述を見かけます。
スクレイピング時はgetContentTextを組み合わせて処理することが多いですが、他にどのような使い方があるのでしょうか。

この記事では、UrlFetchAppクラスのfetchメソッドにはどのような使い方があるのか、サンプルコードとともに解説します。

fetchメソッドgetContentTextを使ったシンプルなスクレイピング記述方法は下記で詳しく説明しているのでぜひご覧ください。

UrlFetchApp.fetchとは

UrlFetchApp.fetch(URL [, パラメータ])

UrlFetchAppクラスのfetchメソッドは、引数に指定したURLに対しHTTPリクエストが実行され、サーバーからのHTTPレスポンス(HTTPResponseクラス)が戻り値として取得できます。要はアクセス対象ページの情報がもらえるメソッドと理解しておけばよいでしょう。

HTTPResponseクラス

fetchメソッドを扱うにあたり、HTTPレスポンス(HTTPResponseクラス)について整理しておきます。HTTPレスポンスは下記の3つから構成されます。

  • ステータスライン:3桁のコードで、現在の状態(ステータス)を表す
  • HTTPレスポンスヘッダ:レスポンスボディの前に格納される、各種の状態を示す情報が入れられている部分です。
  • HTTPレスポンスボディ(メッセージボディ):データ本体

ステータスコードはたまにメンテナンスされてないサイトだと「404」(存在しない)という表記を思い出すとわかりやすいかもしれません。スクレイピングしてページの分析する際には、getContentTextを使ってボディを処理しているということですね。

UrlFetchApp.fetchで使えるメソッド

HTTPResponseクラスに対して主に以下のメソッドを実行できます。

メソッド戻り値の型説明
getContentTextStringHTTPレスポンスを文字コードによって文字列に変換して取得する
getHeadersObjectHTTPレスポンスヘッダーの属性:値の連想配列を返す
getBlobBlobオブジェクト内のデータをblobとして返す
getAsBlobオブジェクト内のデータを「contentType」で指定されたタイプに変換されたblobとして返す
getResponseCodeIntegerHTTP応答のHTTPステータスコード(OKの場合は200など)を取得する

それでは一つずつ見ていきましょう。

getContentTextメソッド

基本構文

HTTPResponse.getContentText([charset])

  • charset(string):文字コード(’UTF-8’、’shift-jis’ 等) ※デフォルトは「utf-8」
  • response(string):HTTP形式の情報が変換された文字列

UrlFetchApp.fetchで取得したレスポンス(HTTPResponse)に対して、最もよく使うメンバーはgetContentTextです。URL指定で取得した情報を文字列に変換してくれます。

  const url = "https://cookpad.com/"; // 対象サイト/ページのURL
  const content = UrlFetchApp.fetch(url).getContentText('UTF-8'); 

  console.log(content);
実行結果

Logging output too large. Truncating output. <!DOCTYPE html> <html lang=’ja’> <head> <meta charset=’utf-8′> <meta content=’IE=edge’ http-equiv=’X-UA-Compatible’> <link href=’https://cookpad.com/recipe/7047233′ rel=’canonical’> <link href=’http://m.cookpad.com/recipe/7047233′ media=’handheld’ rel=’alternate’ type=’text/html’> <link href=’https://assets.cpcdn.com/assets/device/apple-touch-icon.png?92b8bd477aedd34713e3d853583626f4d29101bdc7e6ceb52dcfe037b49e0988′ rel=’apple-touch-icon’> <link href=’/osd.xml’ rel=’search’ title=’クックパッド レシピ’ type=’application/opensearchdescription+xml’> <title>簡単!美味しい!伊達巻 by りんごキッチン☆ 【クックパッド】 簡単おいしいみんなのレシピが362万品</title><meta content="簡単!美味しい!伊達巻,■はんぺん,■砂糖,■みりん,■日本酒,■しょうゆ,

・・・・

活用方法

getContentTextメソッドでページ上の文字列を取得できたら、その後は「Parserライブラリ」というスクレイピング処理(HTML記述の処理)がパッケージ化されたライブラリを使って分析等を行います。

Parserライブラリについてやライブラリを活用したスクレイピング方法は下記の記事で詳しく解説しているので詳細を知りたい方は是非ご覧ください。

getHeadersメソッド

基本構文

HTTPResponse.getHeaders()

  • response(object):連想配列になったHTTPレスポンスのヘッダー情報

HTTPレスポンスのヘッダーの属性と値を連想配列(オブジェクトリテラル)として返します。

下記のサンプルコードでは、「Server(クローリング対象ページのHTTPレスポンスを返したサーバー)」と「Content-Type(クライアントに返されたコンテンツの種類)」を表示しています。

 const url ='https://cookpad.com/recipe/7018658';
  const response = UrlFetchApp.fetch(url);
  const headers = response.getHeaders();

  console.log(headers['Server']); //nginx
  console.log(headers['Content-Type']); //text/html; charset=utf-8

getBlobメソッド

基本構文

HTTPResponse.getBlob()

  • response(blob):HTTPレスポンスのblob型データ

オブジェクト内のデータが、データベースで用いられるデータ型の一つであるBLOB型で返ってきます。getNameでファイル名、getContentTypeでタイプが返ってきます。

  const url ='https://cookpad.com/recipe/7018658';
  const response = UrlFetchApp.fetch(url);
  const getBlob = response.getBlob();

  console.log(getBlob.getName()); // 7018658.html
  console.log(getBlob.getContentType()); // text/html

BLOB型についての詳細は下記の記事を参照してください。

getAsメソッド

基本構文

HTTPResponse.getAs(contentType)

  • contentType(string):変換したい対象のMIME型
  • response(blob):HTTPレスポンスのblob型データ

getBlob何らかのデータをblob型で取得するメソッドであるのに対して、getAsそれにMIME型を指定して変換してから取得するメソッドです。

ContentTypeは例として「text/html」「text/csv」「application/pdf」などがあります。

  const url ='https://cookpad.com/recipe/7018658';
  const response = UrlFetchApp.fetch(url);

  console.log(response.getBlob().getContentType()); //text/html

  console.log(response.getAs('text/plain').getContentType()); //text/plain
  console.log(response.getAs('text/csv').getContentType()); //text/csv
  console.log(response.getAs('application/pdf').getContentType()); //application/pdf

タイプをconsole.logしただけでは分かりづらいかもしれませんね。GASで実際にファイル変換して取得、保存する方法を下記の記事で解説しているので併せてご覧ください。

getResponseCode

基本構文

HTTPResponse.getResponseCode()

  • response(integer):HTTPレスポンスのステータスコード

getResponseCodeは、fetchで取得したHTTPレスポンスのステータスコードを確認するためのメソッドです。単体で使用するシーンは殆どなく、処理中のエラーを特定する際などに使います。

例えばAPIでURLフェッチする際にエラーが発生して処理が停止してしまった時、レスポンス取得の処理時点でのステータスがどうだったのか切り分けて把握することで、エラーポイントを特定しやすくすることができます。

  const url ='https://cookpad.com/recipe/7018658';
  const response = UrlFetchApp.fetch(url);

  console.log(response.getResponseCode()); // 200

まとめ

UrlFetchAppクラスのfetchメソッドにはどのような使い方があるのか、サンプルコードとともに解説しました

  • UrlFetchApp.fetchは指定したURLに対しHTTPレスポンスを要求するメソッド
  • getHeadersメソッドはヘッダーの属性と値を連想配列として返す
  • getBlobメソッドはHTTPレスポンスのオブジェクトデータをBLOB型で返す
  • getAsメソッドはMIME型を指定してBLOB型で返す
  • getResponseCodeメソッドはHTTPレスポンスのステータスコードを確認できる
この記事を書いた人

てつお
広告代理店出身、事業会社でWebマーケティングや開発の仕事をしている26歳です。プロフィール詳細はこちら
■Google広告認定資格|Google アナリティクス個人認定資格(GAIQ)|TOEIC920点