こんにちは、しらすです。
Webスクレイピングの勉強がてらAmazonから商品情報を取得してみようと思い、勉強を開始しました。
アマゾンのスクレイピングは禁止??
スクレイピングでまず勉強の題材として選んだのがAmazonでしたが、なんと「アマゾンのスクレイピングは禁止」という文言が。。。。
色々調べてみましたが、結論、法律に抵触するサーバーアタックにならないよう注意すれば個人の勉強で利用する分には問題なさそうです。そもそもWeb上に公開されている情報を人が手打ちで集めるか機械で集めるかの違いのため、大きな問題はない気もします。Amazonスクレイピングと規約については以下をご参照ください。
ASINから各販売者の情報を一括取得する
ASINをもとに、該当商品の販売者の各種情報を一括で取得できるようにしました。
※ASINを複数読み込んだり、複数ページにわたって処理をしたりといったところも今後実施したいと思いますが、ひとまず一つのASINに対して上位10件分を取得できるようにしています。
import urllib.request, urllib.error
from bs4 import BeautifulSoup
import time
import datetime
import pandas as pd
"""""""""""""""""""""""""""""""""
初期値
"""""""""""""""""""""""""""""""""
ASIN_id = B00M7RCXB8
"""""""""""""""""""""""""""""""""
初期化
"""""""""""""""""""""""""""""""""
today = datetime.datetime.now().strftime('%Y.%m.%d')
info = []
"""""""""""""""""""""""""""""""""
指定ページの情報取得
"""""""""""""""""""""""""""""""""
def ama(url):
#各ページをhtml形式で抜き取る
html = urllib.request.urlopen(url)
soup = BeautifulSoup(html, 'lxml')
time.sleep(2)
return soup
"""""""""""""""""""""""""""""""""
Amazonの情報取得(各販売者情報)
"""""""""""""""""""""""""""""""""
def get_info_seller(ele):
info = {
"price" : ele.find("span", class_="a-size-large a-color-price olpOfferPrice a-text-bold").string.strip(),
"condition" : ele.find("span", class_="a-size-medium olpCondition a-text-bold").string.strip(),
"saller" : ele.find("span", class_="a-size-medium a-text-bold")
}
return info
"""""""""""""""""""""""""""""""""
Main
"""""""""""""""""""""""""""""""""
#URLの指定
url = 'https://www.amazon.co.jp/gp/offer-listing/' + ASIN_id + '/' + 'ref=olp_page_' + str(n) +'?ie=UTF8&f_all=true'
#html形式でページ情報を取得
soup = ama(url)
#ページの各販売者部分の情報を取得
for ele_sel in soup.find_all("div", class_="a-row a-spacing-mini olpOffer"):
info_seller = get_info_seller(ele_sel)
info.append(info_seller)
#pandasデータフレーム型に変換(CSV出力用)
df = pd.DataFrame(info)
#CSV形式で出力
df.to_csv('Amazon_' + str(today) + '.csv',encoding='utf-8_sig')
さて、実行はできたのですが、
HTTPError: 503 Service Unavailable
となってしまう場合があります。どうやらスクレイピング対策としてhtmlを取得する際にAmazonにブロックされる様子。
次回、この問題を突破する方法について解説したいと思います。
コメント