BeautifulSoup4 활용2

몽자비루 ㅣ 2023. 4. 22. 21:40

# HTTP METHOD
# get : 어떤 내용을 누구나 볼수 있게 url에 적어서 보내는 방식
# (한번 보낼때 데이터의 양이 제한이있어 큰 데이터를 보낼 수 없음)
# post : url이 아닌 http body에 넣어서 보내는 방식
# (id/pw와 같은 보안이 필요한 업무, 큰 데이터 등을 보낼 수 있음)

import requests
import re
from bs4 import BeautifulSoup

for page in range(1,6):
    url = "<https://search.shopping.naver.com/search/all?query=%EB%85%B8%ED%8A%B8%EB%B6%81&pagingIndex=>"+str(page)
    header = {'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"}
    res = requests.get(url, headers=header)
    res.raise_for_status()

    soup = BeautifulSoup(res.text, "lxml")

    # basicList_item__0T9JD 로 시작하는 class의 모든 element를 가져옴.(정규식 사용)
    items = soup.find_all("div", attrs={"class":re.compile("^basicList_item__0T9JD")})
    # soup.find로 가져온 값에서 다시 find를 통해 하위 element값을 가져올 수 있다.
    items[0].find("div", attrs = {"class":"basicList_info_area__TWvzp"}).div.get_text()
    for item in items:
        
        print("-"*50)
        info = item.find("div", attrs = {"class":"basicList_info_area__TWvzp"})
        # 링크
        href = info.div.a["href"]
        # 제품명
        name = info.find("div", attrs = {"class":"basicList_title__VfX3c"}).get_text()
        if "Apple" in name:
            print("<apple상품 제외합니다="">")
            continue
        # 가격
        price = info.find("div", attrs = {"class":"basicList_price_area__K7DDT"})\\
            .strong.span.span.find("span", attrs = {"class":"price_num__S2p_v"}).get_text()
        
        # 광고 제품 제외
        # 광고 태그가 없는 제품을 제외함
        ad_badge = item.find("button", attrs = {"class": "ad_ad_stk__pBe5A"})
        if ad_badge:
            print("<광고 상품 제외합니다>")
            continue
        
        stars = info.find("div", attrs = {"class":"basicList_etc_box__5lkgg"})
    
        # 평점 수
        stars_num = stars.a.em.get_text()
        if not stars_num:
            print("<평점 없는 상품 제외합니다.>")
            continue
            # stars_num = "평점 개수 없음"
        else :
            if int(stars_num.replace(",","")) < 500:
                print("<평점 수 미달 : {}>".format(stars_num))
                continue
        # 평점
        stars = stars.find("span", attrs = {"class":"basicList_star__UzKiv"})
        if not stars:
            print("<별점 없는 상품 제외합니다.>")
            continue
            # stars = "별점 없음"
        else:
            stars = stars.get_text()

        print("제품명 : {}".format(name))
        print("가격 : {}".format(price))
        print("별점 : {}".format(stars))
        print("평점 수 : {}".format(stars_num))
        print("바로가기 : {}".format(href))
</apple상품>

  • HTTP METHOD
    • get : 어떤 내용을 누구나 볼수 있게 url에 적어서 보내는 방식
      ㄴ 한번 보낼때 데이터의 양이 제한이있어 큰 데이터를 보낼 수 없음
    • post : url이 아닌 http body에 넣어서 보내는 방식
      ㄴ id/pw와 같은 보안이 필요한 업무, 큰 데이터 등을 보낼 수 있음
  • soup.find_all(”element”, attrs = {”class” : re.compile(”정규식”} 으로
    정규식에 포함되는 element 값들을 전부 가져올 수 있음
  • soup.find로 가져온 값에서 다시 find를 통해 하위 element값을 가져올 수 있다.

'python > python_selenium' 카테고리의 다른 글

CSV 기본  (0) 2023.04.23
BeautifulSoup4 활용3  (0) 2023.04.23
BeautifulSoup4 활용1  (0) 2023.04.19
BeautifulSoup4 기본  (0) 2023.04.18
user agent  (0) 2023.04.17