【コード公開】pythonでスクレイピング(amazon)

【コード公開】pythonでスクレイピング(amazon)

pythonでデータ解析をする際にスクレイピングが多く使用されます。
実際のコードを載せますので、実際にスクレイピングを実行してみてください。

使用するライブラリ

Requests

HTTP通信をする際のライブラリであるRequestsがあります。
下記のようなコードで簡単にサイトから情報を取得することができます。

import requests
 r = requests.get("https://news.yahoo.co.jp/")
 print(r.text)

Beautiful Soup

スクレイピングでは、取得したサイト情報から必要な項目のみを抜き出す必要があります。
その際に使用するのがBeautiful Soupです。

Beautiful Soupを使用することで、サイト内の指定したクラスやタグを抜き出すことができます。

https://qiita.com/Chanmoro/items/db51658b073acddea4ac

Django

Djangoは、直接スクレイピングには関係ありませんが、今回は、Web上で入力されたキーワードをもとにamazonでの検索情報をスクレイピングするため、Djangoというフレームワークを使用します。

あのインスタグラムもDjangoを使用して、構築されたサイトで、pythonのフレームワークとして有名です。

https://developer.mozilla.org/ja/docs/Learn/Server-side/Django/Introduction

コード解説

入出力関数

#フォーム画面の入力および出力
def search_form(request):
    params = {"search_text" : "", "title_price_list" : [] , "title_list" : [] , "price_list" : [] , "count" : 0,"form" : None}
    if request.method == "POST":
        title_price_list = get_search(request.POST["search_text"])
        form = SearchForm(request.POST)
        params["search_text"] = request.POST["search_text"]
        params["form"] = form
        params["title_price_list"] = title_price_list
    else:
        params["form"] = SearchForm()
    return render(request, "searchForms.html", params)

Djangoのフレームワークを使用して、Web画面からamazonで検索するキーワードを入力します。

検索結果を出力するために取得した内容をパラメータとして画面に渡します。

キーワード検索関数

#amazonでキーワード検索し、商品名と価格を取得
def get_search(search_text):
    search_url = 'https://www.amazon.co.jp/s?k=' + search_text + '&__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&ref=nb_sb_noss_2'
    url_list = get_url(search_url)

    title_price_list = []
    for item in url_list:
        title,price = get_title_price(item)
        title_price_list.append(title + ' : ' + price)
    return title_price_list

amazonでキーワードで検索した結果から、商品名と価格を取得するための中間関数です。

商品URL取得関数

#amazonの検索結果から商品URLを取得
def get_url(search_url):
    url_list = []
    res = requests.get(search_url)
    soup = BeautifulSoup(res.text, features="lxml")
    topstories = soup.find_all('a', class_='a-link-normal a-text-normal')
    res.close
    for item in topstories:
        url_list.append('https://www.amazon.co.jp' + item.get("href"))
    return url_list

amazonの検索結果から各商品の詳細URL一覧を取得します。

商品名、価格取得関数

#商品ページから商品名と価格を取得
def get_title_price(page_url):
    try:
        selected_html_title = []
        selected_html_price = []
        while not (selected_html_title != [] and selected_html_price != []):
            res = requests.get(page_url)
            soup = BeautifulSoup(res.text, features="lxml")
            
            selected_html_title = soup.select('#productTitle')
            selected_html_price = soup.select('.a-span12 span.a-color-price')
            if not selected_html_price:
                selected_html_price = soup.select('.a-color-base span.a-color-price')
            if not selected_html_price:
                selected_html_price = soup.select('.a-color-secondary span.a-color-secondary')
            
            res.close
            time.sleep(30)
        title = selected_html_title[0].text
        title = title.replace(' ', '')
        title = title.replace('\n', '')

        pattern = r'\d*,?\d*,?\d*\d'
        regex = re.compile(pattern)
        matches = re.findall(regex, selected_html_price[0].text)
        price = matches[0].replace(',', '')
    except:
        title = '-1'
        price = '-1'
    return title,price

amazonの各商品ページから商品名および価格を取得します。

P.S

pythonの勉強について、下記の書籍がおすすめです。


本当の初心者向けではないですが、初級者の方が、中級、それ以上の実際に仕事としてpythonを使用する方にとっては、最適な書籍ですので、一度、読んでみてください。

pythonについて、学ぶべき理由について記事を書きましたので、こちらも読んでみてください。