본문 바로가기
  • 기록
파이썬

웹 스크래핑3(쿠팡)

by juserh 2021. 7. 2.

쿠팡사이트에 '노트북' 검색->

https://www.coupang.com/np/search?q=%EB%85%B8%ED%8A%B8%EB%B6%81&channel=user&component=&eventCategory=SRP&trcid=&traid=&sorter=scoreDesc&minPrice=&maxPrice=&priceRange=&filterType=&listSize=36&filter=&isPriceRange=false&brand=&offerCondition=&rating=0& page=1&rocketAll=false&searchIndexingToken=1=4&backgroundColor=

 

 

http 서버에 요청을 보내면 서버는 그 요청에 맞는 응답을 보내는데 이때 요청에 http method가 포함됨.

-get방식: 해당 정보를 누구나 볼 수 있게 url에 적어보냄, 한번 전송할 때 데이터 양 제한

             ?변수1=값1&변수2=값2......

-post방식: http메시지를 body에 숨겨 보냄, 보안 데이터, 제한X

 

import requests
import re
from bs4 import BeautifulSoup

url = "https://www.coupang.com/np/search?q=%EB%85%B8%ED%8A%B8%EB%B6%81&channel=user&component=&eventCategory=SRP&trcid=&traid=&sorter=scoreDesc&minPrice=&maxPrice=&priceRange=&filterType=&listSize=36&filter=&isPriceRange=false&brand=&offerCondition=&rating=0&page=1&rocketAll=false&searchIndexingToken=1=1&backgroundColor="
headers = {
    "User-Agent": "---내 user agent 정보---"
}
res = requests.get(url, headers=headers)
res.raise_for_status()
soup = BeautifulSoup(res.text, "lxml")

# print(res.text)
items = soup.find_all(
    "li", attrs={"class": re.compile("^search-product")}
)  # class 속성이 search-product로 시작하는 모든 엘리먼트
print(items[0].find("div", attrs={"class": "name"}).get_text())
for item in items:
    name = item.find("div", attrs={"class": "name"}).get_text()  # 제품명
    price = item.find("strong", attrs={"class": "price-value"}).get_text()  # 가격
    rate = item.find("em", attrs={"class": "rating"})  # 평점 (평점이 없는 상품이 있으면 오류나서 코드 분리)
    if rate:
        rate = rate.get_text()
    else:
        rate = "평점 없음"
    rate_cnt = item.find(
        "span", attrs={"class": "rating-total-count"}
    )  # 평점수(평점과 마찬가지로 오류나서 코드 분리)
    if rate_cnt:
        rate_cnt = rate_cnt.get_text()
    else:
        rate_cnt = "평점 수 없음"
    print(name, price, rate, rate_cnt)

평점이 없는 제품의 평점과 평점 수 정보를 제품 이름이나 가격과 같은 방식으로 가져오려고 하면 오류가 발생하여 정보를 받는 코드와 이를 get_text()로 저장하는 코드를 분리해야 한다.

 

 # 광고 제품 제거
    ad_badge = item.find("span", attrs={"class": "ad-badge-text"})
    if ad_badge:
        print("  <광고 상품 제외합니다>")
        continue

광고 상품 제거를 원한다면 위 코드블럭 for문의 처음에 이 코드를 삽입하면 된다. ad-badge-text가 가지는지 확인하고 그렇다면 다음 item으로 넘어가는 코드이다.

 

# 리뷰 100개 이상, 평점 4.5 이상 되는 것만 조회
    rate = item.find("em", attrs={"class": "rating"})  # 평점 (평점이 없는 상품이 있으면 오류나서 코드 분리)
    if rate:
        rate = rate.get_text()
    else:
        rate = "평점 없음"
        print("  <평점 없는 상품 제외합니다>")
        continue
    rate_cnt = item.find(
        "span", attrs={"class": "rating-total-count"}
    )  # 평점수(평점과 마찬가지로 오류나서 코드 분리)
    if rate_cnt:
        rate_cnt = rate_cnt.get_text()  # 출력값 예: (26)
        rate_cnt = rate_cnt[1:-1]  # index 1부터 맨 뒤 바로 앞까지
        # print("리뷰 수", rate_cnt)
    else:
        rate_cnt = "평점 수 없음"
        print("  <평점 수 없는 상품 제외합니다>")
        continue

    if float(rate) >= 4.5 and int(rate_cnt) >= 50:
        print(name, price, rate, rate_cnt)

 

# 애플 제품 제외
    if "Apple" in name:
        print("  <Apple 상품 제외합니다>")
        continue

애플 제품을 제외 하고 싶은 경우, 위 for문에 코드 추가

 

한 페이지의 상품 뿐 아니라 여러 페이지의 상품을 가져오려면 링크 페이지 정보 for문으로 조작

for i in range(1, 6):
    print("현재 페이지: ", i)
    url = "https://www.coupang.com/np/search?q=%EB%85%B8%ED%8A%B8%EB%B6%81&channel=user&component=&eventCategory=SRP&trcid=&traid=&sorter=scoreDesc&minPrice=&maxPrice=&priceRange=&filterType=&listSize=36&filter=&isPriceRange=false&brand=&offerCondition=&rating=0&page={}&rocketAll=false&searchIndexingToken=1=1&backgroundColor=".format(
        i
    )
    #밑에는 앞과 비슷하게 원하는 정보 가져오기

'파이썬' 카테고리의 다른 글

웹 스크래핑6(Selenium기본)  (0) 2021.07.08
웹 스크래핑5(CSV, 네이버 금융)  (0) 2021.07.07
웹 스크래핑4(다음 영화)  (0) 2021.07.06
웹 스크래핑2(네이버 웹툰)  (0) 2021.06.23
웹 스크래핑1  (0) 2021.06.23