본문 바로가기
[Python & Ruby]

Python 크롤링 - 3 / 이마트 크롤링해보기 4

by Hevton 2022. 11. 26.
반응형

 

 

이전 글에서는, 이마트 상품 리스트 중 첫번째 페이지 내에서만 크롤링을 진행했습니다.

이번 글에서는 페이지를 넘나들며 크롤링을 하는 구현을 진행할 것이며,

추가로 try - except - finally 구문을 활용해서, 크롤링 과정에서 혹여나 발생할 예외사항들 (특정 상품에 태그가 없거나 누락되거나 기타 문제가 있는 경우)을 마주했을 때, 에러가 발생되어 뒤의 크롤링까지 모두 진행하지 못하고 종료되는 불상사를 막는 방법도 구현할 것입니다.

 

다음 페이지인 2페이지에 대한 태그를 획득하여 또다시 Copy XPATH를 진행합니다.

마찬가지로 10페이지에 대한 태그도 확인해보면, 여태 진행했던 대로 반복문을 어떻게 구성해야 하는지 감이 올 수 있습니다.

 

전반적인 방식은 이전까지 다뤘던 방법과 매우 동일하나, 추가된 부분이 있다면 크게 두 가지가 있습니다.

 

1. driver.implicitly_wait(시간)

driver를 이용하여, 특정 페이지에 데이터를 요청한 상황에서

데이터가 날아올 때 까지 기다려지는 시간이 필요할 수 있습니다.

이를 사용하지 않는다고 가정한다면 어떤 상황이 일어나는지 설명드리겠습니다.

 

1페이지에서 크롤링 -> 2페이지로 이동 -> 2페이지에서 크롤링

 

반복문을 사용해 위 과정을 진행한다고 했을 때, 2페이지로 이동하는 요청을 진행한 이후 컴퓨터의 빠른 속도로

바로 2페이지 크롤링을 진행할텐데, 아직 페이지가 불러들여지지 않았을 수 있으므로 태그가 존재하지 않는다는 오류메세지를 받을 수 있습니다. 그래서 페이지를 요청한 뒤 데이터를 받아서 태그가 존재한 뒤에 태그를 찾아 크롤링 하기 위한 옵션을 주는 것입니다.

 

driver.implicity_wait(10) => 최대 10초까지 기다리겠다라는 의미입니다. 그 전에 데이터가 로드되면 곧바로 다음 작업을 진행합니다.

 

 

2. try - except - finally 

자바의 try catch finally와 동일합니다.

try 아래 구문들은 일반적인 코드 평문들을 모두 넣는 곳이고, 이 구문들을 실행하는 중 오류가 생긴다면

바로 except 로 내려가서 그 부분들의 코드를 실행한 뒤에,

다시 try로 돌아가는게 아니라! finally로 이동합니다.

 

코드가 위에서 아래로 진행되는건 여전하지만, try에서 오류 발생 시 except로 바로 점프한다고 보면 됩니다.

try 에서 오류를 발생시킨 코드 아래부터는 실행되지 않고 바로 except로 넘어갑니다. 그 부분들은 영영 실행되지 않습니다.

# -*- coding: UTF-8 -*-
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
import pandas as pd

# Colab에선 웹브라우저 창이 뜨지 않으므로 별도 설정한다.

driver = webdriver.Chrome(ChromeDriverManager().install())

# 해당 url로 이동. 생수 / 음료 / 주류 코너
url = "https://emart.ssg.com/category/main.ssg?dispCtgId=6000095507"
driver.get(url)

product_list = []
price_list = []


driver.implicitly_wait(10)  # 특정 페이지에 데이터를 요청한 상황에서, 데이터가 날아올 떄 까지 최대 10초까지는 기다려주겠다. 그 전에 반환받으면 다시 바로 동작함.

for page in range(1, 11): # 페이지 이동이 아래에서 작동하므로 1 ~ 9 까지 작동하려면 range를 1, 11로 해야함.
    for i in range(1, 81):
        try: # 특정 상품이 없거나 특정 상품의 태그가 문제가 있거나 등, 그럴 경우 뒤의 크롤링이 모두 정지되기에 그를 방지하기 위한 로직이다.
            product_name = driver.find_element(By.XPATH,
                                       '//*[@id="ty_thmb_view"]/ul/li[' + str(i) + ']/div[2]/div[2]/div/a/em[1]')
            product_price = driver.find_element(By.XPATH, '//*[@id="ty_thmb_view"]/ul/li[' + str(i) + ']/div[2]/div[3]/div/em')
            product_list.append(product_name.text)
            price_list.append('' + product_price.text + '원')
        except Exception as e:
            print(e) # 오류 출력
        finally: # 뭐가 되었든 실행되는 부분
            pass

    driver.find_element(By.XPATH, '//*[@id="area_itemlist"]/div[2]/a[' + str(page) + ']').click()

df = pd.DataFrame({'상품명': product_list, '가격': price_list})

print(df)

반응형