크롤링

크롤링_쇼핑몰 상품 데이터 수집

asu2880 2022. 7. 1. 12:42
from selenium import webdriver as wb
from selenium.webdriver.common.by import By

# 키보드의 값을 보관하고 있는 라이브러리
from selenium.webdriver.common.keys import Keys

from bs4 import BeautifulSoup as bs

# 이미지 URL을 이용해서 파일로 저장시켜주는 라이브러리
from urllib.request import urlretrieve

# 파일 시스템을 활용하기 위한 라이브러리
# 파일&폴더 생성, 삭제, 존재여부 확인
import os

import time
import pandas as pd

 

# driver 객체 옵션 설정(GPU 사용X, 화면사이즈, 브라우저 숨김)
options = wb.ChromeOptions()
options.add_argument('disable-gpu')
options.add_argument('window-size=1920x1080')
options.add_argument('headless')
url = 'http://corners.gmarket.co.kr/Bestsellers'
driver = wb.Chrome()
driver.get(url)

 

html = bs(driver.page_source, 'lxml')

pd_names = html.select('a.itemname')
pd_prices = html.select('div.s-price > strong > span > span')

print(len(pd_names), len(pd_prices))

for i in range(len(pd_names)):
    print(pd_names[i].text)
    print(pd_prices[i].text)

 

# 1. 수집한 정보를 리스트로 저장
pd_name_list = []
pd_price_list = []

for i in range(len(pd_names)):
    pd_name_list.append(pd_names[i].text)
    pd_price_list.append(pd_prices[i].text)
    
# 2. 각 릿트를 하나의 딕셔너리로 생성
product_dic = {
    '상품명' : pd_name_list,
    '가격' : pd_price_list
}

# 3. 딕셔너리를 pd.DataFrame()에 매개변수로 전달
df = pd.DataFrame(product_dic)
df

 

# driver.find_elements() : 요소객체를 리스트로 반환
category = driver.find_elements(By.CSS_SELECTOR, value='ul#categoryTabG > :not(li:first-child) > a')

# 페이지 주소가 변경이 되면 이전 페이지의 내용을 가지고 있는
# driver 객체의 요소들을 사용할 수 없기 때문에
# 카테고리 주소를 추출해서 페이지 변환하는 방식으로 처리

href_list = [] # 카테고리 버튼의 주소를 저장하는 리스트

for cate in category:
    href = cate.get_attribute('href') # 속성값 접근하는 함수
    href_list.append(href)
    
for url in href_list: # 저장된 리스트 내 주소로 페이지 실행
    driver.get(url)
    time.sleep(1.5)

 

# 저장된 리스트 내 주소로 페이지 실행
for url in href_list:
    driver.get(url)
    
    # 파이썬 객체 변환
    html = bs(driver.page_source, 'lxml')
    
    # 상품정보 수집하는 로직
    pd_names = html.select('a.itemname')
    pd_prices = html.select('div.s-price > strong > span > span')
    
    for i in range(len(pd_names)):
        print('상품명: ', pd_names[i].text)
        print('가격: ', pd_prices[i].text)
        
    print('='*90)
    time.sleep(1.5)
728x90
반응형

'크롤링' 카테고리의 다른 글

크롤링_이미지 수집  (0) 2022.06.30
크롤링_유튜브 데이터 수집  (0) 2022.06.30
크롤링_Selenium  (0) 2022.06.30
크롤링_워드클라우드 그리기  (0) 2022.06.30
크롤링_네이버 영화 리뷰 수집(실습)  (0) 2022.06.28