【Python】seleniumでAmazonの商品データをスクレイピングする

Python

作成する物

Amazonの商品URLをExcelに箇条書きし、そのURLを基に商品名と価格をスクレイピングしてExcelに出力するアプリケーションを作成します。

①ExcelにURLを記載する(手動)

②アプリケーションを実行

③Excelに商品名と価格を出力

④グラフ表示

Pythonの環境構築がまだの方は以下の記事を参考に環境構築してください。

ソースコード

プロジェクト毎ダウンロードする場合は以下のGithubからどうぞ。

※スクレイピングではHTMLのタグや属性からページ情報を取得しています。
Amazonの商品ページ構成に変更があった場合、掲載しているソースコードをそのまま実行してもエラーとなる可能性があります。いつ変更されるかもわからないため、随時対応は行いません。
また、使用しているライブラリに破壊的な変更があった場合もエラーとなる可能性があります。

使用するライブラリ

このアプリケーションでは以下のライブラリを使用します。

pipからインストールをお願いします。

・openpyxl
Excel操作ライブラリです。

・selenium
Webブラウザ操作ライブラリです。

・webdriver_manager
seleniumで使用するwebdriverを自動インストールするライブラリです。

・BeautifulSoup4
HTMLパーサー。

プロジェクトの構成

AmazonScraping

├─data
scraping.xlsx(入出力するExcelファイル)

├─src
│ │ main.py(アプリケーションメインプログラム)
│ │
│ └─modules
│  ├─amazonscraping
│  │ │  amazon_scraping.py(自作モジュール)
│  │ │  init.py
│  │ │
│  │ └─pycache
│  │   amazon_scraping.cpython-310.pyc
│  │   init.cpython-310.pyc
│  │
│  ├─excel
│  │ │  excel.py(自作モジュール)
│  │ │  init.py
│  │ │
│  │ └─pycache
│  │   excel.cpython-310.pyc
│  │   init.cpython-310.pyc
│  │
│  ├─utils
│  │ │  utils.py(自作モジュール)
│  │ │  init.py
│  │ │
│  │ └─pycache
│  │   utils.cpython-310.pyc
│  │   init.cpython-310.pyc
│  │
│  └─pycache
│    amazon_scraping.cpython-310.pyc
│    init.cpython-310.pyc

└─pycache
  amazon_scraping.cpython-310.pyc
  socks.cpython-310.pyc
  sockshandler.cpython-310.pyc

解説

ExcelからURLを読込む

Excel関連の処理をまとめたクラスExcelを定義したモジュール。(excel.py)

Excel読込み処理(main.py)

パスを指定してExcelを開き、urlシートのA列の1行目から1000行目までをリストに取得します。

1行目から1000行目というのはこれだけあれば足りるだろうという適当な数字なのであまり気にしないでください。

openpyxlでセルの値を取得するには、ワークシートオブジェクトのcellメソッドを使用するか、インデクサー([‘A1’]等)を使用します。

seleniumでURLをスクレイピングする

アマゾンのスクレイピング処理をまとめたクラスAmazonScrapingを定義したモジュール。(amazon_scraping.py)

Amazonスクレイピング処理(main.py)

AmazonScrapingクラスのコンストラクタでseleniumを初期化しています。

商品名はspanにproductTitleというidが振られているので、beautifulsoupでidを指定して取得します。

価格はクラス名が固定ではなく、商品によって2パターンあるようです。(セール商品と通常で違うっぽい?)

とりあえず上記2パターンに対応した価格取得メソッドを作成します。

a-price-wholeクラスのspanが取得できなかった場合、a-offscreenクラスのspanを取得します。

取得した商品名と価格を出力するために、連想配列に設定しておきます。

Excelに商品名と価格を出力する

クソコードで申し訳ないですが、ここではExcelにスクレイピング日時、商品名、価格を出力しています。
Excel1行目B列以降が商品名行、2行目のA列はスクレイピング日時、2行目B列以降に価格を出力しています。
面倒な事をせずに時間、商品名、価格を1行毎に出力すればいいのでは?と思われるかもしれませんが、Excelのグラフを作成する時に楽なんです….!

グラフを表示する

グラフはExcelのグラフを使用しています。

openpyxlでもグラフを作成できるようですが、スクレイピング練習用のアプリなので今回は楽をしちゃいました。

範囲を選択してリボンの挿入→線グラフクリック

適当にスタイルを変更して完成です!

後はmain.pyをタスクスケジューラで毎日実行するように設定すれば日次の価格推移を解析できます。

タスクスケジューラをコマンドプロンプトで設定する方法を下記で解説しているので、参考にどうぞ。

まとめ

ごりへい自身Ptyhonでスクレイピングをするのが初めてなので、説明がものすごく雑になってしまいましたが、Pythonでのスクレイピングの雰囲気を感じてもらえたらと思います。

注意点として、同一ページ(ドメイン)に対して短時間に連続してスクレイピングを行うとDOS攻撃と判断されかねないので、スクレイピングの間隔は少なくとも数秒は空けるようにしましょう。

Pythonプログラミング
凡人プログラマーのブログ

コメント

  1. happ1 より:

    コメント失礼いたします。
    こちらダウンロードしてなにも変更せずに、動かしてみたのですが下記エラーとなり使用できませんでした。
    何か原因等お分かりになりますでしょうか。
    Traceback (most recent call last):
    File “y:\Python\Program\TEST\AmazonScraping-main\AmazonScraping-main\src\modules\amazonscraping\amazon_scraping.py”, line 23, in __del__ zonscraping\amazon_scraping.py”, line 23, in __del__
    if self.driver is not None:
    AttributeError: ‘AmazonScraping’ object has no attribute ‘driver’

    • ごりへい ごりへい より:

      コメントありがとうございます!
      こちらで確認してみたところ、該当のエラーは発生しませんでした。

      別件でAmazonページのHTML構成が変わっているようでして、セレクタの指定に修正必要でしたのでGitHubに修正をプッシュしました。
      再度GitHubから最新を取得して確認いただけますでしょうか。
      ただこちらの問題は連絡いただいた内容とは関係ないような気もしますので、エラーは解決しないかもしれません。