2020-11-27 python Selenium 주식 크롤링

jsbak·2020년 11월 27일
0

PYTHON

목록 보기
12/24

셀레니움?
-> 단위 테스트

크롤링 남의 것 가져오는것

Selenium

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를 잡아주기 때문에 항상 최신버전을 깔아 주는 것이 좋다.

요즘은 다 막아둬서 셀리니움을 쓰는 것
로그인 회피 기능?
그래서 단위테스트가 아니라 크롤링할때 쓰기 시작함.

webdriver 설치

Chrome WebDriver
크롬을 사용하려면 로컬에 크롬이 설치되어있어야 한다.

그리고 크롬 드라이버를 다운로드 사이트 : https://sites.google.com/a/chromium.org/chromedriver/downloads
크롬 설정 - 도움말 - 크롬 정보 4자리 숫자가 중요하다

크롬을 단위테스트 도구로 쓸 수 있게 하는 녀석이다.


그냥 귀찮으니까 동일 위치에 넣어주자

  • url 접근하는 메서드 : get('http://url.com')
  • 페이지의 단일 element에 접근하는 메소드
    • find_element_by_name('HTML_name')
    • find_element_by_id('HTML_id')
    • find_element_by_xpath('/html/body/some/xpath')
    • find_element_by_css_selector('#css > div.selector')
    • find_element_by_class_name('some_class_name')
    • find_element_by_tag_name('h1')
  • 여러개의 element 가져오기
    • find_elements_by_css_selector('#css > div.selector')

삼성전자 주식 해보기?

필드하나, 삼성전자 필드 가격
stock
주식이름, price, 시간 YYYYMMDD H24MM

인공지능의 화두는 주식?

삼성전자 주식 DB 저장

참고 : https://yjshin.tistory.com/entry/Python-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9B%B9-%ED%81%AC%EB%A1%A4%EB%A7%81-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EC%A3%BC%EA%B0%80-%EC%A0%95%EB%B3%B4-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0

과제

1. 셀레니움 이용해서 삼성전자 주식 DB에 넣기

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()

2. 전체 주식 DB에 넣기

주식 동향 사이트 : 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()
profile
끄적끄적 쓰는곳

0개의 댓글