셀레니움?
-> 단위 테스트
크롤링 남의 것 가져오는것
Selenium은 웹 애플리케이션을 위한 테스팅 프레임워크입니다.
자동화 테스트를 위해 여러 가지 기능을 지원합니다. 다양한 언어에서도 사용이 가능합니다.
Beautiful Soap는 웹사이트에서 버튼을 클릭해야 얻을 수 있는 데이터라던가, Javascript 에 조건이 충족되어야만 얻을 수 있는 데이터에 접근하는 것에 한계가 있습니다.
그래서, 직접적으로 웹 사이트에 접근할 수 있게 해주는 Selenium을 사용해야 합니다. 새로운 환경에서 웹 브라우저를 대신해 줄 Web Driver가 필요합니다. Web Driver를 눌러 설치를 합시다. Web Driver는 Selenium이 사용할 웹 브라우저이고, Selenium으로 자동화하여 웹 사이트를 탐험하면 됩니다.
설치 conda install selenium
참고 : https://beomi.github.io/2017/02/27/HowToMakeWebCrawler-With-Selenium/
참고: Selenium의 버전은 자주 업데이트 되고, 브라우저의 업데이트 마다 새로운 Driver를 잡아주기 때문에 항상 최신버전을 깔아 주는 것이 좋다.
요즘은 다 막아둬서 셀리니움을 쓰는 것
로그인 회피 기능?
그래서 단위테스트가 아니라 크롤링할때 쓰기 시작함.
Chrome WebDriver
크롬을 사용하려면 로컬에 크롬이 설치되어있어야 한다.
그리고 크롬 드라이버를 다운로드 사이트 : https://sites.google.com/a/chromium.org/chromedriver/downloads
크롬 설정 - 도움말 - 크롬 정보 4자리 숫자가 중요하다
크롬을 단위테스트 도구로 쓸 수 있게 하는 녀석이다.
그냥 귀찮으니까 동일 위치에 넣어주자
필드하나, 삼성전자 필드 가격
stock
주식이름, price, 시간 YYYYMMDD H24MM
import time
from datetime import datetime
from selenium import webdriver
import pymssql
conn = pymssql.connect(server="127.0.0.1", user="sa", password="java", database="mypy")
cursor = conn.cursor()
driver = webdriver.Chrome('chromedriver')
driver.implicitly_wait(3)
# url에 접근한다.
driver.get('https://finance.naver.com/item/sise.nhn?code=005930')
while True:
# val = driver.find_element_by_name('id').send_keys('_nowVal')
nowVal = driver.find_element_by_id('_nowVal').text
s_name = "삼성전자"
s_code = "005930"
s_price = nowVal.replace(",","")
in_time = datetime.today().strftime("%Y%m%d.%H%M")
print(s_name, s_code,s_price,in_time)
sql =""
sql +="insert into stock (s_name, s_code, s_price, in_time) values "
sql += "(%s,%s,%s,%s)"
print(sql)
print(len(in_time))
cursor.execute(sql,(s_name,s_code,s_price,in_time))
conn.commit()
time.sleep(60)
# 새로고침
driver.refresh()
conn.close()
주식 동향 사이트 : http://vip.mk.co.kr/newSt/rate/item_all.php
여러개 안받아져서 참고한 사이트, 알고보니 s가 붙는 함수가 또 따로 있었다는 것
참고 : https://liveyourit.tistory.com/17
그 밑에 속성을 가져오기
참고 : https://riptutorial.com/ko/selenium/example/30747/selenium%EC%97%90%EC%84%9C-webelement%EC%9D%98-%EC%86%8D%EC%84%B1-%EA%B0%80%EC%A0%B8-%EC%98%A4%EA%B8%B0
mytitle = driver.find_element_by_class_name('st2').find_element_by_tag_name('a')
mytitle.get_attribute('title')
#get_attribute('속성명')
1분 단위 주식 가져오기 완성 코드
import time
from datetime import datetime
from selenium import webdriver
import pymssql
conn = pymssql.connect(server="127.0.0.1", user="sa", password="java", database="mypy")
cursor = conn.cursor()
driver = webdriver.Chrome('chromedriver')
driver.implicitly_wait(3)
# url에 접근한다.
driver.get('http://vip.mk.co.kr/newSt/rate/item_all.php')
while True:
# st2 클래스가 있는 td의 title이 회사 코드임. 그리고 text가 회사명
company = driver.find_elements_by_class_name('st2')
for com in company:
s_name = com.text
# a태그 안의 회사 코드 가져오기
s_code = com.find_element_by_tag_name('a').get_attribute('title')
s_price = driver.find_element_by_class_name('st2').find_element_by_xpath('..').find_elements_by_tag_name('td')[1].text.replace(',','')
in_time = datetime.today().strftime("%Y%m%d.%H%M")
print(s_name, s_code,s_price,in_time)
sql = ""
sql +="insert into stock (s_name, s_code, s_price, in_time) values "
sql += "(%s,%s,%s,%s)"
cursor.execute(sql,(s_name,s_code,s_price,in_time))
conn.commit()
time.sleep(60)
# 새로 고침
driver.refresh()
conn.close()