oneshotlife-pythonのブログ

Pythonを好んで使っているプログラマです。Pythonこそが最強のプログラミング言語だと思っています。Pythonは使いやすいです。Pythonは書きやすいです。Pythonは読みやすいです。Pythonはパワフルです。Pythonは一貫性があります。Pythonが好きです。

PythonとrequestsとBeautifulSoupでAmazonの中古品情報一覧を取得 #Python #WebScraping #せどり

説明不足な部分があったらコメント下さい。返信及び記事修正します。

過去エントリ

過去に以下エントリを書きました。
oneshotlife-python.hatenablog.com

Amazon Product Advertising APIへの不満

ただ、APIを使って取得出来ない情報がある!!!
例えば、中古品情報一覧。

f:id:oneshotlife_tom:20161113122508p:plain
これ、スクレイピングで取得したいよね!せどりにも使えるかも。

bottlenoseの問題ではなく、Amazon Product Advertising APIの仕様の問題。

WebScrapingの定石

まず、APIが無いかどうかは事前にチェックしなければならない。
スクレイピングは、サイトに負荷がかかる可能性が高いので、なるべく避けたい。
APIを使って取得出来る情報に対して、WebScrapingを行うのはナンセンス。
大抵の場合、WebScrapingを行うよりもAPIを使った方が、実装が容易で、メンテナンスも容易。

APIで取得出来ない情報がある場合の定石

ここは、WebScrapingの出番だ。
これにもやり方は二つある。

  • ライブラリを探す(CPAN,gem,PYPI,etc)
  • 自作する

本当は、ライブラリを探せれば一番。
wikipedia:車輪の再発明をやっても良いことは少ない。

今回いろいろ調べてみたのだが、少なくともPyPiにはまともなライブラリが無い。

ということで自作してみた。

IDLEでガリガリ

私は、スクリプトを自作する際には、毎回IDLEでガリガリやってから、
スクリプトに落とし込む。
oneshotlife-python.hatenablog.com

対象URL

ベースURLは

https://www.amazon.co.jp/gp/offer-listing/

その後ろに、スラッシュ区切りでASIN(書籍の場合はISBN)を入れてやればいいようだ。

https://www.amazon.co.jp/gp/offer-listing/4873117380/

対象のデータを格納しているタグを見つける

a-row a-spacing-mini olpOffer

IDLEでガリガリやったコード

>>> import requests
>>> from bs4 import BeautifulSoup
>>> uri = "https://www.amazon.co.jp/gp/offer-listing/4873117380/"
>>> ret = requests.get(uri)
>>> soup = BeautifulSoup(ret.content,"lxml")
>>> soup.find('div', {'class':'a-row a-spacing-mini olpOffer'})

結果は、長いので省略するが、ちゃんと取れてるっぽい。

価格情報は以下で取得出来る。

>>> print soup.find('div', {'class':'a-row a-spacing-mini olpOffer'}).find('div', {'class':'a-column a-span2 olpPriceColumn'}).find('span', {'class':'a-size-large a-color-price olpOfferPrice a-text-bold'}).text
            ¥ 3,392        

この要領で順次取得していく。
この辺で、ソースコードを綺麗にしつつ纏める。

サンプルコード

import requests
from bs4 import BeautifulSoup

def get_amazon_offer_listing(asin):
    for i in range(0,10): #取り敢えず10ページを制限とする
        uri = "https://www.amazon.co.jp/gp/offer-listing/" + asin + '/?startIndex=' + str(i*10)
        ret = requests.get(uri)
        if ret.status_code == 200:
            soup = BeautifulSoup(ret.content,"lxml")
            details = soup.findAll('div', {'class':'a-row a-spacing-mini olpOffer'})
            counter  = 0
            for detail in details:
                try:
                    price = detail.find('div', {'class':'a-column a-span2 olpPriceColumn'}).find('span', {'class':'a-size-large a-color-price olpOfferPrice a-text-bold'}).text.strip().replace(u"\uffe5 ","").replace(",","")
                except:
                    price = "No Data"
                try:
                    condition = detail.find('div', {'class':'a-section a-spacing-small'}).text.replace("\n","").replace(" ","")
                except:
                    condition =  "No Data"
                try:
                    comments = detail.find('div', {'class':'comments'}).text.strip().replace("\n","")[:100] + "..."
                except:
                    comments = "No Data"
                try:
                    seller =  detail.find('div', {'class':'a-column a-span2 olpSellerColumn'}).find('span', {'class':'a-size-medium a-text-bold'}).text.strip()
                except:
                    seller = "Nodata"
                counter +=1 
                print  "|",price, "|",condition, "|",seller, "|",comments, "|"
            if counter !=10:
                #次のデータは無いため処理終了
                break
            else:
                pass
            
if __name__ == "__main__":
    get_amazon_offer_listing("4873117380")

実行結果

3392 中古品-非常に良い (株)バリューブックス 365日毎日発送しております。 ◆◆◆カバーに若干の使用感がありますが、きれいな状態です。迅速・丁寧な発送を心がけております。【毎日発送】...
3650 中古品-非常に良い スタビラウス 新品に近い非常に綺麗な状態です。 書き込み等はございません。 クリスタルパック(OPP袋)にて梱包しております。 アマゾンからの発送になります。...
3937 中古品-良い 古通販・買取ならエコマケ 中古品ですので、多少の傷み・小口ヤケがある場合がございますがご容赦くださいませ。その他の状態につきましては、Amazonコンディションガイドラインに準拠いたします。...
3996 新品 Nodata No Data
5088 中古品-非常に良い Bookstore MONACO(ブックストアモナコ 書店で購入後未読。書店までの擦れ等はご容赦願います。...
5420 中古品-ほぼ新品 いなかのお店 新品未使用品です。 3営業日以内に緩衝シートで梱包の上クロネコDM便・クリックポスト等で発送致します。 当商品は在庫僅少に伴うプレミア価格での販売となりますので予めご了承ください。 また万一在庫切れが...
5475 中古品-ほぼ新品 SelectShop SOME 【未読未開封新品】 です。   ◆丁寧な包装など、親身な対応を心がけています、何でもご相談ください。...
5500 中古品-ほぼ新品 ☆★林檎書房★☆ ☆★新品未読商品★☆丁寧・防水梱包で当日~3日以内の発送、1週間以内のお届けを原則としております。在庫希少により高額ですが、ご理解・納得の上でご注文をお願いします。 在庫切れの際はメールでお知らせ後、...
5540 中古品-ほぼ新品 天保堂【防水対策!お問い合わせ大歓迎!!公安委員会621100132007号】 ■新品美品です。■希少人気書籍のため、定価越えしております。ご了承下さい。■原則2営業日以内に発送いたします。■発送は、ご注文確認後、再検品し問題がなければクリスタルパックにて、納品書とともに梱包し、...
5594 中古品-ほぼ新品 せぶん 一度書店に並んでいた新品の本を保管しております。表紙、中身共に綺麗な状態の本です。梱包材+封筒にてしっかり梱包した上、発送致します。併売のため、万一の売り切れの際には版元に在庫を確認後、発送についてご...
5641 中古品-ほぼ新品 poplar-book 未読品をご注文後3営業日以内にビニール・緩衝材で梱包し発送いたします。万一、品切れのさいは、速やかにご注文を取り消させて頂きます。稀少本の為、定価より高価になっております。ご確認ください。 ...
5860 中古品-ほぼ新品 メディアフロント ほぼ新品の使用感の少ない商品です。2から8営業日で商品を発送致します。...
5900 中古品-ほぼ新品 ☆蒼風堂☆年中無休。複数同時購入で2点目以降100円返金 新品未読の商品ですので非常に綺麗です。迅速丁寧に対応いたします。International shipping available....
6000 新品 ベビーボックス No Data
6000 中古品-ほぼ新品 ウィステリアインベストメントセールス 未読の新品です。...
6793 中古品-ほぼ新品 トリニティブックス東京 商品コメント欄を必ずご確認下さい ★領収書必要な場合は注文時にご連絡下さい 新品未読品を2~4日以内に東京都より発送、安心梱包・誠実対応でお届け。在庫切れのときは速やかにご連絡いたします。定価(¥3,996)より高額ですが、ご検討よろしくお願いします。 ...
7992 中古品-ほぼ新品 デイジー&マーガレット 新品。商品状態が説明と違う場合は、返品・返金を承ります。...