본문 바로가기
Python/Python_Crawling

쿠팡 : 상품 검색결과 중 로켓배송인 상품 크롤링

by Mr.DonyStark 2024. 2. 13.

□ 내용

  ○ 쿠팡에서 특정 키워드에 따른 검색결과 상품 들 중 로켓배송이 되는 품목만 크롤링

  ○ 특이사항

    - 변수명 = .select('li[class=search-product') → li 태그 중 클래스명이 정확히 search-product 인 것을 앞 코드와 같이 표현

       ▶ .select('li.search-product')과 같이 쓰면 아래 이미지와 같이 특정 클래스명이 들어간것을 모두 파악하여 처리해야할 변수 및 정확도가 떨어짐

li.search-product 활용시 출력결과

 

    - continue 문 : 조건이 True이면 아래 코드까지 진행, 조건이 False면 위로 올라가서 코드실행

    #로켓뱃지
    rocket_pd = i.select_one('.badge.rocket')
    if rocket_pd:
        continue  #로켓벳지가 없다면 위로 올라가서 코드 실행. 있다면 아래 코드 실행

 

    - .get() 함수 : BeautifulSoup에서 특정 속성의 값을 가져오는 데 사용되는데 주로 HTML 태그 안에서 속성의 값을 추출하는 데 활용함

        ▶ .get('data-img-src') 은 data-img-src 속성의 값을 가져오겠다는 의미

    - 이미지 저장 : wb 활용 (바이너리형식으로 저장)

 

□ 코드

#라이브러리 호출
import requests
from bs4 import BeautifulSoup

#크롤링 페이지 : 입력받은 값이 url 상의 q 파라메터로 적용
pd_word = input('검색품목을 입력해주세요.\t:\t')
url = 'https://www.coupang.com/np/search?component=&q='
pd_url = url + pd_word
representative_url = 'https://www.coupang.com'

#requests setting : timeout 특정 시간을 주고 대기. 해당 시간까지 진행이 안되면 오류 반환
get_information = requests.get(pd_url, timeout = 5)  #크롤링 대상사이트에 요청
all_data = get_information.text  #요청하여 받은(get) 데이터 텍스트로 저장
parser = BeautifulSoup(all_data, 'html.parser') #텍스트로 저장된 데이터를 html.parser를 파싱세팅

#타겟 상세영역 구분
#li태크에 class속성이 search-product 인것
item_area = parser.select('li[class=search-product ]')

for index, i in enumerate(item_area):
    index +=1
    #로켓뱃지
    rocket_pd = i.select_one('.badge.rocket')
    if rocket_pd:
        continue  #로켓벳지가 없다면 위로 올라가서 코드 실행. 있다면 아래 코드 실행

    #제품명 : 클래스명이 search-product인 li 태그 하위 태그 중 클래스명 name 을 가진 요소
    pd_nm = i.select_one('.name ').string
    #가격 : 클래스명이 search-product인 li 태그 하위 태그 중 클래스명 sale 을 가진 요소. 앞뒤 공백제거를 위해 .strip 사용
    pd_pc = i.select_one('.sale ').text.strip()
    #썸네일 : 클래스명이 search-product인 li 태그 하위 태그 중 클래스명이 search-product-wrap-img 인 img 태그인 요소
    pd_thumb_small = str(i.select_one('img.search-product-wrap-img').get('data-img-src'))
    if pd_thumb_small == None:
        pd_thumb_small = 'http:' + i.select_one('img.search-product-wrap-img')['src']
    elif pd_thumb_small != None:
        pd_thumb_small = 'http:' + str(i.select_one('img.search-product-wrap-img').get('data-img-src')) #.get() 메서드는 BeautifulSoup에서 특정 속성의 값을 가져오는 데 사용됩니다. 주로 HTML 태그 안에서 속성의 값을 추출하는 데 활용

    #링크 : 클래스명이 search-product인 li 태그 하위 태그 중 a태그의 href 속성 값 가져오기
    pd_link = representative_url+ i.select_one('a')['href']
    #이미지 다운 : wb 바이너리파일 저장
    try:
        img_dwn = requests.get(pd_thumb_small)
        with open(f'쿠팡 {pd_word} {index}위 상품.jpg','wb') as f:
            f.write(img_dwn.content)
    except:
        pass

    print(f'\n□\t{index}위 제품\n(1)제품명\t:\t{pd_nm}\n(2)가격\t:\t{pd_pc}\n(3)썸네일\t:\t{pd_thumb_small}\n(4)링크\t:\t{pd_link}')

출력결과 : 좌측은 데이터 크롤링결과, 우측은 이미지 썸네일 저장결과