쿠팡사이트에 '노트북' 검색->
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 |