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

[파이썬] 주식 크롤링 매크로화(2) - 체크박스 해제 함수정의(코드분석)

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

주식 크롤링 매크로화를 위해 앞에서 먼저 사전준비 작업에 대해 알아봤는데, 추가된 패키지에 대해서는 앞에서 간략하게 설명했으므로 패키지의 대한 설명은 실제 코드가 작동하는 단계에서 자세히 알아보고 여기서는 웹 브라우저 부분과 체크박스 해제 부분의 함수정의에 대해 알아보자.

 

 

1. 함수정의란

먼저 함수 정의에 대해 조금 알아보자면 아래 여러줄의 코드를 하나의 명령어로 간단하게 실행할 수 있도록 만드는 것을 말한다. 내가 수행할 작업을 하나의 명령어로 사용할 수 있도록 만드는 것이 사용자 함수정의인 것이다.

 

하지만 함수정의한 부분을 실행한다고 파이썬에서 어떤 결과가 생성되는 것이 아니다. 좀 더 쉽게 말하면 우리가 외부 패키지를 불러왔을 때 어떤 결과가 생성되지는 않았다.

 

불러온 패키지의 명령어를 실행했을 때 어떤 동작을 한다. 차이점은 패키지는 외부에 누군가 정의한 함수 등을 불러오는 것이고, 함수정의는 내가 만들어서 사용하는 명령어라고 생각하면 된다. 

 

함수정의는 크게 매개변수가 없는 함수매개변수가 있는 함수로 나눌 수 있는데 예시를 통해 알아보자.

# 예시 1) 매개변수가 없는 함수정의
# def 함수명()
# 	 print("출력할 내용")

def test() :
	print("출력합니다")
    
# 실행
test()

# 결과
출력합니다


# 예시 2) 매개변수가 있는 함수정의
# def 함수명(매개변수1, 매개변수2, ..)
# 	 print(매개변수1 + 매개변수2)

def test2(a, b) :
    print(a + b)

# 실행
test2(1,2)

# 결과
3

먼저 예시 1)에서는 매개변수가 없는 함수를 생성하는 것이다. 아무런 정보의 변경없이 해당 부분의 코드가 여러군데에서 사용된다면 매개변수 없이 함수정의하는 방법이다.

 

먼저 함수를 정의하기 위해 def를 쓰고 그 옆에 함수명을 사용한다. 함수명은 앞으로 이 함수를 사용하기 위한 명령어라고 생각하면된다. 마지막에는 : 을 붙여준다.

 

다음 줄에는 실제로 함수가 수행해야할 명령어를 입력하는 부분인데 여기서는 꼭 들여쓰기를 해주어야 함수안에 있는 코드로 인식한다.

 

위와 같이 함수를 test라는 이름으로 정의하고 test() 명령문을 통해 실행하면 "출력합니다" 라는 결과가 실행되는 것을 볼 수 있다.

 

다음은 예시 2) 매개변수가 있는 함수정의이다. 마찬가지로 첫줄에는 함수명을 정의한다. 다음은 괄호안에는 매개변수명을 입력하는데, 여기서 매개변수가 필요한만큼 매개변수명을 , 로 구분하여 입력한다.

 

다음은 코드가 실제로 수행해야할 부분은 작성한다. test2()의 괄호안에 1,2의 매개변수를 입력하여 실행하면 a + b를 실행하여 1+2 결과인 3이 출력된다.

 

2. 기존코드 알아보기

함수정의를 위해 기존의 작성했던 코드에서 코스피 페이지 크롤링을 위해 페이지 정보 및 웹 페이지 실행, 체크박스 해제에 대한 부분의 코드에서 함수정의가 필요한 코드와 그렇지 않은 코드를 분류해야 한다.

 

어떤 부분이 함수정의가 필요한 부분이고 그렇지 않을 부분은 어디일까?

 

1) 코스피 페이지 정보 및 브라우저 실행

아래 코드가 기억나는가? 여기서 하나씩 코드를 보면서 함수정의가 필요한 부분을 분류해보도록 하자.

#########################################################################
# 01. kospi 페이지 정보 및 브라우저 실행
#########################################################################
browser = webdriver.Chrome()
browser.maximize_window()
p_url = 'https://finance.naver.com/sise/sise_market_sum.naver?sosok=0&page='   # kospi url 초기값
browser.get(p_url)

 

여기서 첫번째 줄은 크롬 브라우저를 실행하는 명령어다. 첫줄을 실행하면 컴퓨터에 크롬 브라우저가 실행된다. 그러면 이 명령어는 반복할 필요가 있을까? 어차피 브라우저를 띄우는 것을 한번만 하고 그 안에 페이지 정보를 바꾸는 것이기 때문에 반복할 필요가 없다.

 

두번째 줄은 크롬 브라우저 창을 최대창크기로 변경하는 것이다. 이 명령어는 코드를 하나씩 실행하면서 정보를 확인하는데 유용할지 몰라도 완성된 코드의 실행에서는 의미가 없다. 따라서 이 부분은 코드 자체에서 제외한다.

세번째 줄은 웹 주소이다. 필요한 명령어이긴 하지만 한 페이지의 정보를 가져온다면 다른 페이지의 정보가 필요하기 때문에 동일한 페이지의 정보를 반복해서 가져올 필요는 없다.

 

마지막 줄은 세번째 줄의 웹 주소를 웹 브라우저에서 실행하는 명령어다. 세번째 줄의 정보는 웹 주소만 입력했을 뿐 실제로 실행한 것이 아니기 때문이다.

 

2) 체크박스 해제

아래 코드를 간단하게 설명하자면 네이버 증권 페이지에 있는 전체 체크박스 항목에서 선택이 되어있는 항목을 클릭하라는 것이다. 즉, 선택이 되어있는 항목은 클릭하여 선택을 해제하라는 명령문이다. 이 부분은 함수정의가 필요할까?

#########################################################################
# 02.증권 페이지 체크박스 항목 해제하기
#########################################################################
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()        # 체크가 된 항목이라면 클릭 명령을 통해 체크 해제

답은 당연히 yes다. 이유는 네이버 증권에서는 최대 6개까지 체크항목을 선택할 수 있기 때문에 전체 항목을 가져오기 위해서는 체크박스를 선택하고, 해제하고 하는 작업이 여러번 필요하기 때문이다.

 

따라서 위의 코드는 함수정의가 필요한 부분이다. 그러면 앞의 1.함수정의에서 봤듯이 매개변수가 필요한 함수와 아닌 함수가 있었다. 여기서는 어떤 함수정의를 사용해야 할까?

 

내용을 살펴보면 선택되어 있는 항목을 해제하라는 것이기 때문에 굳이 함수 실행에 있어서 정보를 변경할 필요가 없다. 체크가 되어있으면 해제하라 라는 명령문이기 때문이다. 다음 코드를 함수정의하는 것은 간단하다.

def chk_cl_func() :
    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()        # 체크가 된 항목이라면 클릭 명령을 통해 체크 해제
            
            
# 실행
chk_cl_func()

그냥 체크박스 해제 코드 전체를 함수로 정의하면 된다. 이때 함수로 지정한 모든 명령문을 들여쓰기로만 지정해주면 된다. 나는 이 함수에 대한 이름을 chk_cl_func으로 지었다. 이름은 본인이 알아보기 쉽거나 기억하기 쉬운 이름으로 하면 된다.

 

위의 #실행 전까지를 실행하면 chk_cl_func라는 이름으로 함수를 생성하는 것이고, 실제로 이 함수를 실행하기 위해서는 chk_cl_func() 부분을 실행하면 네이버 증권 페이지에서 체크박스 부분이 해제되는 것을 볼 수 있다.

 

3. 생각할 부분

728x90

여기서 지금 코드를 변경하는 것을 이대로 수행하면 된다가 아니다. 함수정의가 필요한 부분과 필요하지 않은 부분을 분류하는 작업이다. 이때 분류하면서 함수정의가 필요한 부분은 함수정의를 하면서 진행한다.

 

함수정의하는 부분은 여러번 반복하면 사용되는 부분이기 때문에 따로 함수정의한 코드만 모아두는 것이 좋다. 그러면서 함수정의가 필요하지 않은 부분의 코드와 정의한 부분의 코드의 순서를 어떻게 할지 생각하면서 만들면 더욱 좋다.

728x90
반응형

댓글