PythonでAmazonの本・Kindle本のカテゴリーを取得する
最近、バカの一つ覚えみたいにスクレイピングをやっております。。。
requestsとBeautifulSoupを使うだけでもいろいろ出来てしまう。
対象ページ
Amazon.co.jp 売れ筋ランキング: 本 の中で最も人気のある商品です
Amazon.co.jp 売れ筋ランキング: Kindle本 の中で最も人気のある商品です
上記ページの左のメニューにある一覧からカテゴリー名とURLを取得しようと思う。ちなみに、そのカテゴリーの下に更に階層があってサブカテゴリはあるが、一階層しか取得しないものとする。「Kindleストア > Kindle本 > 文学・評論 > 小説・文芸 > 日本の小説・文芸」のランキング一覧を取得するなんてことも出来ないことは無いけど、そこまで細分化されたランキングを作成したところで面白くないだろうから、やめて置く。Scrapyを使えば、出来ることは出来ると思うが。
分析の仕方
Google Chromeで上記の対象のページを開く
取得対象をドラックして右クリックし検証を選択
対象のタグ(class,idなど)に当たりをつける
tableレイアウトを使っているなど、今時ではあり得ない。もしあるとしたら、やっかいだ。大抵は、divで囲まれている。
↑赤字を付けたあたりが怪しいよね?
<div id="zg_left_col2"> ... <li>...</li> <li>...</li> <li>...</li> <li>...</li> ... </div>
↑こんな感じになっているのではないかと推測してみる。そして、俺の大好きなIDLEを使ってガリガリソースコードを書いて動かしながら検証してみる。もちろん、推測が外れることもあろうが、外れたらまたやり直せばいいだけ。
IDLEでガリガリやってみる
Windows10でPythonとIDLEを使って開発する #Python - 武器商人@Pythonのブログも読んでね!
>>> import requests >>> from bs4 import BeautifulSoup >>> uri = "https://www.amazon.co.jp/gp/bestsellers/books/" >>> ret = requests.get(uri) >>> soup = BeautifulSoup(ret.content,"lxml")
この辺まではテンプレだと思っていただいて結構。スクリプト(ファイル)を書くのではなく、shellで叩きながらやっていったほうが上手く行くことが多い。プログラミングは覚えて書くのではなく、書きながら覚える。
で、結局以下のコードに落ち着く。
>>> print soup.find('div', {'id':'zg_left_col2'}) <div id="zg_left_col2"> <ul id="zg_browseRoot"> <li class="zg_browseUp"> ‹ <a href="https://www.amazon.co.jp/gp/bestsellers">すべてのカテゴリ</a> </li> <ul> <li> <span class="zg_selected"> 本</span> </li> <ul> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/466284">文学・評論</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/571582">人文・思想</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/571584">社会・政治</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/492152">ノンフィクション</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/466286">歴史・地理</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/466282">ビジネス・経済</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/492054">投資・金融・会社経営</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/466290">科学・テクノロジー</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/492166">医学・薬学・看護学・歯科学</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/466298">コンピュータ・IT</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/466294">アート・建築・デザイン</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/466292">趣味・実用</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/2400471051">スポーツ・アウトドア</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/492228">資格・検定</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/466304">暮らし・健康・子育て</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/492090">旅行ガイド</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/466302">語学・辞事典・年鑑</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/3148931">教育・学参・受験</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/466306">絵本・児童書</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/2501045051">コミック・ラノベ・BL</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/500592">タレント写真集</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/466296">エンターテイメント</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/492266">ゲーム攻略本</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/2189048051">文庫</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/2189049051">新書</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/2189050051">ノベルス</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/13384021">雑誌</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/746102">楽譜・スコア・音楽書</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/13383771">ポスター</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/10667101">アダルト</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/2457910051">ライトアダルト</a></li> <li><a href="https://www.amazon.co.jp/gp/bestsellers/books/2748677051">カレンダー</a></li> </ul> </ul> </ul> <div class="zg_displayAd"> </div> </div> >>>
推測が正しいということがわかる。
次は、この中からliタグのリストを抽出して、for文で回していく。
この辺から、スクリプト化していくと楽なような気がする。for文やif文などが入ると、shellで叩くのは非常に面倒臭いので。
サンプルコード
import requests from bs4 import BeautifulSoup def get_amazon_subcategory(uri): ret = requests.get(uri) soup = BeautifulSoup(ret.content,"lxml") for link in soup.find('div', {'id':'zg_left_col2'}).findAll('a'): print "|",link.text,"|", link.get("href"),"|" if __name__ == "__main__": get_amazon_subcategory("https://www.amazon.co.jp/gp/bestsellers/books/") get_amazon_subcategory("https://www.amazon.co.jp/gp/bestsellers/digital-text/2275256051/")
実行結果
Python 2.7.12 |Continuum Analytics, Inc.| (default, Jun 29 2016, 11:42:13) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>>
======= RESTART: C:\Users\oneshot\Desktop\py\get_amazon_subcategory.py =======
スクレイピングについてもっと知りたい方は
- 作者: Ryan Mitchell,嶋田健志,黒川利明
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/03/18
- メディア: 大型本
- この商品を含むブログ (2件) を見る