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

Amazonのスクレイピング対策を攻略する【Selenium最強説】 プログラミング

Amazonがスクレイピング対策をしてきました。
しかし、もう攻略しました。
攻略と言っても、そんなに大袈裟なモノではありません。

本記事の内容

  • Amazonがスクレイピング対策をしてきた事実
  • Amazonのスクレイピング対策への攻略法
  • 攻略法の実例【ASINを取得する】
  • 攻略法の実例【レビューを取得する】
  • Amazonのスクレイピング対策を攻略するのまとめ

まずは、Amazonがスクレイピング対策をしてきた事実から説明します。

Amazonがスクレイピング対策をしてきた事実

次の画面をご覧ください。

Amazon CAPTCHA

ロボット対策のヤツです。
Google検索では、よく見ます。

でも、Amazonでは初めて見ました。
ただ、実際にブラウザで見たわけではありません。

PythonでAmazonのページをスクレイピングした際に出てきたページです。
もっと正確に言えば、プログラムが取得したhtmlソースとなります。
そのhtmlを再現して、ブラウザで確認したモノが上の画面です。

このページのタイトルは「Amazon CAPTCHA」となっています。
あと、htmlソース上に以下のコメントがあります。

<!--
        To discuss automated access to Amazon data please contact api-services-support@amazon.com.
        For information about migrating to our APIs refer to our Marketplace APIs at https://developer.amazonservices.jp/ref=rm_c_sv, or our Product Advertising API at https://affiliate.amazon.co.jp/gp/advertising/api/detail/main.html/ref=rm_c_ac for advertising use cases.
-->

ざっくり言うと、「APIを利用しろ」と言うことですね。
でも、プログラムによるアクセスを強く否定するメッセージではありません。
「please」とあるようにお願いしています。

利用規約に同意(ログイン)していない以上、そうそう強くは言えません。
いくら天下のAmazonと言えども。
このあたりの解釈については、次の記事にまとめています。

なお、Amazonがスクレイピング対策をしてきた正確な日時はわかりません。
少なくとも以下の記事を作成する際には、まだ対策はされていませんでした。

つまり、2020年7月6日時点では、まだ対策されていませんでした。
ここで言うスクレイピング対策とは、次のコードが動かなくなったことの原因を言います。

requests.get(url)

PythonのRequestsライブラリを利用しています。
2020年7月6日までは、これでAmazonのページを取得できていました。

しかし、現在(2020年7月14日)は上記コードでは取得できません。
取得できたのは、「Amazon CAPTCHA」のページです。

よって、7月6日から7月14日の間でスクレイピング対策をしてきたと言えます。
以上が、Amazonがスクレイピング対策をしてきた事実です。

では、次以降でこのスクレイピング対策を攻略しましょう。

Amazonのスクレイピング対策への攻略法

これは、簡単です。
Seleniumを利用するだけです。
Seleniumに関しては、次の記事で解説しています。

Seleniumを使えば、どんなページでもスクレイピング可能だと思います。
これを禁止にすれば、ブラウザでアクセスできないことになりますからね。

Seleniumを使って、Amazonのスクレイピング対策を攻略する方向性は決まりました。
では、具体的に攻略していきましょう。

攻略法の実例【ASINを取得する】

商品ページからASINを取得します。
次の記事では、取得したASINをもとに対象サイトをスクレイピングしています。

もちろん、上の記事内のコードも動きません。
理由は、以下でページを取得しているからです。

requests.get(url)

それを動くようにします。
次の関数を追加します。

# ASIN取得2
def get_asin_from_amazon_2(url):
    
    asin = ""
    # ヘッドレスモードでブラウザを起動
    options = Options()
    options.add_argument('--headless')
    
    # ブラウザーを起動
    driver = webdriver.Chrome("chromedriver.exeのパス", options=options)
    driver.get(url)
    driver.implicitly_wait(10)  # 見つからないときは、10秒まで待つ
    
    elem_base = driver.find_element_by_id('ASIN')
    if elem_base:
        asin = elem_base.get_attribute("value")
    else:
        print("NG")
        
    # ブラウザ停止
    driver.quit()
    
    return asin

そして、新たに追加した関数を利用します。

修正前のコード

asin = get_asin_from_amazon(url)

修正後のコード

asin = get_asin_from_amazon_2(url)

この対応により、上記2つの記事内のコードが動くようになりました。
ただ、速度は落ちますね。

Amazon側でいろいろとチェックしているのでしょう。
その分だけ、ページ取得の速度が落ちています。
しかし、これは仕方がないでしょう。

攻略法の実例【レビューを取得する】

こちらも同じく関数を追加します。
Selenium関連のモジュールの読み込みを記述します。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# Amazonページ取得
def get_page_from_amazon(url):
    
    text = ""
    # ヘッドレスモードでブラウザを起動
    options = Options()
    options.add_argument('--headless')
    
    # ブラウザーを起動
    driver = webdriver.Chrome("chromedriver.exeのパス", options=options)
    driver.get(url)
    driver.implicitly_wait(10)  # 見つからないときは、10秒まで待つ
    
    text = driver.page_source
        
    # ブラウザ停止
    driver.quit()
    
    return text

同じように、新たに追加した関数を利用します。

修正前のコード

        res = requests.get(url)
        amazon_soup = bs4.BeautifulSoup(res.text, features='lxml')

修正後のコード

        text = get_page_from_amazon(url)
        amazon_soup = bs4.BeautifulSoup(text, features='lxml')

これで修正前と同じように、レビューを取得できるようになりました。
こっちの修正において、Seleniumはページのソースを取得するために用いています。

スクレイピングは、今まで通り「Beautiful Soup」で行います。
ケースバイケースで使い分けです。

Amazonのスクレイピング対策を攻略するのまとめ

おそらく、これからもAmazonはスクレイピングの対策をしてくるでしょう。
ただ、個人的にはムダな抵抗だと思います。

ブラウザでページを見れる以上は、プログラムでも同じように見れるはずです。
そして、それはSeleniumを使えば簡単に実現できます。

私自身は、スクレイピング自体は何も悪いと思いません。
悪いのは、サーバーへの大量アクセスです。

ここでは、公開されている情報についてのスクレイピングに言及してます。
非公開情報へのスクレイピングは、ダメです。

そもそも、非公開情報へアクセスするにはログインしないといけません。
ログインする(アカウントを作成する)時点で、利用規約に同意しています。

おそらく利用規約には、スクレイピングは禁止事項にあるでしょう。
だから、非公開情報のスクレイピングはNGと言えます。

話を大量アクセスに戻しましょう。
大量アクセスの定義ですよね。

人間がアクセスできる間隔なら、それは問題なしと認識しています。
速い人なら、1秒に1ページはアクセスできるでしょう。
よって、1秒の間隔を設ければ、セーフだと思います。

1秒間隔に耐えられないサーバーなんて、今時ありません。
昔ならいざ知らず、この令和の時代にそんなサーバーはヤバイです。

以上をまとめます。

スクレイピングは、何も悪くありません。
短時間での大量アクセスが、悪いのです。

タイトルとURLをコピーしました