見出し画像

python:副業でよくあるAmazonデータの収集コード

ランサーズやクラウドワークス等でたまに見る、Amazonで特定の商品を検索して、その商品の情報をCSVで取りたいという依頼。今回は、pythonを使って、スクレイピングしてみましょう。


おおまかな流れは以下になります。

①Amazonで特定のワードを検索

②商品一覧から、商品名、値段、URLを取得

③CSVへ書き出す


全体コード

from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd

word = input("検索したいキーワードを入力してください:")
df_main = pd.DataFrame(columns=['タイトル','値段','URL'])
url = "https://www.amazon.co.jp/s?k="+ word + "&page=1&__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&qid=1589380472&ref=sr_pg_1"
html = urlopen(url)
bs = BeautifulSoup(html, "html.parser")
last_page = int(bs.findAll("li", {"class":"a-disabled"})[1].get_text())

for post in range(last_page):
   url = "https://www.amazon.co.jp/s?k="+ word + "&page="+ str(post) + "&__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&qid=1589380472&ref=sr_pg_" + str(post)
   html = urlopen(url)
   bs = BeautifulSoup(html, "html.parser")
   item_box = bs.findAll("div", {"class":"a-section a-spacing-medium"})
   num = len(item_box)
   for i in range(num):
       try:
           title = item_box[i].find("span", {"class":"a-size-base-plus a-color-base a-text-normal"}).get_text()
           price = item_box[i].find("span", {"class":"a-price-whole"}).get_text()
           page_url = item_box[i].find("h2", {"class":"a-size-mini a-spacing-none a-color-base s-line-clamp-4"})
           page_url = page_url.find("a", {"class":"a-link-normal a-text-normal"})
           page_url = "http://amazon.jp" + page_url.get("href")
       except:
           pass
       data  = pd.Series( [ title, price, page_url ], index=df_main.columns )
       df_main = df_main.append( data, ignore_index=True )
       
df_main.to_csv("test.csv", encoding="utf-8_sig")


①Amazonで特定のワードを検索

from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd

word = input("検索したいキーワードを入力してください:")
df_main = pd.DataFrame(columns=['タイトル','値段','URL'])
url = "https://www.amazon.co.jp/s?k="+ word + "&page=1&__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&qid=1589380472&ref=sr_pg_1"
html = urlopen(url)
bs = BeautifulSoup(html, "html.parser")
last_page = int(bs.findAll("li", {"class":"a-disabled"})[1].get_text())


②商品一覧から、商品名、値段、URLを取得

for post in range(last_page):
   url = "https://www.amazon.co.jp/s?k="+ word + "&page="+ str(post) + "&__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&qid=1589380472&ref=sr_pg_" + str(post)
   html = urlopen(url)
   bs = BeautifulSoup(html, "html.parser")
   item_box = bs.findAll("div", {"class":"a-section a-spacing-medium"})
   num = len(item_box)
   for i in range(num):
       try:
           title = item_box[i].find("span", {"class":"a-size-base-plus a-color-base a-text-normal"}).get_text()
           price = item_box[i].find("span", {"class":"a-price-whole"}).get_text()
           page_url = item_box[i].find("h2", {"class":"a-size-mini a-spacing-none a-color-base s-line-clamp-4"})
           page_url = page_url.find("a", {"class":"a-link-normal a-text-normal"})
           page_url = "http://amazon.jp" + page_url.get("href")
       except:
           pass
       data  = pd.Series( [ title, price, page_url ], index=df_main.columns )
       df_main = df_main.append( data, ignore_index=True )


③CSVへ書き出す

df_main.to_csv("test.csv", encoding="utf-8_sig")


定期実行を行う

def job():
   #ここにメインの処理を書く 

 #10分毎にjobを実行 
schedule.every(10).minutes.do(job)

 #毎時間ごとにjobを実行 
schedule.every().hour.do(job)

 #AM10 :30jobを実行
schedule.every().day.at("10:30").do(job)

 #月曜日にjobを実行 
schedule.every().monday.do(job)

 #水曜日の13 :15jobを実行
schedule.every().wednesday.at("13:15").do(job)


実行
while True:
   schedule.run_pending()
   time.sleep(1)


作成したファイルをgmailでメール送信

import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email import encoders


# 以下にGmailの設定を書き込む★ --- (*1)
gmail_account = "送信元のメールアドレスを入力"
gmail_password = "送信元のパスワードを入力"


# メールの送信先 --- (*2)
mail_to = "送信先のメールアドレスを入力"


# 添付ファイルのパス(ZIPファイルで指定) --- (*3)
file_path = r"ファイルがあるpathを入力"


# メールデータ(MIME)の作成 --- (*4)
subject = "件名"
body = "本文"
encoding = 'utf-8'
msg = MIMEMultipart()
msg["Subject"] = Header(subject, encoding)
msg["To"] = mail_to
msg["From"] = gmail_account
msg.attach(MIMEText(body, 'plain', encoding))


# 添付ファイル(CSV)をメールに追加 --- (*5)
attach = MIMEBase('application','csv')
with open(file_path, "br") as f:
   attach.set_payload(f.read())
encoders.encode_base64(attach)
attach.add_header('Content-Disposition', 'attachment',
   filename='attachment.csv')
msg.attach(attach)


# Gmailに接続 --- (*6)
server = smtplib.SMTP_SSL("smtp.gmail.com", 465,
context=ssl.create_default_context())
server.login(gmail_account, gmail_password)
server.send_message(msg) # メールの送信
server.quit()
print("ok.")


終わりに

こんな記事を書いたのは良いものの、規約によると、AmazonAPIを使わないといけないみたいですね。あくまでスクレイピングコードの参考として、使用してください。








この記事が気に入ったらサポートをしてみませんか?