【Python】SeleniumでAmazonの商品レビューをスクレイピングした(サンプルコード付き)

こんにちは、カメ助(@kamesuke_blog)です。

最近「スクレイピング」というワードを耳にする機会が増えてきました。

そこで今回はSelenium(セレニウム)を使用したAmazonの商品レビューを「スクレイピング」するプログラムを紹介します。(windows環境)

前半で「スクレイピング」について説明し、後半でサンプルコードを解説します。

カメ助

この記事はこんな人にオススメ
・「スクレイピング」って何?
・「スクレイピング」のサンプルコードがほしい

皆さんがスクレイピングする際の参考になれば幸いです。

目次

スクレイピングとは

スクレイピングは、ツール・プログラムなどを使って、ウェブサイトから情報を抽出し、利用しやすいように加工することを指します。

ウェブスクレイピング・Webデータ抽出とも言います。

具体的には、

特定の商品の販売価格を調査するために、Amazonの販売価格の情報を取得し、CSV出力する

機械学習の学習データを作成するために画像データを取得する

などがあります。

スクレイピングの注意点

「スクレイピング」をする際には注意しましょう

便利なスクレイピングですが、以下の注意点を守らなければ法律違反で逮捕される可能性があります

スクレイピングする際の注意点
  • 対象のウェブサイトがスクレイピングを禁止していないか
  • サーバーに過度な負荷をかけていないか
  • 取得した情報を情報解析以外に使用しないこと

対象のウェブサイトがスクレイピングを禁止しているかは、利用規約や「robots.txt」、HTML内の「robots metaタグ」で確認できます。

Amazonのスクレイピングについて

今回Amazonの商品レビューをスクレイピングしますが、Amazonの利用規約には以下の記載があり、スクレイピングは禁止されています。

データマイニング、ロボットなどのデータ収集・抽出ツールの使用は、一切含まれません。

Amazonの利用規約より抜粋

この利用規約は、Amazonとお客である(ログインしたユーザー)の間での契約になります。

つまり、Amazonにログインした時点で利用規約に同意したことになるため、ログイン状態(Amazonの利用規約に同意)でのスクレイピングは禁止されています。

逆を言えば、未ログイン状態では利用規約に同意していませんので、利用規約は適用されません。

利用規約に同意していないので当然ですがスクレイピングは禁止されていません。

参考:スクレイピング禁止のAmazonからレビューを抜き出す【Python】

簡潔にまとめると

Amazonに未ログインならスクレイピングはOK

ただし、「短時間に大量のリクエストを送信してサーバーに負荷をかける行為」は法律違反にあたる可能性があるので注意が必要です。

スクレイピングのサンプルコード

サンプルコードを紹介します

スクレイピングのサンプルとして、Amazonの商品レビュー情報をCSVファイルに書き出すコードを紹介します。

処理の流れ

サンプルコードの処理は以下の流れで行います。

  1. Amazonのサイトにアクセスする
  2. 商品のレビュー情報を全て取得する
  3. 取得結果をCSVファイルに出力する

サンプルコードの動作確認環境

Windows環境でPython言語とSeleniumのツールを使用しています。

  • OS   : Windows10
  • 言語   :Python
  • ツール  :Selenium (chromedriverを使用)
  • エディタ :VSCode
  • ブラウザ :GoogleChrome

サンプルコード

2021/12/24追記:69行目のコードを変更しました。(open関数の文字エンコードにutf-8を指定)

サンプルコードの詳細については、各行のコメントをご確認ください。

上記サンプルコードはwindows環境用です。

mac環境の方は、以下のようにサンプルを修正してください。

  • 9行目の「chrome_path = r’C:\Users\デスクトップ\python\selenium_test\chromedriver’」をコメントアウト
  • 12行目の「chrome_path = ‘C:/Users/デスクトップ/python/selenium_test/chromedriver’」をアンコメント

ちなみに上記サンプルは、以下の記事を参考にさせていただきました。

参考:Amazonのスクレイピング対策を攻略する【Selenium最強説】

出力ファイル(一部抜粋)

サンプルコードを実行すると以下のようなCSVファイル(sample.csv)が出力されます。

実際の業務では、出力したCSVファイルの内容を分析していきます。

サンプルコードでエラーが発生した場合の対応策

サンプルコード実行時に遭遇したエラーの原因と解決方法についてまとめておきます。

エラー1:bs4.FeatureNotFound

コンソールに表示されるエラー

対処方法

コンソールにて、以下のコマンドを実行することでエラーが解消されます。(BeautifulSoupオブジェクトで使用する”lxml”をインストールします。)

原因

BeautifulSoupオブジェクトでパーサーのオプションをlxmlに指定していますが、環境にlxmlがインストールされていないことが原因です。

エラー2:FileNotFoundError: [Errno 2] No such file or directory

コンソールに表示されるエラー

対処方法

コンソールにて、以下のコマンドを実行し、カレントディレクトリを変更する。

原因

ファイルの読込・書込時に対象のファイルやディレクトリが存在しないことが原因です。
今回の場合は、カレントディレクトリ直下に「data/sample.csv」が存在しないためエラーになっています。

エラー3:UnicodeEncodeError

コンソールに表示されるエラー

対処方法

ソースコードを下記のように変更する。

open関数に文字エンコード 【utf-8】を指定しています。※サンプルコードに反映済み

原因

open関数は文字エンコードが未指定の場合、windows環境ではshift-jisのエンコードで開きます(環境依存のため)。また、python3のプログラム内部では、文字列をutf-8のエンコードで扱っています。


そのため、CSVファイル書き出し時に、文字列データを【utf-8 → shift-jis】に変換しています。 文字列データ に shift-jis に変換できない文字が含まれている場合にエラーが発生します。

参考にさせていただいたページ

まとめ

今回はスクレイピングの説明と、サンプルコードの紹介をしてきました。

スクレイピングを活用することで、効率的に情報収集を行うことが可能になります。そのため、今後より使われる技術ではないかと感じております。

また、スクレイピングは非常に便利ですが、使い方を間違えると法律違反に該当する可能性もありますので注意しましょう。スクレイピングの注意点は以下の通りです。

スクレイピングする際の注意点
  • 対象のウェブサイトが「スクレイピング」を禁止していないか
  • サーバーに過度な負荷をかけていないか
  • 取得した情報を情報解析以外に使用しないこと

また、今回のサンプルコードを参考にしていただければ幸いです。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

大阪でITエンジニアしています。(9年目に突入)
趣味でウェブサイトに関することをいろいろと勉強しています。

勉強した内容やプログラミングに関する情報を中心に役立つ情報を発信するべく日々ブログを更新しています。

3度の飯よりも「柿の種」をこよなく愛する関西人。

コメント

コメント一覧 (14件)

  • 最近Amazon Web scraping的なキーワードでこのブログに到達して以来スクレイピング系で色々参考にさせていただいています!
    ド文系の素人ですがスクレイピングでRPAしたく、こういった記事はとても参考になります!

    • コメントありがとうございます。
      初めてコメントをいただき嬉しかったです!
      また役に立つ記事が書けるように頑張りますね!!

  • 突然のコメント欄に質問することを、お許しください。
    ”カメ助”さんのコードで、スクレピングを勉強している者です。


    # 次のページが存在する場合
    if next_page != []:
    # 次のページのURLを生成
    next_url = 'https://www.amazon.co.jp/' + next_page[0].attrs['href']
    url = next_url # 次のページのURLをセットする

    sleep(1) # 最低でも1秒は間隔をあける(サーバへ負担がかからないようにする)
    else: # 次のページが存在しない場合は処理を終了
    break

    return review_list


    実行した所、下記のエラーが表示されました。

    ”File “”, line 9
    break
    ^
    SyntaxError: ‘break’ outside loop”

    解決するため、エラー文を翻訳して、Googleで検索等をしてみましたが…自信の理解レベルでは訳分からなくなりましての質問となりました。
    ご教授、お願いします。

    追伸:環境は、Windows10,ジュピターラボです。

    • コメントありがとうございます。

      >>実行した所、下記のエラーが表示されました。
      >>”File “”, line 9
      >>break
      >>^
      >>SyntaxError: ‘break’ outside loop”

      →エラーメッセージの内容より、『break』がループ処理の外側に定義されていることが原因である可能性があります。
       
       <確認ポイント>
        記事のソースコードでは、33行目の「while True:」でループ処理を開始し、53行目の「break」でループ処理を終了しています。
        下記補足より、『break』がwhile文よりもインデント(字下げ)をしているか確認してください。
         ※ソースコード上のインデントは、タブとスペースを混在しないように注意してください。
         (例)タブを使用する場合は、インデントは全てタブで統一してください。
        
      ■補足
       pythonでは、インデント(字下げ)が意味を持ちますので
       下記のパターンAとパターンBでは意味が異なります。
       
      ●パターンA ※正しい——
      while True:
      break
      —————–

      ●パターンB ※エラーになる——
      while True:
      break
      —————–

      ご参考にしてください。

      また、スクレイピングを勉強される中で「こんなサンプルが欲しい」などありますか?
      今後の記事を書く際の参考にさせていただきたいと考えています。

  • 夜分にも拘らずのご教授、ありがとうございます。
    未だ、着手しておりませんが、先ずはお礼の一報と思いまして。

  • ご助言を参考にした所、何とかかんとか…コードは通りました。
    ありがとうございます。
    その後、残りのコードを実行した所、以下のエラーが出ました。

    File “”, line 21
    csvlist.append(‘No.{} : ‘.format(i+1))  # 便宜上「No.XX」の文字列を作成
    ^
    SyntaxError: invalid character in identifier

    やはり、前回と同じく翻訳をして検索をして…色々試してみましたが…。
    例えば、csvlist.append(‘No.{} : ‘.format(i+1))を削除して、直接打ち込んでみたりしましたが…ダメ。

    又、No.{} :で、{}と:の間にスペースがあるので、スペースをなくしてみたり…ダメ。
    又、検索したサイトで、文字列が識別子として有効かどうかは文字列のメソッドisidentifier()で確認可能とあったので、
    print(‘No.{}’.isidentifier())
    False
    と、出ましたが、その後の対処方法が分かりません。

    ご教授、お願い申し上げます

  • 何とか…解決出来ました。
    が、新たな問題が発生しました。
    自身でもう少し、取り組んでみます。

    • 何とか解決できたようで良かったです。

      エラーがあった際は、以下をチェックしてみてください。
       ■全角で入力している文字列が存在しないかチェックする
       ■全角空白が混じっていないかチェックする

  • 度々申し訳ございません。
    カメ助さんのコードを実行した結果、
    1 page_search
    2 page_search
    3 page_search
    4 page_search
    5 page_search
    6 page_search
    7 page_search
    8 page_search
    9 page_search
    10 page_search
    —————————————————————————
    FileNotFoundError Traceback (most recent call last)
    in
    67
    68 #CSVにレビュー情報の書き出し
    —> 69 with open(‘data/sample.csv’,’w’) as f:
    70 writer = csv.writer(f, lineterminator=’\n’)
    71

    FileNotFoundError: [Errno 2] No such file or directory: ‘data/sample.csv’
    と、なりました。
    私のジュピターラボのデスクトップには、CSVファイルは見当たりません。
    又、
    import os
    os.getcwd()
    見ましたが、’data/sample.csv’は、ありません。
    何時でもいいので、ご助言お願い致します。

  • こんにちは。参考させていただきcsvファイルに書き込んだところ、
    テキストが文字化けしてしまいました。
    これはAmazon側に対策を取られてしまった結果なのか、
    現状サンプルコードで正常にスクレイピング可能かうかがいたく思いました。

    • 連絡ありがとうございます。
      <確認結果>
      こちらで確認したところ、CSVファイルの中身は文字化けしていないことを確認しました。

      <原因>
      本サンプルでは、70行目の箇所で文字コードに「utf-8」を指定してCSVファイルを書き出しています。
      そのため、「utf-8」以外の文字コードでCSVファイルを開いたために文字化けが起こったと考えられます。

      <解決策>
      作成したCSVを【サクラエディタ】などのテキストエディタで文字コード「utf-8」で開いていただければ文字化けすることなく内容確認できるかと思います。
      一度試していただけますでしょうか。

  • はじめまして。
    こちらのコードを参考に勉強させていただいております。
    csvファイルは問題なく書き込みできたのですが、レビューが10件までしか書き込みされていませんでした。
    自分のほうでもいろいろいじっては見たのですがわからずじまいで…
    解決方法をご教授いただけないでしょうか。

    • 連絡ありがとうございます。
      こちらで確認しました。

      <原因>
      Amazon側でスクレイピング対策を入れていることが原因のようです。
      具体的には、seleniumでAmazonにアクセスした際の次ページのレビューリンクが「Amazonのサインインのリンク」になっているため、
      次ページのレビューページに遷移できず、先頭ページ分である10レビューしか取得できない状態になっています。

      <対応策>
      seleniumで次ページのレビューのURLを直接指定する形に変更すれば、次ページ以降のレビュー情報も取得できるかと思います。
      ※実施は自己責任でお願いいたします。

コメントする

目次