파이썬(Python)/웹스크롤링

[Python] BS4로 네이버금융 종목분석-재무분석 값 가져오기

끄적끄적아무거나 2021. 10. 27. 08:36
반응형

 

목차

     

     

     

     


     

     

     

    [Python] BS4로 네이버금융 종목분석 : 사용 소프트웨어, 설치

     

     

    이번 포스트에서는 웹스크롤링(Web scrawling) 기술로 네이버금융의 재무제표 항목들을 가져올 것 입니다.

    웹 스크롤링에 이용할 라이브러리는 뷰티풀숩(BeautifulSoup, BS4) 라고 불리는 모듈입니다. 

     

    우선 저는 Visual Studio Code 라는 마이크로 소프트웨어에서 출시한 프로그램으로 파이썬을 작성합니다. 만일 설치가 되어있다면 명령 Prompt에 아래와 같이 입력하면 BS4를 설치할 수 있습니다.

     

    pip install bs4

     

    우선 정상적으로 설치 되었는지 간단하게 확인하는 방법은 아래와 같이 import를 하고 run 시켜 보면 됩니다.

     

    from bs4 import BeautifulSoup

     

    만일 동작을 위해 다른 라이브러리 설치가 필요하다면 에러메세지에 어떤 모듈이 없는 지 나오니 pip install을 사용해서 추가 설치하시면 됩니다. 

     

     

     

     

    [Python] BS4로 네이버금융 종목분석 : 펀더멘털 테이블 값(PER,PBR) 불러오기

     

     

    이번에는 네이버금융(Naver Finance)에서 "카카오" 항목의 펀더멘털 테이블 값(PER,PBR) 값들이 제대로 읽혀 지는지 확인해보겠습니다. 

     

     

     

    해당 페이지는 위와 같고 주소는 "https://finance.naver.com/item/coinfo.naver?code=035720" 입니다. 펀더멘털 아래에 테이블 값들이 있는데 해당 값을 읽을 수 있는지 확인해 보겠습니다. 

     

     

    Code>>

    import requests
    from bs4 import BeautifulSoup
    
    url = "https://navercomp.wisereport.co.kr/v2/company/c1010001.aspx?cmp_cd=005930"
    res = requests.get(url)
    res.raise_for_status()
    
    soup = BeautifulSoup(res.text, "lxml")
    per_value = soup.select("#wrapper > div.fund.fl_le > table > tbody > tr:nth-child(1) > td:nth-child(2)")
    print(per_value[0].text)

     

    결과>>

    IndexError: list index out of range

     

    Result && 주석>>

    라인 4 : 접속할 URL 주소

    라인 5 : request로 주소에 정보 요청

    라인 6 : 응답이 OK로 오지 않을 경우 에러발생

    라인 8 : 응답으로 온 HTML 문서를 사람이 읽을 수 있게 Parser 하는 과정

    라인 9 : bs4의 select를 사용해서 해당 HTML 구문을 가져 옵니다. select 입력 값으로 selector(선택자) 값을 입력하면 됩니다. 

     

    결과는 페이지를 가져 왔으나 IndexError가 발생하였습니다. 이는 내부에 읽을 데이터가 없다고 해석해도 됩니다. 즉, 값을 읽어오지 못한 것입니다. 

    반응형

     

     

    [Python] BS4로 네이버금융 종목분석 : 펀더멘털 테이블 값(PER,PBR) 문제 해결

     

     

    앞서 페이지 값이 제대로 불러올 수 없음을 확인했습니다.

     

    크롬 웹브라우져에서 <f12> 를 클릭하면 오른쪽에 검사 페이지가 생깁니다. 여기서 "Elements" 탭을 클릭해서 상세 페이지 내용을 확인합니다. 

     

     

     

    위 그림처럼 페이지 중간에 iframe 태그로 페이지가 분리되어 있음을 알 수 있습니다. 그리고 iframe내에 새로운 주소 "https://navercomp.wisereport.co.kr/v2/company/c1010001.aspx?cmp_cd=035720" 를 불러 옴을 알 수 있습니다. 해당 페이지를 Web browser로 로딩 하면 아래와 같이 나옵니다. 

     

     

     

     

    그림처럼 테이블을 위한 별도의 페이지가 있음을 확인 했습니다. 이제 해당 페이지의 테이블 값을 불러올 수 있는지 확인해보겠습니다. 

     

     

    Code>>

    import requests
    from bs4 import BeautifulSoup
    
    url = "https://navercomp.wisereport.co.kr/v2/company/c1010001.aspx?cmp_cd=035720"
    
    res = requests.get(url)
    res.raise_for_status()
    
    soup = BeautifulSoup(res.text, "lxml")
    
    per_value = soup.select("#wrapper > div.fund.fl_le > table > tbody > tr:nth-child(1) > td:nth-child(2)")
    pbr_value = soup.select("#wrapper > div.fund.fl_le > table > tbody > tr:nth-child(2) > td:nth-child(2)")
    print("PER : ",per_value[0].text)
    print("PBR : ",pbr_value[0].text)

     

    결과>>

    PER :  354.63
    PBR :  8.60

     

     

    주석>>

    원하는 결과를 불러왔습니다. 라인에 대한 설명은 앞서 코드에서 하였기 때문에 생략하겠습니다. 

     

     

     

     

    [Python] BS4로 네이버금융 종목분석 : 펀더멘털 테이블 값(PER,PBR) 불러오기 주의할 점

     

    해당 코드를 통해 for 문을 사용해서 원하는 정보를 테이블의 행과 열 값을 변경하면서 자동으로 가져 올 수 있습니다. 

     

    주의해야 할 부분은 한번 씩 네이버에서 업데이트를 하기 때문에 주소가 변경 되거나 web 동작 방식이 변경되서 코드가 동작이 안될 수가 있습니다. 이 부분을 인지 하고 그때마다 업데이 하는 습관이 필요 합니다. 

     

    그리고 앞 코드에서 user-agent 에 대해 언급 하지 않았는데 BS4를 사용하면 요청 Request 를 Naver 서버에 보내는 데 이때 요청 문서에 User-agent라는 항목이 있습니다. 해당 내용이 BS4 에서는 임의의 값이 가는 것으로 알고 있습니다. 하지만 저희가 웹브라져로 네이버에 접속하면 저희 컴퓨터에서 user-agent 정보를 제공해서 보냅니다.

     

    이번 예제에서는 문제가 발생하지 않았지만 한번씩 user-agent가 바르지 않으면 차단하는 경우가 있습니다. 

     

    이럴경우 user-agent를 임의로 입력하는 방법이 BS4에는 있습니다. 

     

     

     

    [Python] BS4로 네이버금융 종목분석 : User Agent 확인 및 적용 방법

     

     

    우선 본인 컴퓨터의 user agent 값을 확인 하는 방법은 아래와 같습니다. 

     

     

    위 그림처럼 크롬 브라우져에서 f12 키를 눌러서 위 그림과 같은 화면이 나오면 Console 탭을 클릭하고 그리과 같이 navigator.userAgent 라고 입력하면 아래 빨간색 글씨로 해당 정보가 나옵니다.

     

    이제 해당 내용을 아래와 같이 코드에 적용하시면 됩니다.

     

    Code - User agent 적용>>

    import requests
    from bs4 import BeautifulSoup
    
    url = "https://navercomp.wisereport.co.kr/v2/company/c1010001.aspx?cmp_cd=035720"
    headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"}
    res = requests.get(url, headers=headers)
    res.raise_for_status()
    
    soup = BeautifulSoup(res.text, "lxml")
    
    per_value = soup.select("#wrapper > div.fund.fl_le > table > tbody > tr:nth-child(1) > td:nth-child(2)")
    pbr_value = soup.select("#wrapper > div.fund.fl_le > table > tbody > tr:nth-child(2) > td:nth-child(2)")
    print("PER : ",per_value[0].text)
    print("PBR : ",pbr_value[0].text)

     

     

     

     

    반응형