GASを使ってスクレイピングを実行したいです
以下のサイトの情報を抽出したいと考えています。
https://mnrate.com/item/aid/B076KF452D
このサイトから抽出したい情報を下記に示します。
また、現段階で抽出できている情報とできていない情報を明記します。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
○【抽出可能】画像のURL
×【抽出不可能】画像の横の『ホーム&キッチン』のテキスト
×【抽出不可能】画像の横の『参考価格』のテキストの横の『918』の数字
×【抽出不可能】画像の横の『JAN:』のテキストの横の『4973307393778』の数字
○【抽出可能】画像の下のdl要素の中の新品の行の最安値の『1415』の数字
×【抽出不可能】画像の下のdl要素の中の新品の行のコスト計算の『845』の数字
○【抽出可能】画像の下のdl要素の中のカート価格の行の最安値の『1480』の数字
×【抽出不可能】画像の下のdl要素の中のカート価格の行のコスト計算の『845』の数字
○【抽出可能】画像の下のdl要素の中の新品の行の出品者数の『6』の数字
×【抽出不可能】画像の下のdl要素の中の新品の行の12ヵ月の販売数の『30個』のテキスト
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
※上記の数字は3/18の投稿時の数字なので変化する可能性がありますのでご了承ください。
不足情報がありましたら追加で記載しますので教えてください。
よろしくお願いいたします。
抽出できている情報の特徴
head要素の中にある <script src="/js/lib/nProgress.js"></script> の下にあるスクリプトの中に書き出されている情報は抽出できています。
抽出できていない情報の特徴
htmlのテキストとして書き出されている情報を抽出することができません。
ソースコード
function searchSheet (targets, startText, endText, searchStartText, searchLength, searchRepeat) { // 検索開始文字列があった場合のみ if (searchStartText) { var index = targets.indexOf(searchStartText) for (var c = 0; searchRepeat && c < searchRepeat; c++) { index = targets.indexOf(searchStartText, index + 1) } if (index === -1) { Logger.log("searchStartText not found") return null } // 指定文字数取得して検索対象を更新 targets = targets.substring(index + searchStartText.length, searchLength ? index + searchStartText.length + searchLength : target.length) } var startIndex = startText !== null ? targets.indexOf(startText) + startText.length : 0 var endIndex = endText !== null ? targets.indexOf(endText, startIndex) : targets.length if ((startText === null || startIndex !== (startText.length - 1)) && endIndex !== -1) { return target.substring(startIndex, endIndex) } else { return null } } var SEARCH_COL_INDEX = 1 var SEARCH_START_LOW = 2 var SEARCH_LOW_COUNT = 100 function search1 () { var book = SpreadsheetApp.getActiveSpreadsheet() var sheetData = book.getSheetByName('○○サーチ') var currentRowIndex = 2 // keyを元にURLを生成して、それぞれのページから情報を拾ってきます。 var headers = [['key', '項目1', '項目2', '項目3']] sheetData.getRange(1, 1, 1, headers[0].length).setValues(headers) // シートに挿入する値 var values = [] // 1次元配列として取得 (A2 ~ A(SEARCH_LOWS)) var keys = Array.prototype.concat.apply([], sheetData.getRange(SEARCH_START_LOW, SEARCH_COL_INDEX, SEARCH_LOW_COUNT, SEARCH_COL_INDEX).getValues()) for (var ki = 0; ki < keys.length; ki++) { var key = keys[ki] if (!key) { break } values[ki] = [] // getHtmlは問題なく動いているため記載を省きます。必要であれば掲載いたします。 var rootHtml = getHtml('https://mnrate.com/item/aid/' + key) // 項目1 ← 抽出できているパターン var hogeHoge = searchSheet(rootHtml, 'value="','"', 'id="history_data_image_path"',5000) values[ki].push(hogeHoge || '該当データ無し') // 項目2 ← 抽出できていないパターン(htmlに書き出されている情報が拾えていません) var hugaHuga = searchSheet(rootHtml, '"data_category">','</', 5000) values[ki].push(hugaHuga || '該当データ無し') // 項目3 ← 抽出できているパターン var salesRank = searchBy(rootHtml, '"sales_rank":{"point_number":1,"sum":', ',"', ',"30":{"sales_rank":', 5000) values[ki].push(salesRank || '該当データ無し') // 2秒~5秒スリープ if (ki !== (keys.length - 1)) { Utilities.sleep(2000 + Math.floor(Math.random() * (2999)) + 1) } currentRowIndex++ } // 一括でインサート if (values && values[0]) { sheetData.getRange(SEARCH_START_LOW, SEARCH_COL_INDEX + 1, values.length, values[0].length).setValues(values) } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/18 15:12
2019/03/25 03:20