読者です 読者をやめる 読者になる 読者になる

oneshotlife-pythonのブログ

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

PythonでAmazonの本・Kindle本のカテゴリーを取得する #Python #WebScraping

WebScraping requests BeautifulSoup

最近、バカの一つ覚えみたいにスクレイピングをやっております。。。
requestsとBeautifulSoupを使うだけでもいろいろ出来てしまう。

Amazonの本・Kindle本のカテゴリーを取得したい

最終的には、書籍や電子書籍のカテゴリーごとに毎日ランキングを取得したい。その前段階で、どんなカテゴリーがあるのかを把握したい。

対象ページ

Amazon.co.jp 売れ筋ランキング: 本 の中で最も人気のある商品です
Amazon CAPTCHA
上記ページの左のメニューにある一覧からカテゴリー名とURLを取得しようと思う。ちなみに、そのカテゴリーの下に更に階層があってサブカテゴリはあるが、一階層しか取得しないものとする。「Kindleストア > Kindle本 > 文学・評論 > 小説・文芸 > 日本の小説・文芸」のランキング一覧を取得するなんてことも出来ないことは無いけど、そこまで細分化されたランキングを作成したところで面白くないだろうから、やめて置く。Scrapyを使えば、出来ることは出来ると思うが。

分析の仕方

Google Chromeで上記の対象のページを開く

取得対象をドラックして右クリックし検証を選択

f:id:oneshotlife_tom:20161109150835p:plain

対象のタグ(class,idなど)に当たりをつける

tableレイアウトを使っているなど、今時ではあり得ない。もしあるとしたら、やっかいだ。大抵は、divで囲まれている。
f:id:oneshotlife_tom:20161109151458p:plain
↑赤字を付けたあたりが怪しいよね?

<div id="zg_left_col2">
  ...
  <li>...</li>
  <li>...</li>
  <li>...</li>
  <li>...</li>
  ...
</div>

↑こんな感じになっているのではないかと推測してみる。そして、俺の大好きなIDLEを使ってガリガリソースコードを書いて動かしながら検証してみる。もちろん、推測が外れることもあろうが、外れたらまたやり直せばいいだけ。

IDLEでガリガリやってみる

Windows10でPythonとIDLEを使って開発する #Python - oneshotlife-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 =======

すべてのカテゴリ https://www.amazon.co.jp/gp/bestsellers
文学・評論 https://www.amazon.co.jp/gp/bestsellers/books/466284
人文・思想 https://www.amazon.co.jp/gp/bestsellers/books/571582
社会・政治 https://www.amazon.co.jp/gp/bestsellers/books/571584
ノンフィクション https://www.amazon.co.jp/gp/bestsellers/books/492152
歴史・地理 https://www.amazon.co.jp/gp/bestsellers/books/466286
ビジネス・経済 https://www.amazon.co.jp/gp/bestsellers/books/466282
投資・金融・会社経営 https://www.amazon.co.jp/gp/bestsellers/books/492054
科学・テクノロジー https://www.amazon.co.jp/gp/bestsellers/books/466290
医学・薬学・看護学・歯科学 https://www.amazon.co.jp/gp/bestsellers/books/492166
コンピュータ・IT https://www.amazon.co.jp/gp/bestsellers/books/466298
アート・建築・デザイン https://www.amazon.co.jp/gp/bestsellers/books/466294
趣味・実用 https://www.amazon.co.jp/gp/bestsellers/books/466292
スポーツ・アウトドア https://www.amazon.co.jp/gp/bestsellers/books/2400471051
資格・検定 https://www.amazon.co.jp/gp/bestsellers/books/492228
暮らし・健康・子育て https://www.amazon.co.jp/gp/bestsellers/books/466304
旅行ガイド https://www.amazon.co.jp/gp/bestsellers/books/492090
語学・辞事典・年鑑 https://www.amazon.co.jp/gp/bestsellers/books/466302
教育・学参・受験 https://www.amazon.co.jp/gp/bestsellers/books/3148931
絵本・児童書 https://www.amazon.co.jp/gp/bestsellers/books/466306
コミック・ラノベ・BL https://www.amazon.co.jp/gp/bestsellers/books/2501045051
タレント写真集 https://www.amazon.co.jp/gp/bestsellers/books/500592
エンターテイメント https://www.amazon.co.jp/gp/bestsellers/books/466296
ゲーム攻略本 https://www.amazon.co.jp/gp/bestsellers/books/492266
文庫 https://www.amazon.co.jp/gp/bestsellers/books/2189048051
新書 https://www.amazon.co.jp/gp/bestsellers/books/2189049051
ノベルス https://www.amazon.co.jp/gp/bestsellers/books/2189050051
雑誌 https://www.amazon.co.jp/gp/bestsellers/books/13384021
楽譜・スコア・音楽書 https://www.amazon.co.jp/gp/bestsellers/books/746102
ポスター https://www.amazon.co.jp/gp/bestsellers/books/13383771
アダルト https://www.amazon.co.jp/gp/bestsellers/books/10667101
ライトアダルト https://www.amazon.co.jp/gp/bestsellers/books/2457910051
カレンダー https://www.amazon.co.jp/gp/bestsellers/books/2748677051
すべてのカテゴリ https://www.amazon.co.jp/gp/bestsellers
Kindleストア https://www.amazon.co.jp/gp/bestsellers/digital-text
文学・評論 https://www.amazon.co.jp/gp/bestsellers/digital-text/2292699051
人文・思想 https://www.amazon.co.jp/gp/bestsellers/digital-text/2292095051
社会・政治 https://www.amazon.co.jp/gp/bestsellers/digital-text/2293149051
ノンフィクション https://www.amazon.co.jp/gp/bestsellers/digital-text/2291791051
歴史・地理 https://www.amazon.co.jp/gp/bestsellers/digital-text/2293076051
ビジネス・経済 https://www.amazon.co.jp/gp/bestsellers/digital-text/2291905051
投資・金融・会社経営 https://www.amazon.co.jp/gp/bestsellers/digital-text/2292576051
科学・テクノロジー https://www.amazon.co.jp/gp/bestsellers/digital-text/2293263051
医学・薬学 https://www.amazon.co.jp/gp/bestsellers/digital-text/2292340051
コンピュータ・IT https://www.amazon.co.jp/gp/bestsellers/digital-text/2291657051
アート・建築・デザイン https://www.amazon.co.jp/gp/bestsellers/digital-text/2291481051
趣味・実用 https://www.amazon.co.jp/gp/bestsellers/digital-text/2292479051
スポーツ・アウトドア https://www.amazon.co.jp/gp/bestsellers/digital-text/2292480051
資格・検定・就職 https://www.amazon.co.jp/gp/bestsellers/digital-text/2293536051
暮らし・健康・子育て https://www.amazon.co.jp/gp/bestsellers/digital-text/2292803051
旅行ガイド・マップ https://www.amazon.co.jp/gp/bestsellers/digital-text/2292799051
語学・辞事典・年鑑 https://www.amazon.co.jp/gp/bestsellers/digital-text/2293396051
教育・学参・受験 https://www.amazon.co.jp/gp/bestsellers/digital-text/2292600051
絵本・児童書 https://www.amazon.co.jp/gp/bestsellers/digital-text/2293363051
コミック https://www.amazon.co.jp/gp/bestsellers/digital-text/2293143051
ライトノベル https://www.amazon.co.jp/gp/bestsellers/digital-text/2410280051
ボーイズラブ https://www.amazon.co.jp/gp/bestsellers/digital-text/2450063051
ティーンズラブ https://www.amazon.co.jp/gp/bestsellers/digital-text/3432431051
タレント写真集 https://www.amazon.co.jp/gp/bestsellers/digital-text/2291790051
エンターテイメント https://www.amazon.co.jp/gp/bestsellers/digital-text/2291568051
楽譜・スコア・音楽書 https://www.amazon.co.jp/gp/bestsellers/digital-text/2293031051
雑誌 https://www.amazon.co.jp/gp/bestsellers/digital-text/2275257051
アダルト https://www.amazon.co.jp/gp/bestsellers/digital-text/2291476051

スクレイピングについてもっと知りたい方は

PythonによるWebスクレイピング

PythonによるWebスクレイピング

oneshotlife-python.hatenablog.com