Language/Python
[Python] selenium과 beautifulsoup을 사용해서 다나와 페이지의 엔진오일 크롤링하기(1)
뚜sh뚜sh
2022. 4. 13. 16:47
2022-03 어느 날
selenium 라이브러리를 사용하는 이유
- 웹드라이버를 이용해서 자바스크립트가 동적으로 만든 데이터를 크롤링 하기 위해서
- 사이트의 다양한 HTML 요소에 클릭, 키보드 입력 등 이벤트를 주기 위해서
selenium 설치
pip install selenium
- selenium으로 자동화 프로그램을 만들 때, 현재 설치된 Chrome 등의 브라우저 버전에 맞는 드라이버를 다운로드 받고 그 드라이버를 로딩할 수 있도록 path를 변경해야 함
- 다행히 파이썬에는 chromedriver_autoinstaller라는 라이브러리가 있어서 사용하면 됨
chromedriver 설치
- 현재 설치된 크롬 버전을 지원하는 크롬 드라이버를 자동으로 다운로드하여 설치함
pip install chromedriver-autoinstaller
다나와 페이지에서 브랜드는 킥스, 지크, 에쓰오일, 쉘, 모빌 5가지를 선택하고, 가솔린 엔진오일을 선택한 후 용량은 1L인 엔진오일들을 크롤링하는 코드
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import chromedriver_autoinstaller
from bs4 import BeautifulSoup
# option 값 객체 설정
# 추후에 우리가 원하는 기능을 추가할 때 사용되는 변수
options = Options()
# headless 기능
# 셀레니움 특성상 브라우저가 뜨면서 작동되기 때문에 이게 싫을 때 사용하는 기능
# 화면이나 페이지 이동을 표시하지 않고 동작하는 모드
options.add_argument('headless')
chromedriver_autoinstaller.install()
# 브라우저 창 안보이기
driver = webdriver.Chrome(options=options)
# 윈도우 창 크기변경
# 크롤링을 할 때 특정 홈페이지들은 브라우저의 크기에 따라 html 값들이 변경되는 경우가 있음
# 브라우저의 크기를 고정시켜줘야 할 때 사용
driver.set_window_size(1920,1280)
# 페이지 이동(가솔린 엔진오일의 1페이지)
driver.get('http://search.danawa.com/dsearch.php?query=%EC%97%94%EC%A7%84%EC%98%A4%EC%9D%BC&originalQuery=%EC%97%94%EC%A7%84%EC%98%A4%EC%9D%BC&includeKeyword=1L&volumeType=allvs&page=1&limit=120&sort=saveDESC&list=list&boost=true&addDelivery=N&brand=45123,45160,10775743,10381324,8030&attributeOption=4009|26349|167143|AND&recommendedSort=Y&defaultUICategoryCode=1424009&defaultPhysicsCategoryCode=1840%7C56362%7C56394%7C0&defaultVmTab=4796&defaultVaTab=213686&tab=main')
# BeautifulSoup으로 html소스를 python객체로 변환하기
# 첫 인자는 html 소스코드, 두 번째 인자는 어떤 parser를 이용할지 명시
# driver.page_source : 동적으로 변한 브라우저에서 소스 정보 가져오기
soup = BeautifulSoup(driver.page_source, 'html.parser')
# 요소명이 ‘prod_main_info’ 인 모든 태그들이 선택되어 goods_list에 들어감(select)
# ‘prod_main_info’ : 상품의 이미지 + 설명 + 가격이 다 나와있는 행
goods_list = soup.select('div.prod_main_info')
ga_names1 = []
ga_prices1 = []
for v in goods_list:
# div 태그 중 class 이름이 prod_info인 첫 번째 태그만 선택
# class는 python에서 예약어이기 때문에 class_로 css클래스를 검색함
# if 문이 없어도 돌아감
# if v.find('div', class_='prod_info'):
# select_one : 문서의 처음부터 찾게 되며 가장 첫 태그를 호출함
# ‘>’를 사용하는 경우 바로 아래의 자식만 검색
# strip() : 인자로 전달된 문자를 string의 왼쪽과 오른쪽에서 제거함
# strip() 에 인자를 전달하지 않으면 문자열에서 공백을 제거함
name = v.select_one('p.prod_name > a').text.strip()
price = v.select_one('p.price_sect > a').text.strip()
ga_names1.append(name)
ga_prices1.append(price)