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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

1826閲覧

GASでスクレイピングしているのですが、特定のサイトの特定の情報の抜き出しに苦戦しています。

ryu01212008

総合スコア26

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2019/03/18 08:52

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) } }

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

URLFETCHAPPで取得したものをファイルに書いて確認したところ

○【抽出可能】画像のURL

×【抽出不可能】画像の横の『ホーム&キッチン』のテキスト
×【抽出不可能】画像の横の『参考価格』のテキストの横の『918』の数字
×【抽出不可能】画像の横の『JAN:』のテキストの横の『4973307393778』の数字
○【抽出可能】画像の下のdl要素の中の新品の行の最安値の『1415』の数字
×【抽出不可能】画像の下のdl要素の中の新品の行のコスト計算の『845』の数字
○【抽出可能】画像の下のdl要素の中のカート価格の行の最安値の『1480』の数字
×【抽出不可能】画像の下のdl要素の中のカート価格の行のコスト計算の『845』の数字
○【抽出可能】画像の下のdl要素の中の新品の行の出品者数の『6』の数字
×【抽出不可能】画像の下のdl要素の中の新品の行の12ヵ月の販売数の『30個』のテキスト

のうち

×【抽出不可能】画像の横の『ホーム&キッチン』のテキスト

×【抽出不可能】画像の横の『参考価格』のテキストの横の『918』の数字
×【抽出不可能】画像の横の『JAN:』のテキストの横の『4973307393778』の数字

のところはデータにありました。

javascript

1function q180017() { 2 var values = []; 3 const url = "https://mnrate.com/item/aid/B076KF452D"; 4 // 項目1 ← 抽出できているパターン 5 const rootHtml = UrlFetchApp.fetch(url).getContentText(); 6 //SpreadsheetApp.getActiveSheet().getRange(12,1).setValue(rootHtml); 7 var hogeHoge = searchSheet(rootHtml, 'value="','"', 'id="history_data_image_path"',5000) 8 values.push(hogeHoge || '該当データ無し'); 9 10 // 項目2 ← 抽出できていないパターン(htmlに書き出されている情報が拾えていません) 11 var hugaHuga = searchSheet(rootHtml, '"data_category">','</', 5000) 12 values.push(hugaHuga || '該当データ無し') 13 var sankoukakaku = searchSheet(rootHtml, 'class="_reference_price_color">', '</span>', 5000); 14 values.push(sankoukakaku.trim() || '該当データ無し') 15 var jan = searchSheet(rootHtml, 'JAN</span>: <span class="clip_bd" data-clipboard-text="', '">', 5000); 16 values.push(jan || '該当データ無し') 17 18 Logger.log(values); 19 // 項目3 ← 抽出できているパターン 20// var salesRank = searchBy(rootHtml, '"sales_rank":{"point_number":1,"sum":', ',"', ',"30":{"sales_rank":', 5000) 21// values.push(salesRank || '該当データ無し') 22// Logger.log(values); 23}

このようにして抽出可能でした。

一方845,30個のあたりは、HTMLを見てもなさげだったので、後から(動的に、ajaxとかで)取っている可能性もあると思います。
その場合、urlfetchでは取れないので、あきらめるしかないです。

投稿2019/03/18 09:22

編集2019/03/25 03:19
papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryu01212008

2019/03/18 15:12

papinianusさん いつも回答ありがとうございます。 まず、845,30個のところは諦めることにします。 項目2のところの引数の書き方をどのようにすれば良いか悩んでいます。 項目1に関してはスクリプト上にあったものを指定できたのですが、項目2の場合、 htmlの要素を指定してもエラーになってしまうので、どのようにするのが良いでしょうか?
papinianus

2019/03/25 03:20

引数の書き方ではなかったです(前回もここ読み違えた気がしてきました)。 取れるコードを書いたのでご参考まで。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問