YSY의 데이터분석 블로그

[Crawling] 쿠팡검색결과 크롤링 본문

Data Engineering/Crawling

[Crawling] 쿠팡검색결과 크롤링

YSY^ 2020. 8. 5. 14:21

www.coupang.com/np/search

 

COUPANG

쿠팡은 로켓배송

www.coupang.com

 

검색키워드 입력을 받는 keyword 설정

keyword = input('검색키워드: ')

 

params 및 header 설정

- params와 headers는 딕셔너리 구조로 설정한다. params에는 받아올 값을 입력하고 headers에는 user-agent나 cookie같은 것을 입력한다.

- user-agent는 F12(검사)에서 Network탭을 누른다음 Doc탭을 눌러서 볼 수 있다.

- user-agent가 없으면 크롤링이 안될 수도 있으니 가급적 설정하도록 하자.

params = {
    'q' : keyword,


}

#User-Agent header설정
headers = {
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'    
}

 

페이지 소스 살펴보기

크롤링할 대상은 제품명, 제품페이지로 가는 link url, 가격이다.(가격은 할인이 적용된 것을 크롤링한다.)

먼저 페이지소스를 살펴본다.

- 제품명과 제품url, 가격은 모두 <ul#produckList>(첫번째 직사각형) 밑에 있으며 제품하나하나 각각

  • 로 감싸져있다

- 제품url은 태그 에 있으며(두번째 직사각형) base_url과 합쳐야만 제대로된 링크가 완성된다.

- 제품명은 <div.name>에 있으며(세번째 직사각형) text.strip()로 텍스트로 가지고 온다.

- 가격(할인적용)은 <strong.price-value>에 있으며(네번째 직사각형) text.strip()으로 텍스트로 가지고 온다.

- 가격은 ','가 빠진채로 가지고 와야하는데, 그이유는 크롤링한 파일을 csv로 저장할 때 ','로 구분해서 저장하기 때문에 가격이 둘로 나뉠 수 있기 때문이다.(join을 사용한다.)

 

검색 목록 크롤링

import requests
import pandas as pd
from bs4 import BeautifulSoup
from urllib import parse
from datetime import datetime

result_list = []

res = requests.get(url, params=params, headers=headers)


if res.status_code == 200:
    soup = BeautifulSoup(res.text)
    item_list = soup.select('ul#productList li')
    base_url = 'https://www.coupang.com/'
    error_cnt = 0
    for item in item_list:
        try:
            item_name = item.select_one('div.name').text.strip()
            link = item.select_one('a').get('href')
            link = parse.urljoin(base_url, link) 
            price = item.select_one('strong.price-value').text.strip()
            price = ''.join(price.split(','))
            result_list.append([item_name, link, price])
        except Exception as e:
            print(e)
            error_cnt += 1

 

크롤링 내역 저장

위에서 크롤링한 내역을 csv나 excel로 저장한다.

    date=datetime.now().strftime('%Y-%m-%d')
    filename = f'쿠팡_{keyword}_조회결과_{date}'
    df = pd.DataFrame(result_list, columns = ['title','link','price'])
    df.to_csv(filename+".csv", index=False, encoding='UTF-8')
    df.to_excel(filename+".xls", index=False)

 

검색페이징

  • 마지막 페이지 번호 조회
  • 1~ 마지막페이지까지 요청하면서 상품크롤링
  • 크롤링한 내용을 파일로 저장

크롤링할 대상 selector

  • 마지막 페이지 번호 :a.btn-last : text
  • 상품정보
    • base : ul#productList li
    • title : div.name : text
    • link : a href
    • price : strong.price-value : text

 

크롤링을 위한 기본 설정 및 마지막 페이지 가지고오기

import requests
import pandas as pd
from bs4 import BeautifulSoup
from urllib import parse
from datetime import datetime
import time

base_url = 'https://www.coupang.com/np/search?q={}&page={}'
keyword = input("검색할 키워드 : ")
headers = {
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'    
}
result_list = []
url = base_url.format(keyword,1)
print(url)
res = requests.get(url, headers=headers)
if res.status_code == 200:
    soup = BeautifulSoup(res.text)
    print(soup)
    last_page = soup.select_one('a.btn-last').text.strip()
    print(last_page)

 

각페이지의 상품조회

위에서 조회한 마지막 페이지까지 크롤링한다.

error_cnt = 0
cp_url = 'https://www.coupang.com/'
for page in range(1, int(last_page)+1):
    url = base_url.format(keyword, page)
    res = requests.get(url, headers=headers)
    if res.status_code == 200:
        soup = BeautifulSoup(res.text)
        item_list = soup.select('ul#productList li')
        for item in item_list:
            try:
                item_name = item.select_one('div.name').text.strip()
                link = item.select_one('a').get('href')
                link = parse.urljoin(cp_url, link)
                price = item.select_one('strong.price-value').text.strip()
                price = ''.join(price.split(','))
                result_list.append([item_name, link, price])
            except:
                error_cnt += 1

 

저장

curr = datetime.now().strftime('%Y-%m-%d')
filename = '쿠팡조회결과_{}_{}.csv'.format(keyword,curr)
df = pd.DataFrame(result_list, columns=['title','link','price'])
df.to_csv(filename, index=False, encoding='utf-8')
print('fail to save :', error_cnt)

 

결과

728x90
반응형
Comments