Pythonでサクラチェッカーをスクレイピングする【Amazon】

Pythonでサクラチェッカーをスクレイピングする【Amazon】 プログラミング

サクラチェッカーを利用していますか?
便利ですよね。

最近のAmazonは、正直信用できません。
だから、サクラチェッカーは必須です。

ただ、複数の商品を比較するときには不便です。
同一画面内で複数の商品を比較検討できる機能があれば、最高です。
そのため、そのツールを自分用に作成します。

そこで、サクラチェッカーをスクレイピングする必要があります。
この記事では、そのための方法を解説しています。

本記事の内容

  • サクラチェッカーから欲しい情報
  • サクラチェッカーのスクレイピング仕様
  • サクラチェッカーからスクレイピングでデータを取得する
  • 「Pythonでサクラチェッカーをスクレイピングする」のまとめ

それでは、まずは要件定義から始めます。

サクラチェッカーから欲しい情報

Amazonで販売している商品の「真の評価」が、取得したい情報となります。
それが、サクラチェッカーには存在することが前提となります。

存在すると言っても、結局は各サイトの開発者の恣意的な判断が入るのは避けられません。
しかし、今のAmazonにある評価よりは信用できます。

今回、記事内で扱う商品は以下です。
https://www.amazon.co.jp/gp/product/B089QP4Y1K/

Amazonカスタマーレビュー

評価の確認日は、2020年7月5日となります。
84人が評価して、5の評価です。

これは、何もしらない人は即買いしてしまうかもしれません。
それぐらいの高評価です。

サクラチェッカーのスクレイピング仕様

詳細ページURL

商品に対する評価は、次のページで取得できます。
https://sakura-checker.jp/search/B089QP4Y1K/

「B089QP4Y1K」は、ASINです。
ASINは、「Amazon Standard Identification Number」の略となります。
よって、ASINを変更すれば、該当商品の評価を得られるということです。

ASINの一覧があれば、それをもとにサクラチェッカーにアクセスできますね。
ASINを用意できない場合は、どうするのか?

Amazonにおける商品ページから取得します。
商品URLから抜き出すという方法があります。
しかし、必ずASINが商品URLに存在しているわけではありません。

よって、商品URLをもとに実際の商品ページにアクセスすることでASINを取得します。
これは、Amzonへのスクレイピングとなります。

「Amazonへのスクレイピングは禁止なはずでは?」と思っている方は、次の記事をご覧ください。

結論を言うと、Amazonへのスクレイピングは禁止ではありません。
ただし、それは未ログインの状況であればです。

以上をまとめます。

ASINありそのまま利用する
ASINなし商品URLのページからスクレイピングでASINを抜き出す

取得できたASINをもとに次のURLを作成します。
https://sakura-checker.jp/search/取得したASIN/

取得するデータ

独自の評価

サクラチェッカーの評価

「2.80」は、サクラチェッカーが下した評価です。
Amazonの5という評価と全く違いますね。

この独自の評価が、サクラチェッカーで最重要のデータとなります。
ただし、これは簡単にスクレイピングできません。

「Developer Tools」で確認した独自評価の箇所のタグ。
動的に生成されたタグも含む。

        <div class="item-info">
            <div class="item-review-box">
                
<div class="item-review-after">
    <p class="item-logo"><img src="/images/logo_s.png" alt="サクラチェッカー"></p>
    <p class="item-rating"><span>2.80</span>/5</p>
    <p class="item-num"><span class="boldtxt">84件</span>のレビュー</p>
</div>
    <div class="item-review-level">
        <p class="item-rv-lv item-rv-lv01"><img src="/images/rv_level04.png" alt=""></p>
        <p class="item-rv-score">Amazonより
かなり低いスコア</p>
    </div>

            </div>
        </div>

「ページのソースを表示」で確認した独自評価の箇所のタグ。
静的に生成されたタグのみ。

        <div class="item-info">
            <div class="item-review-box">
                <div id="sakurareview" class="content">
                    <div class="loader"></div>
                </div>
            </div>
        </div>

両者を比較すれば、一目瞭然ですね。
動的に生成したタグを埋め込んでいます。

このことより、普通にスクレイピングはできません。
このような動的コンテンツに対応するには、Seleniumの出番です。

PythonでSeleniumを操作する場合は、次の記事を参考にしてください。

よって、サクラチェッカーはSeleniumを用いてスクレイピングします。
クラス名をもとに取得すれば、イケそうなページ構成です。

「.item-rating」は複数存在します。
そのため、一つだけ存在する「.mainBlock」で対象を絞り込みます。
その絞り込んだ要素内の「.item-rating」のテキストを抽出します。

サクラ度

サクラチェッカーのサクラ度

サクラの含まれている比率です。
80%も含まれていると推測しているのですね。

「.sakura-num」は一つだけしか存在しません。
簡単ですね。

サクラ度の詳細分析

サクラチェッカーのサクラ度詳細分析

個人的には、まだ利用用途は決まっていません。
でも、折角なので取得しておきましょう。

画面内に2つ存在します。
独自の評価と同じように、「.mainBlock」で要素を絞り込みましょう。

その要素内で「.circlecustom」を取得すれば、6個の要素が取得できます。

サクラチェッカーからスクレイピングでデータを取得する

必要なライブラリ・モジュールのインストール

pip install requests
pip install beautifulsoup4

Seleniumに関しては、次の記事を参考にしてインストールしてください。

検証(サンプル)コード

エラーチェックは、厳しくしていません。
必要なら、適宜対応してください。

ただし、このサンプルコードを利用する場合は、アクセス先には負荷を与えないように注意してください。
アクセスの間隔としては、1秒間以上は空けるべきでしょう。
人間がブラウザを用いて実際にアクセスするのと同じ間隔なら、全く問題はありません。

結局、スクレイピングという技術はブラウザ操作の自動化(コピー含め)に過ぎません。
そのため、スクレイピング自体は何も問題ではありません。
問題なのは、短時間に大量のアクセスを行うことなのです。

import requests
import traceback
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36'
}

# ASIN取得
def get_asin_from_amazon(url):
    
    asin = ""
    
    try:
        res = requests.get(url, headers=headers)
        soup = BeautifulSoup(res.content, features='lxml')
        
        div_base = soup.find(class_="column col2")
        asin = div_base.find(class_="value").text
    except:
        print(res)
        traceback.print_exc()        
    
    return asin

# サクラ度分析の値取得
def get_detail_value(elem):
    
    value = elem.find_element_by_tag_name("div").text
    value = value.replace("%", "", 1)
    value = value.strip()
    
    return value

# サクラチェッカーをスクレイピング
def get_sakurachecker(asin):
    
    url = "https://sakura-checker.jp/search/" + asin + "/"
    
    # ヘッドレスモードでブラウザを起動
    options = Options()
    options.add_argument('--headless')
    
    # ブラウザーを起動
    driver = webdriver.Chrome("chromedriver.exeのパス", options=options)
    driver.get(url)
    driver.implicitly_wait(10)  # 見つからないときは、10秒まで待つ
    
    # 独自の評価
    rating = ""
    try:
        elem_base = driver.find_element_by_class_name("mainBlock")
        elem_rating = elem_base.find_element_by_class_name('item-rating')
        rating = elem_rating.text
        rating = rating.replace("/5", "", 1)
    except:
        traceback.print_exc()     
    
    # サクラ度
    try:
        elem_sakura_num = driver.find_element_by_class_name("sakura-num")
        sakura_num = elem_sakura_num.text
        sakura_num = sakura_num.replace("%", "", 1)
    except:
        traceback.print_exc()   
    
    # サクラ度の詳細分析
    try:
        elem_base = driver.find_element_by_class_name("mainBlock")
        elem_circle = elem_base.find_elements_by_class_name('circlecustom')
      
        price_product = get_detail_value(elem_circle[0])
        shop_area = get_detail_value(elem_circle[1])
        shop_review = get_detail_value(elem_circle[2])
        review_distribution = get_detail_value(elem_circle[3])
        review_date = get_detail_value(elem_circle[4])
        review_reviewer = get_detail_value(elem_circle[5])
    except:
        traceback.print_exc()    
    
    # ブラウザ停止
    driver.quit()
    
    print("独自評価:" + rating)
    print("サクラ度:" + sakura_num)
    print("価格・製品:" + price_product)
    print("ショップ情報・地域:" + shop_area)
    print("ショップレビュー:" + shop_review)
    print("レビュー分布:" + review_distribution)
    print("レビュー日付:" + review_date)
    print("レビュー&amp;レビュアー:" + review_reviewer)
    
if __name__ == '__main__':
    url = 'https://www.amazon.co.jp/Bluetooth-7%E8%89%B2LED%E3%83%A9%E3%82%A4%E3%83%88%E3%80%91-%E3%83%88%E3%83%AA%E3%83%97%E3%83%AB%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AE%E3%83%9E%E3%82%A6%E3%82%B9%E3%80%90BT5-2-bluetooth-3DPI%E3%83%A2%E3%83%BC%E3%83%89/dp/B089QNXPDY'
    
    # 実際にアクセスしてASIN取得
    asin = get_asin_from_amazon(url)
    
    # サクラチェッカーをスクレイピング
    get_sakurachecker(asin)

【2020年7月14日追記】
現在このコードは動きません。
Amazonがスクレイピング対策をしてきました。
次の記事でその対策の攻略方法を解説しています。

「chromedriver.exeのパス」に関しては、参考記事をご覧ください。
この検証コードを実行すると、以下の結果となります。

独自評価:2.80
サクラ度:80
価格・製品:95
ショップ情報・地域:35
ショップレビュー:35
レビュー分布:0
レビュー日付:0
レビュー&amp;レビュアー:65

「サクラチェッカーのスクレイピング仕様」で確認した値と一致していますね。

Seleniumを利用するのがポイントとなります。
Seleniumを利用しないと、動的コンテンツの値をスクレイピングするのは難しいです。

「Pythonでサクラチェッカーをスクレイピングする」のまとめ

Pythonでサクラチェッカーをスクレイピングする方法を説明してきました。
どうでしたでしょうか?

準備さえすれば、比較的簡単にスクレイピングできることがわかったと思います。
ここで言う準備は、SeleniumをPythonから操作できるようにすることですね。

サクラチェッカーの攻略に続いて、レビュー探偵も攻略していく予定です。
サクラチェッカーよりも簡単だと想定しています。

興味があれば、また本サイトへお越しください。
また、Twitterをフォローしてもらえれば、記事投稿時に気付きやすいと思います。

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