본문 바로가기
SW programming/Python

[Python 웹 크롤링] Selenium 과 BeautifulSoup의 조합

by 고뭉나무 2021. 5. 22.

 

지난 포스팅 Requests 와 BeautifulSoup의 조합에 이어 

2021.05.21 - [SW programming/Python] - [Python 웹 크롤링] Requests 와 BeautifulSoup 의 조합

이번 포스팅에서는 Selenium 과 BeautifulSoup의 조합에 대해 다뤄보도록 하겠습니다.

 

Selenium 와 BeautifulSoup 의 조합

(부제. 자동으로 클릭 접속하여 html 정보 추출)

 

그렇다. Selenium은 웹 브라우저를 자동으로 제어할 수 있게 해주는 패키지 이다. 아주 아~주 유용하게 사용되는 아이다 :)

제어하고자 하는 웹 브라우저의 Driver를 설치해야 하며, 보통은 'Chrome'을 사용한다. (Chrome driver 설치법은 따로 검색해주세요.)

 

그럼 먼저 오늘 할 실습을 보겠습니다.

https://youtu.be/eq6B7rP9l7E

한마디로, 아래와 같은 기능을 한다고 보면 됩니다.

특정 웹 브라우저를 통해 원하는 웹사이트 내에서 자유롭게 이동하며 원하는 정보를 불러온다.

 

Selenium 와 BeautifulSoup 의 기능

  • Selenium: 웹 브라우저를 이용하여 웹 사이트에서 자동적으로 제어할 수 있게 함.
  • BeautifulSoup: html과 xml 문서를 parsing하기 위한 패키지로 html에서 데이터를 추출하는 데 유용한 구문 분석 트리를 생성함.

 

각 모듈에서 자주 사용되는 함수

#Selenium 용
from selenium import webdriver
import time
#BeautifulSoup 용
from bs4 import BeautifulSoup

#------------------------------Selenium을 이용한 제어 ------------------------------#

#Selenium_webdriver 위치 지정
driver = webdriver.Chrome('/Users/mac/Downloads/chromedriver')
#Selenium_driver로 url 접속
url = "https://m.bobaedream.co.kr"
driver.get(url)
#Selenium_접속하는 데 시간이 걸릴 수 있으므로 1초 기다림
time.sleep(1)

#Selenium_검색 돋보기 버튼을 클릭하기 위해 활용하는 x_path
x_path = '//*[@id="bobaeHead"]/div[1]/div/div[2]/div[2]/form/div[2]/button/span'
searchbox = driver.find_element_by_xpath(x_path)
#Selenium_버튼 클릭
searchbox.click()
#Selenium_검색창에 커서 얹음
element = driver.find_element_by_name("keyword")
#Selenium_키워드 입력
element.send_keys("쏘렌토")
#Selenium_버튼 클릭
element.submit()

#Selenium_위의 작업이 수행된 후 해당 접속 사이트 url 정보 가져옴(html)
#지난 포스팅에서 사용했던 Requests의 text 함수와 유사한 가능을 함.
html = driver.page_source


#---------------------------BeautifulSoup으로 html 정보 분석------------------------#

#BeautifulSoup_html을 Parsing 함
soup = BeautifulSoup(html, 'html.parser')

#BeautifulSoup_html 정보 분석
#BeautifulSoup_select_one() 함수
search_result = soup.select_one('ul.imgList01')
#BeautifulSoup_select() 함수
commu_list = search_result.select('li > a')

 

그러면 예시를 통해 원하는 웹 크롤링을 수행해보자

 

예시. 보배드림 사이트에서 쏘렌토 중고 매물 글을 불러오기

아래 방식대로 수행할 예정이다.

1) 보배드림 메인 사이트를 접속한다.

2) '검색 돋보기' 아이콘을 클릭한다.

3) 검색창에 '쏘렌토'를 타이핑하고 검색 버튼을 누른다.

4) 중고차 내역을 더 보기 위해 '더보기' 버튼을 클릭한다.

5) 나열된 중고차 리스트의 '사이트 주소'를 읽어온다.

 

'검색 돋보기' 아이콘

XPath 추출

위에 파란색으로 물결 친 라인을 우클릭 한 후, Copy - Copy XPath를 클릭하면 XPath 주소가 복사된다.

이것이 '검색 돋보기' 아이콘을 클릭하기 위해 필요한 XPath 이다.

검색창에 '쏘렌토'를 타이핑

돋보기 버튼을 누르면 아래처럼 검색창이 생기고 여기에 접근하기 위해서는 'name=keyword'에 주목해야 한다.

driver.find_element_by_name()함수를 이용하여 접근할 예정이다.

이후에 더보기 버튼도 위에 진행한 검색 돋보기 버튼과 같이 XPath를 복사하여 수행하면 된다.

 

중고차 리스트의 '사이트 주소'

지난 포스팅에서 단계별로 했던 url 찾기도 이제는 수월하게 할 수 있다. (이번 포스팅이 처음이라면 아래 참조)

2021.05.21 - [SW programming/Python] - [Python 웹 크롤링] Requests 와 BeautifulSoup 의 조합

 

아래와 같이 진행하면 된다.

soup.select_one('ul.imgList01')   

search_result.select('li > a')

그리고 보너스.

보배드림 사이트 글 url의 a href를 보면 온전한 웹 주소의 형태가 아니다.

https://m.bobaedream.co.kr/가 빠져있다... 그래서 보배드림 기본 사이트 url을 앞에 붙여주어야 내가 접속할 수 있는 완전한 url이 된다.

이는 비교적 쉽다. #url 합치기

아래처럼 '+' 연산자를 이용하면 된다.

url = "https://m.bobaedream.co.kr"

link = commu['href']

link = url + link

 

#Selenium 용
from selenium import webdriver
import time
#BeautifulSoup 용
from bs4 import BeautifulSoup

#Selenium_webdriver 위치 지정
driver = webdriver.Chrome('/Users/mac/Downloads/chromedriver')
#Selenium_driver로 url 접속
url = "https://m.bobaedream.co.kr"
driver.get(url)

#Selenium_접속하는 데 시간이 걸릴 수 있으므로 1초 기다림
time.sleep(1)

#Selenium_검색 돋보기 버튼을 클릭하기 위해 활용하는 x_path
x_path = '//*[@id="bobaeHead"]/div[1]/div/div[2]/div[2]/form/div[2]/button/span'
searchbox = driver.find_element_by_xpath(x_path)
#버튼 클릭
searchbox.click()
#검색창에 커서 얹음
element = driver.find_element_by_name("keyword")
#키워드 입력
element.send_keys("쏘렌토")
#버튼 클릭
element.submit()

#Selenium_'더보기' 버튼을 클릭하기 위해 활용하는 x_path
m_morebox = driver.find_element_by_xpath('//*[@id="contents"]/div[6]/a')
#버튼 클릭
m_morebox.click()
#Selenium_1초 기다림
time.sleep(1)

#Selenium_위의 작업이 수행된 후 해당 접속 사이트 url 정보 가져옴(html)
#지난 포스팅에서 사용했던 Requests의 text 함수와 유사한 가능을 함.
html = driver.page_source
#BeautifulSoup_html을 Parsing 함
soup = BeautifulSoup(html, 'html.parser')

#BeautifulSoup_html 정보 분석
#BeautifulSoup_select_one() 함수
search_result = soup.select_one('ul.imgList01')
#BeautifulSoup_select() 함수
commu_list = search_result.select('li > a')

#중고 매물 사이트 5개 추출
links = []
  for commu in commu_list[:5]:
        link = commu['href']
        link = url + link      #href 형태가 보배드림 기본 url이 빠져있어 url 합침
        links.append(link)
print(links)   

 

예시를 통해 Selenium과 BeautifulSoup 함수들을 알아 보았습니다. 

이제 아이디어만 있으면 어디서든 사랑 받는 자동화 웹 크롤링을 만들 수 있을 것 입니다 :)

 

 

위 글이 도움 되셨다면, 광고 한 번만 눌러주세요.

블로그 관리에 큰 힘이 됩니다:)

감사합니다 \( ˆoˆ )/​

반응형

댓글