Amazonがスクレイピング対策をしてきました。
 しかし、もう攻略しました。
 攻略と言っても、そんなに大袈裟なモノではありません。
本記事の内容
- Amazonがスクレイピング対策をしてきた事実
 - Amazonのスクレイピング対策への攻略法
 - 攻略法の実例【ASINを取得する】
 - 攻略法の実例【レビューを取得する】
 - Amazonのスクレイピング対策を攻略するのまとめ
 
まずは、Amazonがスクレイピング対策をしてきた事実から説明します。
Amazonがスクレイピング対策をしてきた事実
次の画面をご覧ください。

ロボット対策のヤツです。
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秒間隔に耐えられないサーバーなんて、今時ありません。
昔ならいざ知らず、この令和の時代にそんなサーバーはヤバイです。
以上をまとめます。
スクレイピングは、何も悪くありません。
 短時間での大量アクセスが、悪いのです。
  
  
  
  



