Python - Dynamic data collection and processing(Selenium and Pandas)

1 분 소요

파이썬 - 동적 데이터 수집 및 가공(selenium, pandas)

selenium 은 웹 브라우저를 제어하는 프레임워크이다. 웹 브라우저에서 동적으로 데이터를 수집할 수 있다.

그리고 웹 브라우저에서 수집한 데이터는 파이썬의 pandas 모듈을 사용하여 데이터를 가공할 수 있다.pandas는 데이터를 가공하고, 분석하는데 사용하는 파이썬 라이브러리이다.

selenium 설치

pip install selenium

크롬 드라이버 관리 모듈 설치

pip install webdriver-manager

예제 코드 설명

다음 예제는 쿠팡에서 식품 카테고리에서 상품명, 가격, 배송, URL을 수집하는 예제이다. 그리고 이 데이터를 pandas의 DataFrame 객체로 만들어서 출력해보고, csv 파일로 저장해본다.

예제 코드

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
import pandas as pd
from webdriver_manager.chrome import ChromeDriverManager

"""
service의 구조는 selenium.webdriver.chrome.service.Service 클래스를 참고
https://www.selenium.dev/selenium/docs/api/py/webdriver_chrome/selenium.webdriver.chrome.service.html
executable_path는 이 클래스의 생성자의 인자로 들어가는데, 이는 chromedriver의 경로를 의미함
"""
service = Service()
options = webdriver.ChromeOptions() # ChromeOptions : 크롬 브라우저의 설정을 위한 객체
driver = webdriver.Chrome(service=service, options=options) # Chrome() : 크롬 브라우저를 실행하기 위한 객체

## 크롬 브라우저 get()으로 URL 요청
driver.get("https://www.coupang.com/np/categories/194276")

## 상품 리스트 수집 - ID태그로 찾기, find_element()는 하나만 찾음
productList = driver.find_element(By.ID, 'productList')
## 상품 리스트에서 상품 정보 수집 - TAG_NAME으로 찾기, li태그가 여러개이므로 find_elements()로 찾음
lis = productList.find_elements(By.TAG_NAME, "li")
#print(len(lis))   
#print(lis)

## 상품명, 가격, 배송, URL 수집 배열 선언
prd_name = []
prd_price = []
prd_deli = []
prd_url = []   

## 상품명, 가격, 배송, URL 수집 - 반복문 사용
for idx, li in enumerate(lis):
    try:
        prd_name.append(li.find_element(By.CLASS_NAME, 'name').text)
        prd_price.append(li.find_element(By.CLASS_NAME, 'price-value').text)
        prd_deli.append(li.find_element(By.CLASS_NAME, 'delivery').text)
        prd_url.append(li.find_element(By.CLASS_NAME, 'baby-product-link').get_attribute('href'))
        if idx >= 5:
            break
    except Exception:
        pass
    
## 수집 데이터 확인
## pandas의 DataFrame 객체로 만들어서 출력
final = pd.DataFrame({'이름': prd_name, '가격': prd_price, 'Delivery': prd_deli, 'URL': prd_url})
pd.set_option('display.max_columns', 10)                  # 출력할 최대 열의 개수
pd.set_option('display.max_colwidth', 20)                 # 출력할 열의 너비
pd.set_option('display.unicode.east_asian_width', True)   # 유니코드 사용 너비 조정
print(final)
'''
(출력된 내용에 상품명은 'ㅁ'로 수정하였음)
                     이름           가격                 Delivery                  URL
0  ㅁㅁ 햇 꼬마사과 (13~17...      22,950   내일(일) 새벽 도착 보장.....    https://www.coup...
1  ㅁㅁㅁㅁ 제로 블루라임 탄산...   17,030   내일(일) 도착 보장              https://www.coup...
2  ㅁㅁㅁ 명작 2FL 분유 2...       56,700   내일(일) 도착 보장             https://www.coup...
3  ㅁㅁ 산지직송 산채로 포장한...   26,200   모레(월) 새벽 도착 보장.....     https://www.coup...
4  ㅁㅁ 현미밥, 130g, 24...        16,900   내일(일) 도착 보장            https://www.coup...
5  ㅁㅁㅁ ㅁㅁ 오트 바리스...       25,920    내일(일) 도착 보장              https://www.coup...
'''

## csv 파일로 저장
#final.to_csv('쿠팡식품.csv', encoding='euc-kr') #eur-kr로 하면 한글이 깨짐
final.to_csv('쿠팡식품.csv', encoding='utf-8-sig', index=False)

댓글남기기