【GAS】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クラスに対して主に以下のメソッドを実行できます。
メソッド | 戻り値の型 | 説明 |
---|---|---|
getContentText | String | HTTPレスポンスを文字コードによって文字列に変換して取得する |
getHeaders | Object | HTTPレスポンスヘッダーの属性:値の連想配列を返す |
getBlob | Blob | オブジェクト内のデータをblobとして返す |
getAs | Blob | オブジェクト内のデータを「contentType」で指定されたタイプに変換されたblobとして返す |
getResponseCode | Integer | HTTP応答の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レスポンスのステータスコードを確認できる