Colab

셀레니움 웹 크롤링 방법

셀레니움을 활용하여 finviz사이트의 S&P 500 Treemap을 가져오는 크롤링하는 방법을 알려드리겠습니다.

혹시 셀레니움이 뭔지 모르신다면 이전 포스팅을 먼저 읽어보고 오시는것을 추천드립니다.

셀레니움 포스팅 ☞ 바로가기

Anaconda 설치 후 주피터 노트북에서 실습하거나 Colab에서 실습해보실 수 있습니다.

finviz S&P 500 Treemap 데이터 크롤링 하기

https://finviz.com/map.ashx

finbiz사이트의 Maps 탭

finbiz사이트는 유명한 미국 주식에 대한 실시간 정보를 편리하게 확인할 수 있습니다.
그중 Maps 탭에서 “Share Map”버튼을 누르면 생성되는 이미지를 크롤링 해오는 실습을 한번 해보겠습니다. 이 주소는 “Share Map”버튼을 누를 때 마다 생성이 되기 때문에, 기존의 크롤링 방법으로는 데이터를 가져오기 어렵고 셀레니엄과같은 브라우저 자동화 툴을 이용해 가져올 수 있습니다.

1) 셀레니움 드라이버 실행

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

service=Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
driver

2) 페이지 방문, 요소 클릭(click)

driver.get('<https://finviz.com/map.ashx>')

from selenium.webdriver.common.by import By

button = driver.find_element(By.XPATH, "//div[contains(text(), 'Share map')]")
button.click()

참고로, 해당 버튼에 대한 XPATH 정보는 크롬의 개발자도구 (F12키 누르면 나옴)에서 아래 빨간색 동그라미 버튼을 누른 후, 브라우저에서 “Share map”컴포넌트를 클릭하면 해당 컴포넌트에 대한 html스크립트를 확인할 수 있고, 해당 스크립트에서 COPY > XPath를 따로 복사할 수 있습니다.

어떤 사이트든 동일한 방법으로 XPath를 가져올 수 있습니다.

3) 페이지 소스에서 이미지 URL 가져오기

from bs4 import BeautifulSoup
soup = BeautifulSoup(driver.page_source, features='html5lib')
img = soup.find('img', {'alt':'S&P 500 Map'})
treemap_url  = img['src']
treemap_url 

4) 이미지 URL을 읽어 이미지로 저장

import requests

r = requests.get(treemap_url, headers={'User-Agent':'Mozilla/5.0'})
with open('finviz_map.png', 'wb') as f:
    f.write(r.content)

전체 코드

import time
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By

# 1) webdriver 실행 (headless)
service=Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)

# 2) 페이지 방문, 요소 클릭(click)
driver.get('<https://finviz.com/map.ashx>')
button = driver.find_element(By.XPATH, "//div[contains(text(), 'Share map')]")
button.click()
time.sleep(3)

# 3) 페이지 소스에서 이미지 URL 가져오기
soup = BeautifulSoup(driver.page_source, features='html5lib')
img = soup.find('img', {'alt':'S&P 500 Map'})
treemap_url  = img['src']

# 4) 이미지 URL을 읽어 이미지로 저장
r = requests.get(treemap_url, headers={'User-Agent':'Mozilla/5.0'})
with open('finviz_map.png', 'wb') as f:
    f.write(r.content)

driver.close()
from IPython.display import display
from PIL import Image
 
display(Image.open('finviz_map.png'))

zerg96

Recent Posts

노트북(윈도우)에서 아이폰 유선 테더링 하기

윈도우 운영체제의 노트북에서는 iPhone 유선 테더링이 잘 안되는 경우가 많습니다. 보통 iPhone의 드라이버가 설치가 안되있어서인…

3일 ago

오라클 래치(Latch)

오라클 데이터베이스의 성능을 논할 때, 내부적으로 발생하는 경합(Contention)은 피할 수 없는 주제다. 특히 다수의 프로세스가…

1주 ago

사장님도 3표, 나도 3표? ‘3%룰’ 완전 정복!

안녕하세요, 혹시 이런 생각해 본 적 없으신가요? "내가 투자한 회사는 누가 감시하고, 어떻게 운영될까?" 오늘은…

3주 ago

Vector Store(벡터 스토어)

'벡터 스토어' 완벽 가이드: AI 시대, 데이터의 새로운 심장을 만나다 IT 업계는 인공지능(AI)이라는 거대한 패러다임의…

3주 ago

Gemini CLI (재미나이 CLI)

1. Gemini CLI란 무엇인가요? Gemini CLI는 터미널 환경에서 직접 Gemini 모델과 상호작용할 수 있도록 만들어진…

3주 ago

과적합 (overfitting)

과적합은 머신러닝에서 학습용데이터를 과하게 학습하여, 실제데이터를 예측하지 못하는 현상을 말합니다. 인공지능(AI)의 학습 방법은 우리가 시험공부를…

1개월 ago