웹 스크래핑 및 smtplib

JOOYEUN SEO·2024년 10월 3일

100 Days of Python

목록 보기
47/76
post-thumbnail

🗂️ Day47 프로젝트: 아마존 가격 추적기

아마존에서 관심 있는 제품이 설정한 가격 이하로 떨어지면 이메일로 알리기

1. BeautifulSoup로 상품 가격 스크래핑

🔍 유의 사항

  • 아마존에서 가격을 추적하고 싶은 상품의 url 사용
  • lxml 파서를 사용해야 동작
  • 아마존에서 HTML 페이지 요청 시 일부 헤더를 함께 전달해야 실제 웹사이트 HTML값을 반환
    • https://myhttpheader.com : 사용자의 브라우저 헤더 확인
    • 헤더에 "User-Agent", "Accept-Language" 값은 꼭 넣기
  • 상품 가격을 부동 소수점 수로 구해서 출력하기

⌨️ main.py

import requests
from bs4 import BeautifulSoup
import lxml

AMAZON_URL = "https://www.amazon.com/Aeropress-Clear-Coffee-Press-bitterness/dp/B0C3KDC3FJ/?_encoding=UTF8&pd_rd_w=jAf2Q&content-id=amzn1.sym.0e739659-7c9d-4d82-868c-90015618ffcc&pf_rd_p=0e739659-7c9d-4d82-868c-90015618ffcc&pf_rd_r=JPF0B5X1M7759S2ZZV83&pd_rd_wg=6hyiv&pd_rd_r=6dfbe5fb-5543-4062-800b-b8e50b6af1a4&ref_=pd_hp_d_btf_exports_top_sellers_unrec"
headers = {
    "User-Agent": "Mozilla/5.0 이하 생략",
    "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7"
}

response = requests.get(AMAZON_URL, headers=headers)
soup = BeautifulSoup(response.text, "lxml")

price = soup.find(name="span", class_="aok-offscreen").getText()
price_without_currency = price.split("$")[1]
price_as_float = float(price_without_currency)
49.95

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

🔍 유의 사항

  • 목표 가격을 설정하고 상품 가격이 목표 가격보다 낮을 경우 이메일 보내기
    (이메일 전송을 테스트하려면 목표 가격을 현재 상품 가격보다 높게 설정)
  • 이메일에는 상품명, 현재 가격, 상품 구매링크 첨부
  • 이메일에 들어갈 메시지는 UTF-8로 인코딩하기(상품 이름에 - 등이 들어가기 때문)

⌨️ main.py

import requests
from bs4 import BeautifulSoup
import lxml
import smtplib

WISH_PRICE = 50.00

MY_EMAIL="이메일 주소"
MY_PASSWORD="비밀번호"

AMAZON_URL = "https://www.amazon.com/Aeropress-Clear-Coffee-Press-bitterness/이하 생략"
headers = {
    "User-Agent": "Mozilla/5.0 이하 생략",
    "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7"
}
response = requests.get(AMAZON_URL, headers=headers)

soup = BeautifulSoup(response.text, "lxml")
product_title = soup.find(name="span",
                          class_="a-size-large product-title-word-break").getText().strip()
price = soup.find(name="span", class_="aok-offscreen").getText()
price_without_currency = price.split("$")[1]
price_as_float = float(price_without_currency)

# 이메일 보내기
message = (f"Subject:Amazon Price Alert!\n\n"
           f"{product_title}\nis now ${price_as_float}\n{AMAZON_URL}").encode('utf-8')

with smtplib.SMTP("smtp.gmail.com") as connection:
    connection.starttls()
    connection.login(user=MY_EMAIL, password=MY_PASSWORD)
    connection.sendmail(from_addr=MY_EMAIL,
                        to_addrs=MY_EMAIL,
                        msg=message)




▷ Angela Yu, [Python 부트캠프 : 100개의 프로젝트로 Python 개발 완전 정복], Udemy, https://www.udemy.com/course/best-100-days-python/?couponCode=ST3MT72524

0개의 댓글