質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • JavaScript

    16325questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • Google Apps Script

    828questions

    Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

  • スクレイピング

    328questions

  • Cookie

    176questions

    HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

Cookieが必要なサイトをUrlFetchAppでスクレイピングする方法

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 1,565

SASAKI_APPL

score 73

Google Apps ScriptでCookieを使うサイトをスクレイピングしたいです。

このサイトの検索結果をスクレイピングしたいのですが、一発でアクセスすることができないよう、大元のページにリダイレクトされます。
ブラウザの場合、もう一度URLにアクセスすると、見れるようになります。

これをUrlFetchで行いたいのですが、ただ、二回アクセスするだけではCookieが保存されず、検索結果のページを取得でしません。

  var options = {
  "method" : "GET",
  muteHttpExceptions:true
  };
  var core = UrlFetchApp.fetch("https://catalog.library.metro.tokyo.jp/winj/opac/search-detail.do?org.apache.struts.taglib.html.TOKEN=1d95d116da40c48b0a1b726593e72d0c&cmb_column1=title&txt_word1=&cmb_like1=2&cmb_unit1=0&cmb_column2=author&txt_word2=&cmb_like2=2&cmb_unit2=0&cmb_column3=publisher&txt_word3=&cmb_like3=2&cmb_unit3=0&cmb_column4=fulltext&txt_word4=&cmb_like4=2&cmb_unit4=0&txt_atykey1=&chk_atytp1=11+21&hid_aty_column1=oatyid_11_21&txt_atyword1_dummy=&cmb_unit_aty=0&txt_atykey2=&chk_atytp2=12+22&hid_aty_column2=oatyid_12_22&txt_atyword2_dummy=&txt_ndc=&txt_stpubdate=&txt_edpubdate=&cmb_form=&cmb_littp=&cmb_lang=&txt_holcd=5019490166&cmb_code_column=isbn&txt_code=&txt_magcd=&txt_lom=&txt_cln1=&txt_cln2=&txt_cln3=&cmb_volume_column=volume&txt_stvolume=&txt_edvolume=&chk_catph=11+31&chk_catph=12+22+32&chk_catph=13+33&chk_area=01&chk_hol1tp=101+201+211+221+231+241+251+301+401+411+501+601+801&chk_hol1tp=103+203+213+223+233+243+253+303+403+413+503+603+803&chk_hol1tp=104+204+214+224+234+244+254+304+404+414+504+604+804&chk_hol1tp=105+205+215+225+235+245+255+305+405+415+505+605+805&chk_hol1tp=106+206+216+226+236+246+256+306+406+416+506+606+806&chk_hol1tp=107+207+217+227+237+247+257+307+407+417+507+607+707+807&chk_hol1tp=221+223+224+225+226+227+251+253+254+255+256+257&chk_hol1tp=201+203+204+205+206+207+231+233+234+235+236+237&chk_hol1tp=211+213+214+215+216+217+241+243+244+245+246+247&cmb_column9=ctntp&cmb_like9=0&cmb_unit9=0&txt_word9=&cmb_order=pubYear&opt_order=1&opt_pagesize=50&submit_btn_searchDetailSelAr=検索",options);
var response = UrlFetchApp.fetch("https://catalog.library.metro.tokyo.jp/winj/opac/search-detail.do?org.apache.struts.taglib.html.TOKEN=1d95d116da40c48b0a1b726593e72d0c&cmb_column1=title&txt_word1=&cmb_like1=2&cmb_unit1=0&cmb_column2=author&txt_word2=&cmb_like2=2&cmb_unit2=0&cmb_column3=publisher&txt_word3=&cmb_like3=2&cmb_unit3=0&cmb_column4=fulltext&txt_word4=&cmb_like4=2&cmb_unit4=0&txt_atykey1=&chk_atytp1=11+21&hid_aty_column1=oatyid_11_21&txt_atyword1_dummy=&cmb_unit_aty=0&txt_atykey2=&chk_atytp2=12+22&hid_aty_column2=oatyid_12_22&txt_atyword2_dummy=&txt_ndc=&txt_stpubdate=&txt_edpubdate=&cmb_form=&cmb_littp=&cmb_lang=&txt_holcd=5019490166&cmb_code_column=isbn&txt_code=&txt_magcd=&txt_lom=&txt_cln1=&txt_cln2=&txt_cln3=&cmb_volume_column=volume&txt_stvolume=&txt_edvolume=&chk_catph=11+31&chk_catph=12+22+32&chk_catph=13+33&chk_area=01&chk_hol1tp=101+201+211+221+231+241+251+301+401+411+501+601+801&chk_hol1tp=103+203+213+223+233+243+253+303+403+413+503+603+803&chk_hol1tp=104+204+214+224+234+244+254+304+404+414+504+604+804&chk_hol1tp=105+205+215+225+235+245+255+305+405+415+505+605+805&chk_hol1tp=106+206+216+226+236+246+256+306+406+416+506+606+806&chk_hol1tp=107+207+217+227+237+247+257+307+407+417+507+607+707+807&chk_hol1tp=221+223+224+225+226+227+251+253+254+255+256+257&chk_hol1tp=201+203+204+205+206+207+231+233+234+235+236+237&chk_hol1tp=211+213+214+215+216+217+241+243+244+245+246+247&cmb_column9=ctntp&cmb_like9=0&cmb_unit9=0&txt_word9=&cmb_order=pubYear&opt_order=1&opt_pagesize=50&submit_btn_searchDetailSelAr=検索",options);
      Logger.log(response);

どのようにしたら、検索結果のページをUrlFetchでアクセスできるのでしょうか。

*3/12追記
Cookie取得まではできたのですが、以下のようにしても結果が変わりません。
何かミスなどがあったらご教授ください。

function metro(){

var url = "https://catalog.library.metro.tokyo.jp/winj/opac/search-detail.do?org.apache.struts.taglib.html.TOKEN=1d95d116da40c48b0a1b726593e72d0c&cmb_column1=title&txt_word1=&cmb_like1=2&cmb_unit1=0&cmb_column2=author&txt_word2=&cmb_like2=2&cmb_unit2=0&cmb_column3=publisher&txt_word3=&cmb_like3=2&cmb_unit3=0&cmb_column4=fulltext&txt_word4=&cmb_like4=2&cmb_unit4=0&txt_atykey1=&chk_atytp1=11+21&hid_aty_column1=oatyid_11_21&txt_atyword1_dummy=&cmb_unit_aty=0&txt_atykey2=&chk_atytp2=12+22&hid_aty_column2=oatyid_12_22&txt_atyword2_dummy=&txt_ndc=&txt_stpubdate=&txt_edpubdate=&cmb_form=&cmb_littp=&cmb_lang=&txt_holcd=5019490166&cmb_code_column=isbn&txt_code=&txt_magcd=&txt_lom=&txt_cln1=&txt_cln2=&txt_cln3=&cmb_volume_column=volume&txt_stvolume=&txt_edvolume=&chk_catph=11+31&chk_catph=12+22+32&chk_catph=13+33&chk_area=01&chk_hol1tp=101+201+211+221+231+241+251+301+401+411+501+601+801&chk_hol1tp=103+203+213+223+233+243+253+303+403+413+503+603+803&chk_hol1tp=104+204+214+224+234+244+254+304+404+414+504+604+804&chk_hol1tp=105+205+215+225+235+245+255+305+405+415+505+605+805&chk_hol1tp=106+206+216+226+236+246+256+306+406+416+506+606+806&chk_hol1tp=107+207+217+227+237+247+257+307+407+417+507+607+707+807&chk_hol1tp=221+223+224+225+226+227+251+253+254+255+256+257&chk_hol1tp=201+203+204+205+206+207+231+233+234+235+236+237&chk_hol1tp=211+213+214+215+216+217+241+243+244+245+246+247&cmb_column9=ctntp&cmb_like9=0&cmb_unit9=0&txt_word9=&cmb_order=pubYear&opt_order=1&opt_pagesize=50&submit_btn_searchDetailSelAr=検索";
var options = {
"method" : "post",
followRedirects: false
}

var core = UrlFetchApp.fetch(url,options);
Logger.log("core:"+core)

var headers = core.getAllHeaders();
var cookies = [];

if ( typeof headers['Set-Cookie'] !== 'undefined' ) {
// Set-Cookieヘッダーが2つ以上の場合はheaders['Set-Cookie']の中身は配列
var cookies = typeof headers['Set-Cookie'] == 'string' ? [ headers['Set-Cookie'] ] : headers['Set-Cookie'];
for (var i = 0; i < cookies.length; i++) {
// Set-Cookieヘッダーからname=valueだけ取り出し、セミコロン以降の属性は除外する
cookies[i] = cookies[i].split( ';' )[0];
};
}
Logger.log(cookies);

var headers = {
"Cookie" : cookies
}
// リクエストオプションにheadersを設定
var options = {
"method" : "GET",
muteHttpExceptions:true,
"headers" : headers
}
var response = UrlFetchApp.fetch(url,options);
Logger.log("response:"+response);
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

+1

自分が知らぬ間にサイトの仕様が変更されていたらしく、Cookieで取得したJSESSIONIDをURLに含めることで無事スクレイピングできました。

  var url1     = "https://catalog.library.metro.tokyo.jp/winj/opac/search-detail.do?lang=ja";
  var options = {
    "method" : "post",
    followRedirects: false
  }

  var core    = UrlFetchApp.fetch(url1,options);


  var headers = core.getAllHeaders();
  var cookies = [];

        if ( typeof headers['Set-Cookie'] !== 'undefined' ) {
          // Set-Cookieヘッダーが2つ以上の場合はheaders['Set-Cookie']の中身は配列
          var cookies = typeof headers['Set-Cookie'] == 'string' ? [ headers['Set-Cookie'] ] : headers['Set-Cookie'];
          for (var i = 0; i < cookies.length; i++) {
            // Set-Cookieヘッダーからname=valueだけ取り出し、セミコロン以降の属性は除外する
            cookies[i] = cookies[i].split( ';' )[0];
          };
        }
 var cookies = cookies + "";
 var cookie  = cookies.replace( "JSESSIONID=" , "" ) ;

 var url2 = "https://catalog.library.metro.tokyo.jp/winj/opac/search-detail.do;jsessionid="+cookie+"?txt_holcd="+BAR+"&cmb_code_column=isbn&txt_code=&txt_magcd=&txt_lom=&txt_cln1=&txt_cln2=&txt_cln3=&cmb_volume_column=volume&txt_stvolume=&txt_edvolume=&chk_catph=11+31&chk_catph=12+22+32&chk_catph=13+33&chk_area=01&chk_area=03&chk_hol1tp=101+201+211+221+231+241+251+301+401+411+501+601+801&chk_hol1tp=103+203+213+223+233+243+253+303+403+413+503+603+803&chk_hol1tp=104+204+214+224+234+244+254+304+404+414+504+604+804&chk_hol1tp=105+205+215+225+235+245+255+305+405+415+505+605+805&chk_hol1tp=106+206+216+226+236+246+256+306+406+416+506+606+806&chk_hol1tp=107+207+217+227+237+247+257+307+407+417+507+607+707+807&chk_hol1tp=221+223+224+225+226+227+251+253+254+255+256+257&chk_hol1tp=201+203+204+205+206+207+231+233+234+235+236+237&chk_hol1tp=211+213+214+215+216+217+241+243+244+245+246+247&cmb_column9=ctntp&cmb_like9=0&cmb_unit9=0&txt_word9=&cmb_order=pubYear&opt_order=1&opt_pagesize=50&submit_btn_searchDetailSelAr=検索";
 var options = {
    "method" : "post",
    followRedirects: false
  }
 var response = UrlFetchApp.fetch(url2,options);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

var url = "https://catalog.library.metro.tokyo.jp/winj/opac/search-detail.do?org.apache.struts.taglib.html.TOKEN=1d95d116da40c48b0a1b726593e72d0c&cmb_column1=title&txt_word1=&cmb_like1=2&cmb_unit1=0&cmb_column2=author&txt_word2=&cmb_like2=2&cmb_unit2=0&cmb_column3=publisher&txt_word3=&cmb_like3=2&cmb_unit3=0&cmb_column4=fulltext&txt_word4=&cmb_like4=2&cmb_unit4=0&txt_atykey1=&chk_atytp1=11+21&hid_aty_column1=oatyid_11_21&txt_atyword1_dummy=&cmb_unit_aty=0&txt_atykey2=&chk_atytp2=12+22&hid_aty_column2=oatyid_12_22&txt_atyword2_dummy=&txt_ndc=&txt_stpubdate=&txt_edpubdate=&cmb_form=&cmb_littp=&cmb_lang=&txt_holcd=5019490166&cmb_code_column=isbn&txt_code=&txt_magcd=&txt_lom=&txt_cln1=&txt_cln2=&txt_cln3=&cmb_volume_column=volume&txt_stvolume=&txt_edvolume=&chk_catph=11+31&chk_catph=12+22+32&chk_catph=13+33&chk_area=01&chk_hol1tp=101+201+211+221+231+241+251+301+401+411+501+601+801&chk_hol1tp=103+203+213+223+233+243+253+303+403+413+503+603+803&chk_hol1tp=104+204+214+224+234+244+254+304+404+414+504+604+804&chk_hol1tp=105+205+215+225+235+245+255+305+405+415+505+605+805&chk_hol1tp=106+206+216+226+236+246+256+306+406+416+506+606+806&chk_hol1tp=107+207+217+227+237+247+257+307+407+417+507+607+707+807&chk_hol1tp=221+223+224+225+226+227+251+253+254+255+256+257&chk_hol1tp=201+203+204+205+206+207+231+233+234+235+236+237&chk_hol1tp=211+213+214+215+216+217+241+243+244+245+246+247&cmb_column9=ctntp&cmb_like9=0&cmb_unit9=0&txt_word9=&cmb_order=pubYear&opt_order=1&opt_pagesize=50&submit_btn_searchDetailSelAr=検索"

function cookies(){
  var options = {
    method : "post",
    followRedirects: false
  };

  var response = UrlFetchApp.fetch(url,options);

  var headers = response.getAllHeaders();
  var cookies = [];

  if ( typeof headers['Set-Cookie'] !== 'undefined' ) {
    // Set-Cookieヘッダーが2つ以上の場合はheaders['Set-Cookie']の中身は配列
    var cookies = typeof headers['Set-Cookie'] == 'string' ? [ headers['Set-Cookie'] ] : headers['Set-Cookie'];
    for (var i = 0; i < cookies.length; i++) {
      // Set-Cookieヘッダーからname=valueだけ取り出し、セミコロン以降の属性は除外する
      cookies[i] = cookies[i].split( ';' )[0];
    };
  }
  return cookies
}

Logger.log(cookies)

これでcookieがとれるまではやりました。
その後ちょっと時間がないのであれですが、参考になれば。。。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/12 15:50 編集

    回答ありがとうございます。
    Cookie取得まではできました。

    が、Cookie取得前と結果が変わりません、、

    ```JavaScript
    function metro(){

    var url = "https://catalog.library.metro.tokyo.jp/winj/opac/search-detail.do?org.apache.struts.taglib.html.TOKEN=1d95d116da40c48b0a1b726593e72d0c&cmb_column1=title&txt_word1=&cmb_like1=2&cmb_unit1=0&cmb_column2=author&txt_word2=&cmb_like2=2&cmb_unit2=0&cmb_column3=publisher&txt_word3=&cmb_like3=2&cmb_unit3=0&cmb_column4=fulltext&txt_word4=&cmb_like4=2&cmb_unit4=0&txt_atykey1=&chk_atytp1=11+21&hid_aty_column1=oatyid_11_21&txt_atyword1_dummy=&cmb_unit_aty=0&txt_atykey2=&chk_atytp2=12+22&hid_aty_column2=oatyid_12_22&txt_atyword2_dummy=&txt_ndc=&txt_stpubdate=&txt_edpubdate=&cmb_form=&cmb_littp=&cmb_lang=&txt_holcd=5019490166&cmb_code_column=isbn&txt_code=&txt_magcd=&txt_lom=&txt_cln1=&txt_cln2=&txt_cln3=&cmb_volume_column=volume&txt_stvolume=&txt_edvolume=&chk_catph=11+31&chk_catph=12+22+32&chk_catph=13+33&chk_area=01&chk_hol1tp=101+201+211+221+231+241+251+301+401+411+501+601+801&chk_hol1tp=103+203+213+223+233+243+253+303+403+413+503+603+803&chk_hol1tp=104+204+214+224+234+244+254+304+404+414+504+604+804&chk_hol1tp=105+205+215+225+235+245+255+305+405+415+505+605+805&chk_hol1tp=106+206+216+226+236+246+256+306+406+416+506+606+806&chk_hol1tp=107+207+217+227+237+247+257+307+407+417+507+607+707+807&chk_hol1tp=221+223+224+225+226+227+251+253+254+255+256+257&chk_hol1tp=201+203+204+205+206+207+231+233+234+235+236+237&chk_hol1tp=211+213+214+215+216+217+241+243+244+245+246+247&cmb_column9=ctntp&cmb_like9=0&cmb_unit9=0&txt_word9=&cmb_order=pubYear&opt_order=1&opt_pagesize=50&submit_btn_searchDetailSelAr=検索";
    var options = {
    "method" : "post",
    followRedirects: false
    }

    var core = UrlFetchApp.fetch(url,options);
    Logger.log("core:"+core)

    var headers = core.getAllHeaders();
    var cookies = [];

    if ( typeof headers['Set-Cookie'] !== 'undefined' ) {
    // Set-Cookieヘッダーが2つ以上の場合はheaders['Set-Cookie']の中身は配列
    var cookies = typeof headers['Set-Cookie'] == 'string' ? [ headers['Set-Cookie'] ] : headers['Set-Cookie'];
    for (var i = 0; i < cookies.length; i++) {
    // Set-Cookieヘッダーからname=valueだけ取り出し、セミコロン以降の属性は除外する
    cookies[i] = cookies[i].split( ';' )[0];
    };
    }
    Logger.log(cookies);

    var headers = {
    "Cookie" : cookies
    }
    // リクエストオプションにheadersを設定
    var options = {
    "method" : "GET",
    muteHttpExceptions:true,
    "headers" : headers
    }
    var response = UrlFetchApp.fetch(url,options);
    Logger.log("response:"+response);
    }
    ```

    何が間違っているのでしょうか...?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • JavaScript

    16325questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • Google Apps Script

    828questions

    Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

  • スクレイピング

    328questions

  • Cookie

    176questions

    HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。