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

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

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

파이썬을 이용한 주식 데이터 크롤링을 위해 앞에서 사전준비 할 내용과 필요 패키지, 웹 브라우저 자동 실행에 대해서 알아보았다. 이번에는 실행한 웹 브라우저에서 네이버 증권의 체크박스를 해제하는 방법에 대해 알아보겠다.

 

체크박스 해제

네이버 증권에서 선택되어 있는 체크박스를 해제하는 이유는 이후작업에서 내가 원하는 체크박스를 클릭하기 위해서다. 해제를 위해 먼저 증권 페이지가 어떻게 짜여져 있는지 확인이 필요하고, 파이썬의 명령어를 통해 체크박스를 해제해야 한다.

 

html 열기 및 선택

 

네이버 증권의 페이지가 어떻게 구성되어 있는지 확인하기 위해서는 해당 페이지에서 빈곳의 아무데나 마우스 우클릭을 하면 아래 화면의 오른편과 같이 팝업창이 뜨는데 검사를 선택한다.

 

여기서부터 중요한데 사실 html이나 css를 전혀 알지 못하는 나로서는 굉장히 어려운 부분이었다. 사실 파이썬에 대해서 공부하는 것도 어려운데 html이나 css와 같은 부분도 공부해야 된다는 생각에 힘들었다.

 

그래서 그냥 파이썬 외에는 대충 눈으로 익히고 필요한 부분만 대략적으로 이해하고 넘어갔다. 나중에 파이썬을 어느정도 익히고 크롤링을 제대로 해봐야겠다는 생각이 들었을 때 html과 css 부분도 공부해 볼 생각이다.

 

어쨌든 그러면 검사를 누르면 아래와 같은 화면에서 1) 부분을 클릭하고 왼편의 웹페이지에서 2)와 같이 원하는 부분에 마우스를 올려두고 클릭하면 해당 부분의 html부분이 3)번과 같이 색칠되어 보이는 것을 볼 수 있다.

 

여기서 정확히 이해할 수는 없지만 거래량 부분에 마우스를 클릭해봤는데 이 부분은 label이라는 엘리먼트 안에 거래량이라는 이름으로 되어 있는 것을 대략적으로 알 수 있다. 나머지 항목들도 마우스를 올려두면 어떻게 구성되어 있는지 볼 수 있는데, 동일한 구성으로 라벨명만 다르게 설정되어 있는 것을 파악할 수 있다.

 

주의점은 체크박스의 이름들 중 시가총액(억) 등과 같이 단위가 있는 화면의 라벨은 시가총액이라는 라벨명으로 되어 있기 때문에 화면에서 보이는 것과 실제 라벨명이 다르므로 주의해서 봐야한다. 우리는 라벨명을 기준으로 선택하기 때문에 단위가 없는 이름으로 입력해야 한다.

 

 

html 분석하기

사실 나도 html에 대해서는 전혀 모르지만 감으로 생각해 보자면 위의 화면에서 3)번 부분을 보자면 위에 코드를 보면 <tbody> 안에 <tr> 안에 <td>로 구성되어 있는 것을 생각해 볼 수 있다.

 

여기서 <tbody>는 테이블 바디로 전체 테이블 틀이라고 생각해볼 수 있고 <tr>과 <td>는 테이블의 행과 열이라고 생각할 수 있다. 그럼 이 '거래량'이라고 되어 있는 부분은 3)번에서 조금만 윗부분을 보면 <td> 부분의 class 가 choice로 되어 있으면 체크박스가 선택되었다고 파악할 수 있다.

 

또 그 아래줄을 보면 해당 부분의 구성은 type, id, name, value에 있는 값으로 알 수 있으며, 그 아래 label을 통해 어떤 항목의 label인지를 확인할 수 있다.

 

html을 정확히는 모르고 코드를 작성하지는 못해도 이 정도 감은 가질 수 있도록 여러번 보고 감각을 키우는 노력은 필요하다.

 

 

파이썬 코드 적용

이제 체크해제를 위해 html에서 어느 부분을 가져와야 하는지 알아봤으므로 파이썬으로 돌아와 해당 부분을 실행할 수 있도록 코드를 작성해야 한다. 아래 코드를 보며 하나씩 알아보자.

#########################################################################
# 02.증권 페이지 체크박스 항목 해제하기
#########################################################################
# 증권 페이지 체크박스 항목 해제하기
# 크롬에서 마우스 우클릭 ▶︎ 검사
# 마우스를 얹어보면 체크되어 있는 항목은 td.choice, 체크되지 않은 항목은 그냥 td로만 나타남
# 소스코드를 보면 <td class ="choice">로 클래스로 구분되어있음

# 전체 체크박스 목록 가져오기 함수
chkboxs =  browser.find_elements(By.NAME, 'fieldIds') # browser.find_elements : 해당 브라우저에서 엘리먼트를 찾을건데 NAME이 fieldIds인 것을 가져옴
                                                      # 여기서 find_elements로 쓰면 fieldIds가 여러개 있기 때문에 모두 가져오기 위한 것

# 반복문을 통해서 체크박스가 선택되어 있으면 선택해제하는 명령
for chkbox in chkboxs :
    if chkbox.is_selected() : # 체크박스가 체크가 되어있는지 확인하는 명령 for문에 입력한 객체로 넣어주어야 함(chkbox)
        chkbox.click()        # 체크가 된 항목이라면 클릭 명령을 통해 체크 해제

먼저 해당 브라우저에서 name이 'fieldIds'로 되어있는 엘리먼트를 모두 가져온다. 해당 브라우저에 있는 모든 fieldIds를 가져오는 이유는 이 중 체크되어 있는 항목을 보기 위해서다.

 

이 작업을 위해 "chkboxs =  browser.find_elements(By.NAME, 'fieldIds')" 이 코드 부분을 살펴보면 browser.  브라우저 안에 find_elements 모든 엘리먼트를 찾아라. NAME이 fieldIds로 되어있는 모든 엘리먼트를 찾아라 라고 해석할 수 있다. name을 찾기 위해 사용되는 모듈이 By.이라고 생각하면 된다.

 

여기서 파이썬은 대소문자를 구분하는데 위의 코드에서 NAME는 명령어로서 대문자로 써줘야하며 By 역시 대소문자를 잘 구분하여 써줘야 한다. 

 

다음으로 for문을 보면 chkbox라는 변수명에 chkboxs에 있는 요소를 하나씩 집어넣어 반복하라는 코드이다. 현재 chkboxs에는 브라우저에서 name이 fieldIds인 모든 엘리먼트가 들어가 있다. 이 엘리먼트를 for문 아래와 같이 반복하라는 의미이다.

728x90

for문을 보면 일반적인 테이블 형태로 분석했던 사람들은 차이점을 알 수 있는데 엑셀과 같이 테이블 형태로 분석을 해봤던 사람이라면 컬럼명만 넣어주고 가져오라고 하면 되지만 파이썬에서는 리스트 등 여러가지 데이터 형태가 있기 때문에 반복문을 적용해줘야만 해당 자료를 반복하여 가져올 수 있다.

 

또한 반복문 적용을 위해서는 들여쓰기는 필수이다. 들여쓰기를 통해 이 명령문이 어느 수준에서 실행되는지를 판단한다. 아래 있는 if문을 보자면 chkbox에 있는 엘리먼트가 선택되어 있다면 클릭하라는 것이다. 

 

is_selected()와 click()은 명령어이기 때문에 is_selected()는 선택했다, click()은 클릭을 실행이라고 영어 단어 외우듯 외워두자.

 

자 이렇게 위의 명령문을 chkbox에 있는 각 요소마다 반복하면 클릭되어 있는 모든 항목을 클릭했기 때문에 체크박스의 체크가 풀어진 것을 확인할 수 있다.

728x90
반응형

댓글