본문 바로가기
방구석코딩/주식 크롤링 분석

[파이썬] 주식 데이터 크롤링(5) - 웹 브라우저 체크박스 선택 (selenium)

by 석세상 2024. 7. 11.
반응형

앞에서 파이썬을 이용하여 주식데이터 크롤링을 위해 체크박스를 해제하는 부분까지 진행하였다. 그러면 이제 웹 브라우저에서 내가 원하는 항목의 체크박스를 클릭하는 방법에 대해 알아보겠다.

 

이미 체크박스를 해제하는 부분을 진행했기 때문에 코드 중 일부는 유사하기 때문에 추가로 작성된 내용을 위주로 알아보자.

 

체크항목 알아보기

우리가 크롤링 하려는 네이버 증권 페이지에서는 총 체크박스 항목이 27개다. 앞에서 항목은 라벨을 기준으로 가져올 것이라고 정의했다. 다른 방법도 있겠지만 여러가지 시도를 해봤는데 모두 실패해서 라벨 기준으로 선택항목을 체크할 것이다.

자 먼저 체크박스를 선택하기 위해 앞에서 봤던  html 부분을 다시 살펴보자.

내가 생각하기에는 라벨보다 value에 있는 값을 기준으로 가져오는 것이 더 안정적으로 생각되지만 가져오는 방법을 잘 모르겠다. 여러가지 시도를 해봤으나 모두 잘 실행되지 않았다. 하지만 실력을 쌓기 위해서는 하나씩 살펴보며 시도해보는 것이 좋다.

 

네이버 증권에서는 총 6개의 항목까지 선택할 수 있다. 전체 항목에 대해 가져오고 싶지만 6개까지가 최대이기 때문에 먼저 6개에 대한 자료를 가져오고 그 다음 6개 항목, ... 순으로 데이터를 가져올 예정이다.

 

html 부분과 이 부분을 파이썬으로 가져오는 건 여전히 잘 이해가 되지 않지만 너무 완벽하게 이해하려고 하면 진행이 전혀 안될 수 있기 때문에 여기저기 자료를 참고하여 그냥 그렇구나 정도로 이해하고 넘어갔다.

 

우리가 필요한 부분이 어떤 부분인지 살펴보자면 라벨, input 부분의 name의 값이다. input의 name이 fieldIds인 것 중 라벨명으로 선택해야한다.

 

자료를 참고해서 여기까지 이해했다면 아래 코드를 보면서 나머지 파이썬 코드에 대해서 알아보도록 하자.

 

파이썬 선택항목 입력 및 적용

앞에서 우리는 라벨명으로 가져오기로 정의했고 총 6개 항목까지 선택이 가능하기 때문에 slct_item이라는 변수명에 6개의 라벨명을 리스트 형태로 순서대로 입력해주었다.

#########################################################################
# 03. 선택항목 입력 및 적용
#########################################################################

# 선택항목
slct_item = ['거래량','시가','고가','저가','매수호가','매도호가']

chkboxs =  browser.find_elements(By.NAME, 'fieldIds')

# 라벨로 가져오려면 현재는 input 부분을 가져왔기 때문에 윗단계인 td로 들어가서 다시 라벨로 내려와서 처리해야 함
for chkbox in chkboxs :
    parent = chkbox.find_element(By.XPATH, '..')            # 윗단계인 td로 가는 명령, XPATH를 이용해서 윗단계로 갈 수 있음, 
                                                            # By는 경로를 이동할 때 사용하는 것으로 보임
                                                            # .. 이 상위 단계로 가는 값으로 보임
    label = parent.find_element(By.TAG_NAME, 'label')       # parent 하위 label 태그를 찾는 방법, TAG_NAME은 명령문으로 봐야함
#    print(label)
#    print(label.text)                                      # 라벨을 잘 불러왔는지 확인용

    if label.text in slct_item :                            # label.text : 라벨이라는 객체안의 text값을 가져옴
        chkbox.click()                                      # 체크박스 체크

# 적용하기 버튼 클릭하기
# 적용하기 버튼을 클릭해야 데이터가 변경됨
button = browser.find_element(By.XPATH, '//a[@href="javascript:fieldSubmit()"]')
button.click()

다음으로 chkboxs 부터 for문까지 체크박스 해제와 유사해 보이지만 다른 점들이 군데군데 보일 것이다.

 

for문 안에 맨 첫줄에 parent라는 변수가 추가되었다. 위의 html 화면 부분을 다시 확인해보자. 체크박스 해제 시 가져온 부분은 input 부분에 있는 name = "fieldIds"를 가져왔다. 하지만 이번에는 input 아랫줄에 있는 라벨 부분의 정보를 가져와야 한다.

잘 살펴보면 <td>안에 input 부분과 label 부분이 포함되어 있는 것을 볼 수 있다. 따라서 라벨의 정보를 가져오기 윗 단계인 <td>부분으로 이동했다가 그 아래 있는 label 부분으로 이동해야 한다. 이를 위해서는 By 모듈의 XPATH라는 함수를 통해 경로를 이동해야 한다. 

 

좀 더 자세히 살펴보면 chkboxs는 input이 있는 NAME이 있는 경로에 있다. 그래서 label을 사용하기 위해서는 XPATH를 이용해 상위 단계인 <td> 부분으로 이동한다.

 

다음으로 parent = chkbox.find_element(By.XPATH, '..') 다음과 같은 명령어를 쓰면 chkbox 엘리먼트가 있는 상위 단계로 이동한다. '..'을 입력하면 상위단계로 올라갈 수 있다.

 

여기까지 진행되었다면 다시 label 부분으로 내려와야 한다. 이렇게 이동하는 방법은 By.TAG_NAME으로 이동하는 것이다.  label = parent.find_element(By.TAG_NAME, 'label')를 쓰면 parent에서 TAG_NAME이 label인 부분을 찾는다.

 

잘 모르는 내용을 자료를 찾아서 따라하다 보면 중간에 생성되는 변수들을 확인하면서 넘어가는 것이 좋다. 여기서 주석으로 처리된 print(label)을 실행하여 label 이라는 변수에는 어떤 정보가 들어있는지 확인해봤는데 아래와 같은 결과로 어떤 정보인지 잘 모르겠다. 

내가 이해하기 어려운 영역이니 일단 넘어가고 if 부분에 보면 label.text라고 되어 있는데 이 부분도 주석으로 처리된 print(label.text)를 실행했더니 아래와 같은 결과가 나타났다. 내가 원하는 정보가 생성된 것을 볼 수 있다.

위의 생성된 label 이라는 부분에서 함수를 이용해 text 부분을 가져온다는 것 같은데 나에게 이해하기는 조금 어려운 부분인것 같다. 아무튼 원하는 정보를 얻었으니 다음 부분으로 넘어가자.

 

if 부분을 보면 label.text에 앞에서 slct_item에 정의한 항목을 넣어서 클릭하라는 명령을 한다. 그러면 거래량부터 매도호가까지 체크박스가 선택되는 것을 볼 수 있다.

 

하지만 여기까지 실행했다면 체크박스는 변했지만 아래 종목별 데이터가 시가총액, 상장 주식수, ...와 같이 기존의 선택된 정보라는 것을 볼 수 있다. 이유는 적용하기 버튼을 누르지 않아서 데이터가 변경되지 않은 것이다.

따라서 데이터를 변경하기 위해서는 적용하기 버튼을 클릭하는 명령문이 필요하다.

 

적용하기 버튼 클릭하기

앞의 파이썬 코드에서 맨 아래 두줄인 button 부분이 다음과 같이 작성되어 있다. browse.find_elements 부분의 내용을 찾아야 한다.

button = browser.find_element(By.XPATH, '//a[@href="javascript:fieldSubmit()"]')
button.click()

 

이 부분을 살펴보자면 실행한 브라우저(browser.)인 네이버 증권 페이지에서 적용하기 버튼의 부분을 찾을텐데 첫부분에서 체크항목을 찾을때와 마찬가지로 적용하기 부분에 마우스를 클릭하여 해당부분을 찾는다.

 

그러면 아래와 같이 코드 부분이 보일텐데 여기서 보면 적용하기는 이미지이고 그 윗부분에 보면 <a href= ~~>로 되어있다. 여기서 a 는 링크를 입력할 때 사용되는 명령어이고, href는 이동하는 주소에 해당하는 부분이다.

 

파이썬에서 해당 html을 적용하기 위해서는 '//a[@href="javascript:fieldSubmit()"]'와 같이 입력해야 한다. 이 부분은 파이썬에서 a 태그를 적용하기 위해서는 이렇게 써야한다는 문법이므로 외워두도록 하자.

728x90

그 아래 button.click() 부분은 이전에 공부했던 체크해제와 동일한 명령어이므로 넘어가자. 이와 같이 실행해주면 앞에서 선택한 slct_item의 항목들이 적용하기 버튼까지 눌러서 아래 종목의 항목들의 데이터 값이 변경된 것을 볼 수 있다.

나같은 경우에는 html이나 이런 경로 이동 등에 대해서는 이해하기 어렵기 때문에 모든 부분을 이해하고 넘어가기 보다는 아무리봐도 잘 모르는 부분은 위의 코드를 하나씩 실행하면서 이럴땐 어떤 결과가 생성되는구나 하고 넘어간다.

 

이렇게 경험이 쌓이다 보면 언젠가 잘 모르는 부분에 대해서도 이해할 날이 올거라 본다.

728x90
반응형

댓글