네이버 금융 주식 가격 - 셀레니움(Selenium) 크롤링 맛보기

Red_Panda·2021년 7월 6일
0

이것저것

목록 보기
1/3

요즘 더워서 그런지 모든게 귀찮다. 따흑~

그래서 당분간은 평소에 해보고 싶었던 것들을 해보려 한다.

오늘은 평소에 궁금했던 크롤링을 잠깐 맛봤다.
간단하게 네이버 금융에서 원하는 주식들의 가격만 가져오는데, 자동으로 뭔가를 하니까 좀 있어보인다.

1. 시작하기

먼저 Selenium을 설치하기 전, 크롬에서 실행할 webdriver를 설치해주어야 한다.

https://sites.google.com/a/chromium.org/chromedriver/downloads
여기서 자신의 크롬과 같은 버전의 파일을 다운 받으면 된다. 저장 위치는 코드에서 지정해주기 때문에 크게 신경쓰지 않아도 된다.

그리고 파이썬에 아래와 같은 코드로 Selenium도 설치해준다

pip install selenium

그럼 준비는 끝났다.

2. 코드작성하기

나는 Pycharm에서 진행했다.

from selenium import webdriver
driver = webdriver.Chrome('C:\stock_venvs\stock_crawling\Lib\site-packages\chromedriver')

driver.get('https://finance.naver.com/')

가장 기본적인 코드인데, 그대로 실행하면 자동으로 크롬이 켜지고, https://finance.naver.com/ 에 접속한다.

그럼 이제 네이버 금융 접속 까지는 확인했다.

다음으로는, 접속 후 원하는 주식을 검색해야한다.


검색창의 속성을 알아내기위에 F12를 눌러 개발자도구를 불러와 위 사진에서 빨갛게 동그라미친 버튼을 눌러, 검색창을 눌러주면 검색창에 대한 값들을 알 수 있다.

나는 name값을 이용하기로 했다.

search_box = driver.find_element_by_name('query') # search_box 값에 엘리먼트 이름이 query인 요소를 저장한다.
search_box.send_keys('005930') # 저장해논 요소에 검색할 내용인 삼성전자를 입력한다.
search_box.submit() # 입력한 값을 보낸다.

여기까지 내용을 입력하고 실행하면 자동으로 크롬을 켜고, 네이버 금융에 접속해 삼성전자를 입력해 검색한다.

<중간 코드>

from selenium import webdriver
import time # 적절한 텀 주기 (텀을 주지 않고 계속 진행할경우, 페이지가 로딩되기전에 값을 가져오려 하는 경우가 발생해 오류 난다.)
driver = webdriver.Chrome('C:\stock_venvs\stock_crawling\Lib\site-packages\chromedriver')

driver.get('https://finance.naver.com/')
search_box = driver.find_element_by_name('query')
search_box.send_keys('005930') # 삼성전자로 검색할경우, 삼성전자 or 삼성전자우 중 선택해야하기 때문에 종목코드로 검색하는 것이 좋다.
search_box.submit() 
time.sleep(2) # 검색 후 2초동안 텀을 주고
driver.quit() # 종료한다.

이제 종목이름과 가격 정보만 가져오면된다.

먼저 아까처럼, 종목이름을 담은 요소를 찾으면 된다.

company_name = driver.find_elements_by_xpath("//*[@id='middle']/div[1]/div[1]/h2/a")

이번에는 xpath를 이용해 값을 가져오도록 해봤다.
이렇게 가져온 값을 종목 이름 리스트에 넣으려면

for i in company_name:
	stock_list.append(j.text)

text를 이용해 text값으로 바꿔준 후 저장해주어야 한다.

다음으로는 가격 정보다.

그런데 가격이 저런식으로 표현되어있다.

find_price_today = driver.find_elements_by_class_name("no_up")
price_list=[]
price = ""

for p in find_price_today: # 가격 값들을 text로 저장, 1개의 값 밖에 없지만 text를 쓰려면 list형태로 하라고 나온다.
	price_list.append(p.text)
# 80900일때 저장되는 값 '8\n0\n9\n0\n0\n'

for pri in range(0, len(price_list[0]), 2): #숫자에 해당하는 인덱스는 0,2,4,,,,다 
	price += price_list[0][pri] 
    # price_list=[['8\n0\n9\n0\n0\n']] 이런식으로 저장된다.
    
if len(stock_price)!=len(find_list):
	stock_price.append(price)
else:
	stock_price[n]=price

그래서 각 가격값들의 상위 클래스인 no_up을 이용해 값을 저장하고 이 값들도 text를 이용해 저장했다.

for n in range(len(find_list)):
	print(stock_list[n]," : ",stock_price[n])

마지막으로 얻어낸 값들을 출력했다.

결과물

일정 시간마다 값을 잘 긁어온다.

문제점도 여러개 있다..

첫번째 문제점 : 값이 수시로 변하는데, 변하는 순간에 값을 긁어오면 값부분을 온전하게 가져오지 못하는 경우가 발생한다..

두번째 문제점 : import keyboard를 이용해 특정 키를 누르면 while을 멈춰야하는데 안먹힌다.

전체코드

import time
from selenium import webdriver
import keyboard
import os
clear = lambda: os.system('cls')

options = webdriver.ChromeOptions()
options.add_argument('headless') # 창 숨기기 옵션

driver = webdriver.Chrome('C:\stock_venvs\stock_crawling\Lib\site-packages\chromedriver',options=options)

driver.get('https://finance.naver.com/')
time.sleep(2)

find_list = ['047810','005930','068290','011000']

stock_list=[]
stock_price=[]

while True:
    if keyboard.is_pressed('f12'): # 안먹힘
        print("pressed f12")
        time.sleep(0.2)
        driver.quit()
        break
    time.sleep(1)
    for n,i in enumerate(find_list):
        search_box = driver.find_element_by_name('query')
        search_box.send_keys(i)
        search_box.submit()
        time.sleep(0.8)
        company_name = driver.find_elements_by_xpath("//*[@id='middle']/div[1]/div[1]/h2/a")
        for j in company_name:
            if j.text not in stock_list:
                stock_list.append(j.text)

        find_price_today = driver.find_elements_by_class_name("no_up")

        price_list=[]
        price = ""

        for p in find_price_today:
            price_list.append(p.text)

        for pri in range(0, len(price_list[0]), 2):
            price += price_list[0][pri]
        if len(stock_price)!=len(find_list):
            stock_price.append(price)
        else:
            stock_price[n]=price

    clear() # 반복적인 출력으로 창이 지저분해지는걸 방지
    print(time.strftime('%c', time.localtime(time.time())))
    for n in range(len(find_list)):
        print(stock_list[n]," : ",stock_price[n])

    time.sleep(3)
profile
신입 개발자

0개의 댓글