아래글에서 웹크롤링 네이버 주식 상장기업 주가를 얻는 방법에 대하여 설명하였습니다.

money-expert.tistory.com/7

 

웹크롤링 네이버 주식 상장기업 주가

지난 번에 올린 상승 종목에 이어 전략을 적용하려면 증시에 상장된 모든 종목의 일봉 정보도 필요합니다. 이 정보 역시 naver에서 가져올 수 있습니다. 코스피와 코스닥 정보를 얻을 수 있는 url��

money-expert.tistory.com

 

원래 의도했던 것은 1번 형식이었으나, 해당 web 페이지에 접속을 하면 default 상태인 2번 형식으로 데이터가 저장이 되었습니다. 다른 방법이 없어서 그냥 2번 형태로 자료를 사용하고 있었는데요. 

 

 

새로운 로직은 과거 일봉 데이터가 필요합니다. 그래서 xing api를 이용하여 전 종목 일봉 데이터를 매일 받으려고 하니 시간이 너무 많이 걸립니다. 그냥 일봉 데이터만 있으면 되는데, 한번에 전 종목 일봉 데이터를 주는 TR이 없더군요.

 

그래서 1번 방식으로 데이터를 받을 수 있으면 일봉 데이터 관리를 빨리 할 수 있을 것 같아서 방법을 알아보았습니다.

 

결론적으로는 Selenium webdriver를 이용하면 1번 형태로 저장할 수 있습니다.

 

그 과정을 설명합니다.

 

우선 아래 사이트에서 크롬 browser를 가져와서 적절한 위치에 저장합니다.

Chrom : sites.google.com/a/chromium.org/chromedriver/downloads

 

Downloads - ChromeDriver - WebDriver for Chrome

WebDriver for Chrome

sites.google.com

 

1. 다운 받은 webdriver를 생성합니다.

driver = webdriver.Chrome("C:\\my\\chromedriver.exe")

 

2. 시세 정보를 주는 페이지에 접속하여 html 정보를 얻습니다. 이후 선택할 항목과 선택하지 않을 항목을 강제적으로 click하게 합니다. 이때 원하는 항목을 찾아야 하는데요. 찾는 방법은 여러가지가 있습니다. 만약 text 정보가 중복되지 않는다면 find_element_by_xpath() 함수를 이용하면 됩니다.

 

"시가"의 경우에는 중복되는 항목이 많아서 직접 id를 이용하여 찾습니다.

 

 

항목을 찾은 후 click()이라는 함수를 부르면 선택/비선택이 toggle됩니다. 즉 기존에 선택이 되어 있었으면 선택되지 않은 상태로, 선택되지 않았다면 선택된 상태로 바꿉니다.  이후 적용하기 버튼을 찾아 click을 합니다. 

 

def open_naver_stock_page(driver, url) :

  driver.get(url)

  driver.find_element_by_xpath(".//*[contains(text(), '고가')]").click()

  driver.find_element_by_id("option7").click() # 시가

  driver.find_element_by_xpath(".//*[contains(text(), '저가')]").click()

  driver.find_element_by_xpath(".//*[contains(text(), '외국인비율')]").click() # 삭제

  driver.find_element_by_xpath(".//*[contains(text(), '상장주식수')]").click() # 삭제

  driver.find_element_by_xpath(".//*[contains(text(), 'ROE')]").click() # 삭제

 

  driver.find_element_by_css_selector('[alt="적용하기"]').click()

 

한 페이지에는 50개 종목씩 나옵니다. 한 페이지에 있는 정보를 모두 읽은 다음에는 다음 페이지 정보를 얻어야 하는데요. 앞에서 버튼 누른 것과 비슷한 방식을 사용합니다.

 

다행히 숫자로 찾으면 되는 상황이군요.  해당 페이지는 링크로 연결되어 있습니다. 따라서 find_element_by_link_text라는 함수를 이용하여 click을 합니다.

 

driver.find_element_by_link_text(str(i)).click()

 

10페이지가 넘으면 "다음" 이라는 버튼을 눌러야 11페이지부터 나옵니다.  비슷한 방식으로 '다음' 버튼에 해당하는 정보를 찾아 click을 호출해줍니다.

 

driver.find_element_by_link_text('다음').click()

 

 

selenium webdriver를 처음 사용해보았는데, 아주 강력한 능력을 가지고 있는 것 같습니다. 임의의 웹페이지에서 자동으로 입력도 하고, 선택도 하고, click도 할 수 있습니다.

 

이 방법을 응용하면 xing api가 지원하지 않는 증권사 웹 사이트에서 주문을 낼 수도 있을 것 같습니다. 이건 다음 기회에 방법을 알아보도록 하겠습니다.

 

이와 관련된 소스는 아래 github에 올려놓았습니다. 

 

https://github.com/multizone-quant/system-trading/blob/master/day-bong-list-soup.py

반응형

설정

트랙백

댓글