AmazonのレビューをスクレイピングしてCSVファイルに書き出してみた「Python+Selenium」
はじめまして、カメ助です。
今回はクラウドワークスなどでスクレイピングの案件をよく見かけるので、実際に挑戦してみました。
スクレイピングをしてみようとしている方の参考になれば幸いです。
今回の記事は、以下の記事の抜粋です。
1:スクレイピングとは?
スクレイピングは、ツール・プログラムなどを使って、ウェブサイトから情報を抽出し、利用しやすいように加工することを指します。
具体的には、「商品の価格調査のため、Amazonの価格情報を取得し、CSV出力する」などがあります。
2:スクレイピングの注意点
スクレイピングする際には3点に注意が必要です。
①:対象のウェブサイトがスクレイピングを禁止していないか
②:サーバーに過度な負荷をかけていないか
③:取得した情報を情報解析以外に使用しないこと
3:スクレイピングで実現したいこと
Amazonに掲載されている商品の全レビューを取得し、その結果をCSVファイルに出力したい。
4:スクレイピング処理の概要
以下の①~③の処理を行っています。
①:Amazonのサイトにアクセスする
②:商品のレビュー情報を全て取得する
③:取得結果をCSVファイルに出力する
5:サンプルコード
Windows環境、Python+Seleniumを使用しています。
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import textwrap
import csv
#windows(chromedriver.exeのパスを設定)
chrome_path = r'C:\Users\デスクトップ\python\selenium_test\chromedriver'
#mac
#chrome_path = 'C:/Users/デスクトップ/python/selenium_test/chromedriver'
# amazonのレビュー情報をseleniumで取得する_引数:amazonの商品URL
def get_amazon_page_info(url):
text = "" # 初期化
options = Options() # オプションを用意
options.add_argument('--incognito') # シークレットモードの設定を付与
# chromedriverのパスとパラメータを設定
driver = webdriver.Chrome(executable_path=chrome_path,options=options)
driver.get(url) # chromeブラウザでurlを開く
driver.implicitly_wait(10) # 指定したドライバの要素が見つかるまでの待ち時間を設定
text = driver.page_source # ページ情報を取得
driver.quit() # chromeブラウザを閉じる
return text # 取得したページ情報を返す
# 全ページ分をリストにする
def get_all_reviews(url):
review_list = [] # 初期化
i = 1 # ループ番号の初期化
while True:
print(i,'page_search') # 処理状況を表示
i += 1 # ループ番号を更新
text = get_amazon_page_info(url) # amazonの商品ページ情報(HTML)を取得する
amazon_bs = BeautifulSoup(text, features='lxml') # HTML情報を解析する
reviews = amazon_bs.select('.review-text') # ページ内の全レビューのテキストを取得
for review in reviews: # 取得したレビュー数分だけ処理を繰り返す
review_list.append(review) # レビュー情報をreview_listに格納
next_page = amazon_bs.select('li.a-last a') # 「次へ」ボタンの遷移先取得
# 次のページが存在する場合
if next_page != []:
# 次のページのURLを生成
next_url = 'https://www.amazon.co.jp/' + next_page[0].attrs['href']
url = next_url # 次のページのURLをセットする
sleep(1) # 最低でも1秒は間隔をあける(サーバへ負担がかからないようにする)
else: # 次のページが存在しない場合は処理を終了
break
return review_list
#インポート時は実行されないように記載
if __name__ == '__main__':
# Amzon商品ページ
url = 'https://www.amazon.co.jp/%E6%89%8B%E6%8C%87%E6%B6%88%E6%AF%92%E5%89%A4%E3%80%91%E3%83%8F%E3%83%B3%E3%83%89%E3%82%B9%E3%82%AD%E3%83%83%E3%82%B7%E3%83%A5EX-%E3%81%A4%E3%81%91%E3%81%8B%E3%81%88%E7%94%A8-800ml-%E8%8A%B1%E7%8E%8B%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%8C%87%E5%AE%9A%E5%8C%BB%E8%96%AC%E9%83%A8%E5%A4%96%E5%93%81/dp/B005RUI15O/'
# URLをレビューページのものに書き換える
review_url = url.replace('dp', 'product-reviews')
# レビュー情報の取得
review_list = get_all_reviews(review_url)
#CSVにレビュー情報の書き出し
with open('data/sample.csv','w') as f:
writer = csv.writer(f, lineterminator='\n')
# 全データを表示
for i in range(len(review_list)):
csvlist=[]
review_text = textwrap.fill(review_list[i].text, 80)
#データ作成
csvlist.append('No.{} : '.format(i+1)) # 便宜上「No.XX」の文字列を作成
csvlist.append(review_text.strip()) # レビューテキストの先頭・末尾の空白文字を除去
# 出力
writer.writerow(csvlist)
# ファイルクローズ
f.close()
6:出力イメージ
※実際のレビューは文字数が多いので一部抜粋しています。
No.1 : ,ポットからお湯を入れて、少し待ってからお茶のティーバッグを入れて、・・・
No.2 : ,あと10度は下がってくれないと飲めない。
No.3 : ,猫舌の人用となっていますが、自分の猫舌度ではそれでもアツアツ。3分・・・
No.4 : ,ケトルでお湯を沸かしてスティックティーを溶かして、こちらのタンブ・・・
7:まとめ
今回は、スクレイピングの簡単な説明と、Amazonの商品レビューをスクレイピングするサンプルコードを紹介しました。
以下の記事で詳細に説明していますので、スクレイピングについて理解を深めたい方は一度読んでいただければと思います。
今回のサンプルコードをベースにすることで実際の案件に対応できかもしれませんので、良かったら参考にしていただけたら幸いです。
次回は、YouTubeの情報をスクレイピングしてみようと思います。
この記事が気に入ったらサポートをしてみませんか?