web-dev-qa-db-ja.com

IMPORTXML GoogleスプレッドシートAmazonレビュー番号

私はスプレッドシートを作成していますが、そのためには製品のAmazonレビューの数が必要です。レビューが追加されたときにレビューを動的に更新する方法を調べ、IMPORTXMLの式を見つけました。

この特定の例では、「インポートされたxmlコンテンツを解析できません」というエラーが発生し続けるため、シートの情報を取得する方法を見つけることができません。

私の現在の式は=IMPORTXML("http://www. Amazon.com/Optoma-GT1080-1080p-Gaming-Projector/product-reviews/B00M9D4CAK/","//*[@id='cm_cr-product_info']/div/div[1]/div[2]/span")です

(リンクの自動変換を避けるために、「Amazon」の前にスペースが挿入されます)。

これは私が手に入れたい作品です。

this is what i'm trying to get

1
Isaac Brekke

すべてのウェブページがimportXMLでスクレイピングできるわけではありません。考えられるいくつかの問題があります。

  1. ページ上の一部のコンテンツは、importXMLによって実行されないJavaScriptで生成される場合があります。
  2. ページはXMLファイルとして無効である可能性があります。典型的なHTMLページは無効なXMLです(XTHMLページでない限り)。 importXMLのパーサーは状況を整理しようとしますが、XMLに準拠していないコンテンツが多数存在する場合(たとえば、Amazonが提供する大規模なインラインスクリプト)は失敗します。
  3. このサイトは、ボットが特定のコンテンツにアクセスすることを禁止する場合があります。

Amazonでは、2番目と3番目の障害に直面しています。 2番目の問題を回避する方法は、AppsスクリプトからUrlFetchApp.fetch(url).getContentText()を使用することです。これにより、ページのソース全体が取得され、その後、たとえば正規表現を使用して、任意の方法で解析できます。

Amazonのスクレイピングには注意が必要です。実験中に、ページコンテンツの代わりに次のメッセージが表示されることがありました。

Amazonデータへの自動アクセスについては、api-services-support @ Amazon.comにお問い合わせください。

ただし、この製品のレビュー数を取得し、現在のシートのセルA1に挿入するAppsスクリプト関数があります。

function reviewCount() {   // remove space before Amazon on the next line 
  var url = "http://www. Amazon.com/Optoma-GT1080-1080p-Gaming-Projector/product-reviews/B00M9D4CAK/";
  var content = UrlFetchApp.fetch(url).getContentText();
  var match = /totalReviewCount">([0-9, ]+)/.exec(content);
  SpreadsheetApp.getActiveSheet().getRange("A1").setValue(match[1]);
}

私の知る限り、これはまだAmazonのTOSに反する可能性があります。関連: 製品レビューを取得するためのAmazon.com APIはありますか?

1
user79865