검색결과 리스트
전종목시세구하기에 해당되는 글 2건
- 2020.07.08 웹크롤링 네이버 주식 상장기업 주가(셀레나웹드라이버 이용)(2)
- 2020.05.23 웹크롤링 네이버 주식 상장기업 주가
글
웹크롤링 네이버 주식 상장기업 주가(셀레나웹드라이버 이용)(2)
아래글에서 웹크롤링 네이버 주식 상장기업 주가를 얻는 방법에 대하여 설명하였습니다.
원래 의도했던 것은 1번 형식이었으나, 해당 web 페이지에 접속을 하면 default 상태인 2번 형식으로 데이터가 저장이 되었습니다. 다른 방법이 없어서 그냥 2번 형태로 자료를 사용하고 있었는데요.
새로운 로직은 과거 일봉 데이터가 필요합니다. 그래서 xing api를 이용하여 전 종목 일봉 데이터를 매일 받으려고 하니 시간이 너무 많이 걸립니다. 그냥 일봉 데이터만 있으면 되는데, 한번에 전 종목 일봉 데이터를 주는 TR이 없더군요.
그래서 1번 방식으로 데이터를 받을 수 있으면 일봉 데이터 관리를 빨리 할 수 있을 것 같아서 방법을 알아보았습니다.
결론적으로는 Selenium webdriver를 이용하면 1번 형태로 저장할 수 있습니다.
그 과정을 설명합니다.
우선 아래 사이트에서 크롬 browser를 가져와서 적절한 위치에 저장합니다.
Chrom : sites.google.com/a/chromium.org/chromedriver/downloads
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
글
웹크롤링 네이버 주식 상장기업 주가
지난 번에 올린 상승 종목에 이어 전략을 적용하려면 증시에 상장된 모든 종목의 일봉 정보도 필요합니다. 이 정보 역시 naver에서 가져올 수 있습니다.
아래 그림에서 보듯이 네이버에서 가져올 수 있는 정보가 다양합니다만, 한 시점에 6항목을 고를 수 있습니다. default로 설정되어 있는 값은 본인이 원하는 값과 틀린 경우에는 필요한 정보를 선택을 하여야 합니다.
이렇게 웹 페이지에서 원하는 항목을 선택하기 위해서는 webdriver를 설치하여 페이지를 그려야합니다. 브라우저에 따라 webdriver가 있는데 아래는 chrom driver를 사용한 예입니다. chrom driver를 인터넷에서 찾아서 down받은 후 저장된 위치를 지정하여 사용하면 됩니다.
크롬웹드라이버에서 웹 페이지를 읽은 후 원하는 항목을 선택하는 방식을 이용하면 됩니다. 우선 원하는 url을 지정하여 화면에 뜨는 상태를 확인합니다.
우리가 필요한 것은 오늘 일봉 정보가 필요합니다. 즉 시가/고가/저가가 필요합니다. 이를 위하여 필요한 항목을 찾아서 click() 함수를 호출하고, 불필요한 항목을 찾아서 click()함수를 호출하면 원하는 항목으로 변경이 가능합니다.
driver = webdriver.Chrome("C:\\my\\chromedriver.exe")
url = https://finance.naver.com/sise/sise_market_sum.nhn?sosok=1'
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()
이렇게 설정을 하면 아래와 같이 원하는 항목만 선택이 가능합니다.
코스피와 코스닥 정보를 얻을 수 있는 url은 다음과 같습니다.
- 코스피 : https://finance.naver.com/sise/sise_market_sum.nhnsosok=0
- 코스닥 : https://finance.naver.com/sise/sise_market_sum.nhn?sosok=1
한 화면에 보이는 종목의 수는 최대 50개이므로 페이지를 계속 변경해가면서 정보를 크롤링해야합니다.
url에 페이지 정보를 추가할 수 있습니다. page 번호를 증가시키면서 검색을 계속하면 됩니다.
https://finance.naver.com/sise/sise_market_sum.nhn?sosok=1&page=2
이러한 정보를 바탕으로 코스피, 코스닥 전 종목 일봉을 받아오는 크롤링 프로그램을 만들어보겠습니다.
우선 코스피, 코스닥 기본 url을 지정을 합니다. 현재 네이버에서 검색이 가능한 코스피,코스닥 각각의 최대 page 수를 지정합니다. 이후에는 loop를 돌면서 page 수를 증가시키면서 해당 page의 시세 정보를 가져오는 get_stock_list()를 부릅니다.
아래 함수는 특정 url에 있는 주식 시세 정보를 뽑아내는 함수입니다. (자세한 사항은 github 코드 참고)
~~~
def get_stock_list(url, cnt) :
~~~
네이버에서는 최대 6개까지 검색할 항목을 지정할 수 있는데요. 꼭 필요한 정보만 설정을 했습니다. 만약 다른 정보가 추가로 필요하다면 설정을 바꾼 후 한번 더 호출하면 될 것 같습니다.
해당 페이지에서 주식 시세를 뽑는 방법은 이전 글에서 설명한 상승종목 뽑는 방식과 동일합니다. 다만 첫 컬럼에 있는 no 값이 1부터 시작하는 것이 아니라 페이지 별로 50씩 증가하는 값을 입력을 받아서 사용하는 부분만 차이가 납니다.
이렇게 뽑혀진 주식 시세는 별도 파일에 저장하여 향후에 다시 사용합니다. 저장하는 방법은 json 형태로 해도 되고, cvs 형태로 할 수도 있습니다.
소스코드는 git hub에 올려 놓았습니다.
github.com/multizone-quant/system-trading/blob/master/day-bong-list-soup.py
'시스템트레이딩' 카테고리의 다른 글
차트 그릴 때 진입 위치를 표시하는 방법 (2) | 2020.07.22 |
---|---|
웹크롤링으로 관리종목, 거래중지 종목 구하기 (0) | 2020.06.05 |
[파이썬] 요일 찾기에서 주말 건너뛰기 (0) | 2020.05.30 |
[파이썬] Dart 공시정보 API를 이용한 실시간 공시정보 활용 (2) | 2020.05.24 |
웹크롤링 네이버 주식 오늘의 상승종목 (0) | 2020.05.23 |