오늘 다뤄볼 프로젝트는 앞서 다뤘던 API와 Beautiful Soup를 활용해서 아마존에서 마음에드는 상품의 가격이 어느정도

떨어지면 메시지로 알려주는 프로젝트를 만들어보았다.

아마존을 스크래핑 하기 위해서 이전과 조금 다른 점이 있다.

우선 헤더를 requests.get()에 입력해줘야하는데 그 이유는 헤더를 충분히 입력해주지 않으면 로봇으로 간주해 접속에 오류가 발생하였다.

아래는 지금 접속한 나의 http헤더를 확인할 수 있는 링크이다.

아래와같이 headrs 파라미터에 전달해준다.

http://myhttpheader.com/

header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36",
    "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7"
}

# http requests
response = requests.get(url, headers=header)

또 한가지 다른 점은 beautiful soup 사용 시 parser를 "html.parser"으로 사용하면 오류가 발생하기 때문에

lxml이라는 모듈을 가져와서 parser에 대신 입력했다.

soup = BeautifulSoup(response.content, "lxml")
import requests
import lxml
from bs4 import BeautifulSoup
from twilio.rest import Client

# twilio 유저 정보
account_sid = "ACeae01c44befd05bfd78737f61622cd75"
auth_token = "9ccb2ee8946f993a58080663c4087603"
phone_number = "+18722469869"
my_phone_number = "+821028919394"

# 아마존 상품
url = "<https://www.amazon.com/Apple-AirPods-Max-Space-Renewed/dp/B08XY48BJD/ref=sr_1_2?crid=RE7OTVWQH8I8&keywords=AirPods%2Bmax&qid=1655883317&sprefix=airpods%2Bma%2Caps%2C319&sr=8-2&th=1>"

# 헤더
header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36",
    "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7"
}

# http requests
response = requests.get(url, headers=header)

# beautiful soup로 아마존 스크래핑
soup = BeautifulSoup(response.content, "lxml")
price = float(soup.find(name="span",class_="a-offscreen").getText().replace("$",""))
name = soup.find(name="span", class_="product-title-word-break").getText().strip()

# 가격이 400달러 이하일 경우 SMS 발송print(price)
if price < 400 :
    client = Client(account_sid, auth_token)

    message = client.messages \\
        .create(
        body = f"상품명 : {name}\\n"
               f"상품가격 : ${price}\\n"
               f"상품링크 : {url}",
        from_ = phone_number,
        to = my_phone_number
    )

    print(message.sid)