Amazon Price Tracker Project

BeautifulSoup으로 상품 가격 스크래핑하기

  • URL 가져오기
  • 요청 시, 일부 헤더를 함께 전달해야 실제 웹사이트 HTML을 반환함
    (최소한 요청 헤더에 “User-Agent”와 “Accept-Language”값을 넣어주기)
  • BeautifulSoup을 사용해서 HTML로 soup객체 만들기 (lxml 파서 사용)
  • 상품 가격을 부동 소수점으로 구해 출력 (split()메소드 사용)

브라우저 헤더 확인 사이트


1


respose.content와 BeautifulSoup()의 차이

  • response.content : 웹 서버로부터 받은 원시 HTML 데이터(바이트 형태)를 보여줌. 데이터가 파싱되지 않은 상태로, 직접적인 데이터 구조 탐색이나 조작이 어렵다.
  • BeautifulSoup : 파싱된 HTML 데이터를 나타낸다. 이 객체를 통해 HTML의 구조를 쉽게 탐색하고, 특정 요소를 찾거나 조작할 수 있음.
  • 예를 들어, soup.find(‘h1’)은 <h1> 태그를 찾는 데 사용될 수 있다.



가격이 사전 설정된 가격보다 낮을 때 이메일로 알려주기

  • 가격이 100달러 이하로 떨어졌을 때, smtp모듈을 사용해서 이메일 전송
    (상품명, 현재 가격, 상품 구매 링크)

2


3



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")
        )