前提
GASでサイトのページをスクレイピングし、Cheerioで取得した以下の情報をスプレッドシートに記録しようとしています。
- title
- カノニカルタグ
- 読み込んでいるcssのpath(複数)
下記のサイトを参考にコードを書きましたが、読み込んでいるcssのpathが最初の一つしか取得できません。
https://blog.members.co.jp/article/51649
実現したいこと
- 各ページに読み込んでいるcssのpath(ページによって数が違う)を取得し、したい。
- 取得したcssのpathをスプレッドシート各行の末尾に列方向に追加したい。
発生している問題・エラーメッセージ
- 最初のcssのpathだけ記録できるが、2番目以降が取得できない。
該当のソースコード
GS
1function checker(){ 2 /* 3 ======================================== 4 初期設定 5 ======================================== 6 */ 7 const sheet = SpreadsheetApp.getActiveSheet(), 8 startRow = 2,//情報を置くセルの一番左上の列番号(A = 1...) 9 startCol = 6,//情報を置くセルの一番左上の行番号(1 = 1...) 10 URLListRow = startRow - 1,//URLリストの配置した列番号 11 authInfo = { 12 userName : '',//basic認証を行う場合のユーザーネーム 13 password : ''//basic認証を行う場合のパスワード 14 } 15 /** 16 * 取得するメタ情報 17 * outName => 取得する情報の名前 好きに設定(空は不可) 18 * name => name or property属性を設定 19 * prop => 上記nameで設定した属性の値を設定 20 metaInfo = [ 21 { 22 outName:'keywords', 23 name:'name', 24 prop:'keywords', 25 }, 26 { 27 outName:'desc', 28 name:'name', 29 prop:'description', 30 }, 31 { 32 outName:'og_title', 33 name:'property', 34 prop:'og:title', 35 }, 36 { 37 outName:'og_desc', 38 name:'property', 39 prop:'og:description', 40 }, 41 { 42 outName:'og_url', 43 name:'property', 44 prop:'og:url', 45 }, 46 ] 47 */ 48 49 /* 50 ======================================== 51 以下 script 52 ======================================== 53 */ 54 55 // clear cell 56 for (let i = startRow; i <= sheet.getLastColumn(); i++){ 57 const dataRange = sheet.getRange(startCol,i,sheet.getLastRow()); 58 dataRange.clearContent(); 59 } 60 61 // create url data 62 const urlData = sheet.getRange(startCol,URLListRow,sheet.getLastRow() - 1).getValues(); 63 let ary = ''; 64 for (var a = 0; a<urlData.length;a++){ 65 if(urlData[a][0]){ 66 ary = ary + String(urlData[a][0]) + ',' 67 } 68 } 69 ary = ary.split(','); 70 ary.pop(); 71 72 73 // header option 74 const options = { 75 method: "GET", 76 headers: {"Authorization" : "Basic " + Utilities.base64Encode(authInfo.userName + ":" + authInfo.password)}, 77 "muteHttpExceptions" : true, 78 "validateHttpsCertificates" : false, 79 "followRedirects" : false 80 } 81 let result = []; 82 83 // get html data 84 for(var i = 0; i < ary.length; i++){ 85 try { 86 let obj = Object.assign({}); 87 let r = Object.assign({}); 88 let resultURL = ary[i]; 89 const res = UrlFetchApp.fetch(resultURL,options); 90 const content = res.getContentText() 91 const $ = Cheerio.load(content); 92 obj.title = $('head title').text(); 93 obj.canonical = $('link[rel="canonical"]').attr('href'), 94 obj.stylesheet = $('link[rel="stylesheet"]').attr('href'), 95 /* metaInfo.forEach((v)=>{ 96 const reg = new RegExp(v.prop,'g'); 97 if(content.match(reg)){ 98 obj[v.outName] = $(`meta[${v.name}="${v.prop}"]`).attr("content"); 99 }else{ 100 obj[v.outName] = false; 101 } 102 }) */ 103 r.props = Object.assign({},obj); 104 105 result.push(r); 106 107 obj = null; 108 r = null; 109 //sleep 1秒 110 Utilities.sleep(1000); 111 } catch(e) { 112 // 例外エラー処理 113 console.log('Error:'+e); 114 } 115 } 116 117 // draw cell 118 result.forEach((d,r)=>{ 119 Object.keys(d.props).forEach((k,i)=>{ 120 const row = startCol + r; 121 const col = startRow + i; 122 sheet.getRange(row, col).setValue(d.props[k]); 123 }) 124 }) 125}
試したこと
GS
1obj.stylesheet = $('link[rel="stylesheet"]').attr('href'),
この部分が繰り返し処理できれば良いのだろうと思いますが、
どのように書けば参考にさせていただいたコードにうまく適合するのかがわからなく困っております。
初歩的な質問で申し訳ありませんが、どなたかご教示いただけると幸いです。(JS.GASともに自己流で学習を始めたばかりです。)

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/08/25 07:38
退会済みユーザー
2022/08/25 10:48
2022/08/26 01:36