Welcome! 🙋‍♂️ View more

Engineering 💻/Python

[Python] 크롤링 방법과 비교 (requests, BeautifulSoup, selenium)

DeepFlame 2022. 2. 17. 23:04

Python에서 웹 크롤링을 하는 방법은 두 가지가 있다. 

  1. requests 라이브러리로 웹 정보를 받고, BeautifulSoup로 파싱한다. 
  2. selenium 라이브러리로 브라우저를 열어 웹 정보를 받는다. 

 

보통 웹 컨트롤이 필요할 경우(클릭)에는 selenium을 활용하고, 그렇지 않다면 requests 방법을 이용하는 것이 일반적이다. 

왜냐하면 selenium은 웹 브라우저를 여는 과정에서 많은 시간이 소요되기 때문에 비교적 속도가 빠른 requests가 좀 더 유리하기 때문이다. 

 

🤔 궁금한 것

그렇다면.... 만약 웹 컨트롤이 필요해서 selenium을 통해 웹 브라우저를 열어놓은 상태에서 웹 정보를 어떻게 가져오는 게 더 빠를까? 

이번에는 그것을 알아볼 것이다. 

 

👀 실험 준비

이번에 크롤링할 대상은 삼성전자 종목 토론실이다. 여기서 표시된 빨간색 네모 박스를 가져올 것이다. 

오늘도 평화로운 종목토론실...

웹에서 원하는 요소를 가져오는 방법은 여러가지가 있다. (xpaths, tag name 등등...) 이번에는 selector를 사용할 것이다. 해당 요소는 아래와 같이 구할 수 있고, 해당 요소는 #content > div.section.inner_sub > table.type2 > tbody 이다.

 

Chrome 브라우저 + F12

 

 

1. requests


url = 'https://finance.naver.com/item/board.naver?code=005930'
r = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})
soup = BeautifulSoup(r.content, 'html.parser')
table = soup.select_one('#content > div.section.inner_sub > table.type2 > tbody')

위와 같이 구현했고, 0.988초의 결과를 얻었다. 요소를 찾는 작업은 정말 짧은 시간에 수행된다. 웹 정보를 가져오는 작업과 정보를 파싱하는 작업이 대부분의 시간을 차지하는 것을 알 수 있다. 

그렇다면 selenium은 어떨까? 

 

 

2. selenium


start_time = time.time()
url = 'https://finance.naver.com/item/board.naver?code=005930'
driver = webdriver.Chrome('./data/chromedriver.exe')
driver.get(url)
table = driver.find_elements_by_css_selector('#content > div.section.inner_sub > table.type2 > tbody')
driver.quit()

결과는 약 4.655초... 가 나왔다. requests와 비교했을 때 5배 정도 차이가 난다. 브라우저가 열고 닫히는 과정에서 많은 시간이 소요되는 것은 맞으나, 순수 요소를 찾는 시간이 4배 차이가 나는 것을 알 수 있다.

아무래도 selenium에서는 요소를 가져올 때, 웹 컨트롤을 위한 정보를 가져오기 때문에 시간 차이가 나는 것으로 예상된다. 

 

 

3. 결론


  1. requests 라이브러리로 웹 정보를 받고, BeautifulSoup로 파싱한다. 👉 0.988초
  2. selenium 라이브러리로 브라우저를 열어 웹 정보를 받는다. 👉 4.655초

웹 컨트롤이 필요해서 selenium으로 웹 브라우저를 열어 아까울 수 있으나, requests로 웹 정보를 다시 불러와 요소를 찾는 것이 훨씬 빠르다. 🤗