파이썬 프로그래밍

파이썬 프로그래밍 셀레니움 웹크롤링 간단한 예제

코니코니 2022. 10. 1. 00:00
반응형

파이썬 프로그래밍 셀레니움 웹크롤링 간단한 예제


파이썬 프로그래밍으로 특정 웹사이트의 데이터를 가져와 처리하는 것은 어렵지 않습니다. 대표적으로 웹크롤링에 사용이 되는 라이브러리로는 Selenium과 Beautifulsoup 두가지가 있는데요 오늘은 웹의 자동화를 직접 눈으로 보면서 데이터 처리가 가능한 Selenium 사용법에 대해서 알아보도록 하겠습니다.

예제로 데이터를 처리할 사이트는 무신사로 정했습니다. 스토어에서 후드티를 검색하고 리스트에 있는 의류 제목을 가져오려고 합니다.

무신사 사이트 바로가기

먼저 예제의 전체 코드는 다음과 같습니다.

from selenium import webdriver
 
# 웹드라이버 옵션 추가
options = webdriver.ChromeOptions()
options.add_argument(f'user-agent=Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) '
                     f'Chrome/90.0.4430.212 Safari/537.36')
# 크롬드라이버 위치
path = 'chromedriver.exe'
# 크롬 웹드라이버 활성화
driver = webdriver.Chrome(path, options=options)
# 최대 로딩 대기시간 설정
driver.implicitly_wait(5)
# 사이트 입장
driver.get('https://search.musinsa.com/search/musinsa/integration?type=&q=%ED%9B%84%EB%93%9C%ED%8B%B0')
 
# 제품 리스트 요소를 변수에 넣기
LiBox = driver.find_element_by_class_name('boxed-list-wrapper').find_elements_by_class_name('li_box')
 
# 제목 출력
for i1 in LiBox:
    Name = str(i1.find_element_by_class_name('list_info').text)
    if Name:
        print(Name)

크롬드라이버를 사용하여 웹에 접속 후 데이터를 처리하기 위한 요소를 리스트에 넣어서 순서대로 제목을 출력하는 예제입니다.

웹드라이버 옵션을 추가하는 add_argument의 경우 현재 user-agent만 넣은 상태인데요 보통의 경우 user-agent가 없으면 사이트 내부적으로 크롤링을 못하도록 막아두기 때문에 user-agent 옵션만 추가를 해뒀습니다.

크롬드라이버 위치가 있는 path와 크롬 옵션을 웹드라이버 파라메터에 추가를 한 후 마지막으로 암묵적 대기시간을 설정하고 웹에 접속을 해줍니다. 이제 웹사이트 내에서 요소를 가져와 처리를 해주면 되는데요 하나의 요소가 아닌 여러개의 요소를 가져와 반복적인 데이터를 처리 할 때 아래와 같은 방법을 사용할 수 있습니다.

LiBox = driver.find_element_by_class_name('boxed-list-wrapper').find_elements_by_class_name('li_box')

먼저 셀레니움에서 요소를 지정하는 경우 상위 요소에서 추가적으로 하위 요소를 잡아줄 수 있습니다 최초 상위 요소는 'boxed-list-wrapper' 입니다 이제 이 요소 안에 하위 요소로 'li_box'를 잡아준 것인데요 첫번째 상위 요소와는 달리 element 뒤에 s가 붙는 것을 볼 수 있습니다. s가 붙는다는 것은 잡아줄 요소가 하나가 아닌 동일한 명칭을 가진 모든 요소를 가져온다는 것으로 해석을 할 수 있습니다. 아래 사진을 보면 쉽게 이해가 가능합니다.

'boxed-list-wrapper' 라는 상위 클래스 내부에는 'li_box' 라는 하위 클래스가 여러개 있는 것을 볼 수 있습니다. elements를 사용하여 특정 요소를 지정해준다면 해당 변수는 모든 요소를 리스트 형식으로 저장합니다.

LiBox = driver.find_element_by_class_name('boxed-list-wrapper').find_elements_by_class_name('li_box')

이 변수는 다시 말해서 'li_box' 라는 클래스 명을 가진 모든 하위 요소를 리스트로 저장을 한다는 것입니다.

상위 요소에서 하위 요소를 잡는 동일한 방식으로 이제 'li_box' 라는 클래스 내부에서 제목이 들어가 있는 더 낮은 하위 요소를 지정하여 제목을 출력해보도록 하겠습니다.

위 이미지를 보면 'li_box' 클래스 내부에 있는 하위 요소인 'list_info' 라는 클래스에 제목에 해당이 되는 텍스트가 있는 것을 볼 수 있습니다. 기존에 변수에 저장을 해뒀던 'li_box' 리스트를 for 반복문으로 하나씩 불러와 'list_info' 클래스를 텍스트 형식으로 출력만 해주면 되겠죠.

# 제품 리스트 요소를 변수에 넣기
LiBox = driver.find_element_by_class_name('boxed-list-wrapper').find_elements_by_class_name('li_box')
 
# 제목 출력
for i1 in LiBox:
    Name = str(i1.find_element_by_class_name('list_info').text)
    if Name:
        print(Name)

for 반복문을 사용하여 LiBox를 순서대로 가져옵니다. 그리고 각 요소 하위에 자리잡고 있는 'list_info'를 텍스트화 시켜서 Name이라는 변수에 저장을 해줍니다.

마지막 if문의 경우 만약 제품의 제목이 없는 경우 공백 출력을 방지하기 위해서 넣었습니다. 셀레니움에서 .text로 변환을 시킨 값에 텍스트 형식의 문자가 없다면 공백으로 변수에 저장이 되기 때문에 if문 특성상 공백은 참이 아닌 거짓인 부분에서 공백 출력을 피할 수 있는거죠.

9/1 배송 2 TONE ARCH HOODIE GRAY
9/7 배송 빅 트위치 루즈핏 후디 네이비
Arch Logo Hoodie Navy
[314279BK] 아르헨티나 후드 - 블랙
[Mmlg] 1987MMLG HOOD (GREY)
9/1 배송 빅 트위치 루즈핏 후디 그레이
어센틱 로고 후디 그레이
9/3 배송 ODSD 로고 아플리케 후드 - 8COLOR
9/7 배송 빅 트위치 루즈핏 후디 라이트 그레이
3일 지연 Flocking Symbol Logo Hoodie White Melange
 
Process finished with exit code 0

출력 결과 문제없이 데이터를 가져온 것을 확인할 수 있습니다.

반응형