Amazon Price Tracker Project
BeautifulSoup으로 상품 가격 스크래핑하기
- URL 가져오기
- 요청 시, 일부 헤더를 함께 전달해야 실제 웹사이트 HTML을 반환함
(최소한 요청 헤더에 “User-Agent”와 “Accept-Language”값을 넣어주기) - BeautifulSoup을 사용해서 HTML로 soup객체 만들기 (lxml 파서 사용)
- 상품 가격을 부동 소수점으로 구해 출력 (split()메소드 사용)
respose.content와 BeautifulSoup()의 차이
- response.content : 웹 서버로부터 받은 원시 HTML 데이터(바이트 형태)를 보여줌. 데이터가 파싱되지 않은 상태로, 직접적인 데이터 구조 탐색이나 조작이 어렵다.
- BeautifulSoup : 파싱된 HTML 데이터를 나타낸다. 이 객체를 통해 HTML의 구조를 쉽게 탐색하고, 특정 요소를 찾거나 조작할 수 있음.
- 예를 들어, soup.find(‘h1’)은
<h1>
태그를 찾는 데 사용될 수 있다.
가격이 사전 설정된 가격보다 낮을 때 이메일로 알려주기
- 가격이 100달러 이하로 떨어졌을 때, smtp모듈을 사용해서 이메일 전송
(상품명, 현재 가격, 상품 구매 링크)
Final Code
import requests
import lxml
from bs4 import BeautifulSoup
import smtplib
MY_EMAIL = ""
MY_PASSWORD = ""
url = "https://www.amazon.com/dp/B075CYMYK6?psc=1&ref_=cm_sw_r_cp_ud_ct_FM9M699VKHTT47YD50Q6"
header = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15",
"Accept-Language": "ko-KR,ko;q=0.9"
}
response = requests.get(url, headers=header)
soup = BeautifulSoup(response.content, "lxml")
print(soup.prettify())
price = soup.find(class_="a-offscreen").get_text()
price_without_currency = price.split("$")[1]
price_as_float = float(price_without_currency)
print(price_as_float)
title = soup.find(id="productTitle").get_text().strip()
print(title)
BUY_PRICE = 200
if price_as_float < BUY_PRICE:
message = f"{title} is now {price}"
with smtplib.SMTP("smtp.gmail.com", port=587) as connection:
connection.starttls()
result = connection.login(MY_EMAIL, MY_PASSWORD)
connection.sendmail(
from_addr=MY_EMAIL,
to_addrs=MY_EMAIL,
msg=f"Subject:Amazon Price Alert!\n\n{message}\n{url}".encode("utf-8")
)