티스토리 뷰

반응형
1. 네이버 주식 시가총액 목록 가져오기 (https://finance.naver.com/sise/sise_market_sum.nhn)


2. 기업 별 상세 재무 데이터 가져오기 (https://finance.naver.com/item/main.nhn?code=기업코드)
  - def getDataOfParam(param)


3. Python Dictionary 사용하여 데이터 정리


4. 원하는 데이터 지표 추출 (매출액, 영업이익, 당기순이익, ROE, PER, PBR)
  - def printRecommendedItems(stock):


5. 추출 데이터 메일로 자동 전송하기
  - def sendEmailfunc(text):

의 5단계를 통해서 네이버 주식정보 가져오는 방법을 포스팅 하려고 한다. 

 

두번째 기업 별 상세 재무 데이터를 가져오기 위해서는 

URL :https://finance.naver.com/item/main.nhn?code=기업코드 페이지에서 정보를 얻을 수 있다. 

 

시가총액 > 종목명에 연결되어 있는 하이퍼링크

이 데이터를 가져오기 위해서는 먼저 코스피 상위 주소 링크를 아래와 같이 가져온다.

url = "https://finance.naver.com/sise/sise_market_sum.nhn
res = requests.get(url)
soup = BeautifulSoup(res.text, 'lxml')



stockTop50_corp = soup.find(
"table", attrs={"class": "type_2"}).find("tbody").find_all("a", attrs={"class": "tltle"})

soup 객체에서 적절한 경로를 찾기 위해서는 앞장에서 설명한바와 같이 개발자 모드에서 html 구조를 통해 확인 할 수 있다.

table(class:type_2) => tbody => 모든 a tag 검색

위 코드를 통해서 stockTop50_corp 에는 코스피 상위 50개의 <a> ...</a> 내의 모든 값이 들어가게 된다. 

 

다음 구조는 아래와 같이 구성된다.

for index, stock in enumerate(stockTop50_corp):
     ...
     link = "https://finance.naver.com/"+stock["href"]     # a tag 내에서 "href" 속성값을 가져온다.
     
    sub_res = requests.get(link)                                 # 링크를 통해 우리가 원하는 기업별 데이터 페이지 데이터 크롤링
    sub_soup = BeautifulSoup(sub_res.text, 'lxml')

 

기업별 페이지로 이동한 후에 우선 가져오고 싶은 데이터는 아래 그림의 표 내용("기업실적분석")이다.

기업실적상세 지표 열람 가능 : 최근 4년간, 최근 6개 분기 데이터 확인 가능

개발자 모드에서 이 화면의 HTML 구조를 확인해보면, table > tbody > tr > th 내에서 <strong> 태그 내에서 우리가 원하는 값을 나타내고 있었다. 하지만 다양한 시도를 했었지만, 결국은 이 페이지 내에서 <strong> 태그 내 "매출액"이라는 값을 나타내는 부분만 한정하면 이 값을 가져올 수 있었기 때문에 간단하게 아래 코드로 해당 row 값을 가져올 수 있었다.  

 

여기에서 우리가 결국 가져오고 싶은 값은 매출액에 해당하는 ..tbody > tr > td 에 있는 각각의 값이다. 

이에, strong text인 매출액을 한정 후 > parent 노드로 이동하여, 모든 td를 가져오는 구조로 구현하였다. 

 

 <strong> 태그를 통해 원하는 값 한정

 

 

ParamList = ['매출액', '영업이익', '당기순이익', 'ROE(지배주주)', 'PER()', 'PBR()']

for idx, pText in enumerate(ParamList):

    param = " ".join(sub_soup.find('strong', text=pText).parent['class'])

    getDataOfParam(param)

param에 parent 노드로 이동하여, 상위 th element 로 이동하는 코드이다. 결국 반환값은 th의 class 값인

"h_th2 th_cop_anal8"를 리턴한다. join 함수를 통해 결합시킨 이유는 클래스명이 자세히 보면 h_th2 값과 th_cop_anal8값으로 두개의 클래스값을 가지고 있기 때문이다.

 

이후에는getDataOfParam(param) 함수를 통해 각각의 원하는 param 의 실제 값(매출액 데이터) 을 가져오는 함수를 실행한다.

 

getDataOfParam(param)의 동작방식은 간단히 아래와 같다.

중요한 포인트는 th의 레벨과 td의 레벨이 같기 때문에 한단계 상위로 올라가야 한다는 점이다.

def getDataOfParam(param):

     sub_tbody = sub_soup.find("table", attrs={"class": "tb_type1 tb_num tb_type1_ifrs"}).find("tbody")
     sub_title = sub_tbody.find("th", attrs={"class": param}).get_text().strip()

     #param 에 매핑되는 row 검색 => 상위 이동 => 해당 row의 모든 td 컬럼 가져오기
     dataOfParam = sub_tbody.find("th", attrs = {"class":param}).parent.find_all("td")

     value_param = [i.get_text().strip() for i in dataOfParam]
    
     print(sub_title, " : ",value_param)


     return value_param 

이 함수에서의 주요 기능은 "h_th2 th_cop_anal8" 클래스명을 찾아 상위 element 로 이동 후 > 하위의 모든 td element 값을 가져와서 list에 넣는 것이다. 

#출력값
매출액 : 
['2,395,754', '2,437,714', '2,304,009', '2,384,040', '620,035', '598,848', '553,252', '529,661', '669,642', '631,513']

이렇게 동일한 방식으로 각 시기별 매출액 및 원하는 데이터를 얻을 수 있다. 

 

#앞서 계속 설명한 내용과 비슷하게 각 시기정보(연간, 분기 년월 정보)를 가져오기 위해서는 아래와 같이 작성하였다.

sub_thead = sub_soup.find("table", attrs={"class":"tb_type1 tb_num tb_type1_ifrs"})
if sub_thead is not None:
     sub_thead = sub_thead.find("thead").find_all("th", attrs={"scope":"col", "class":""})
else:
     continue
print ([i.get_text().strip() for i in sub_thead])

최대한 구현했던 절차와 코드를 조합하여 설명을 하려하지만, 아직 포스팅이 익숙치 않아서 읽는 분들이 조금이라도 불편한 부분이 있으면 댓글 부탁드립니다.^^

 

좀 더 풀어서 설명드리겠습니다.

 


[다음글] [PYTHON] 네이버 주식정보 가져오기 (3/4)

 

[PYTHON] 네이버 주식정보 가져오기 (3/4)

1. 네이버 주식 시가총액 목록 가져오기 (https://finance.naver.com/sise/sise_market_sum.nhn) 2. 기업 별 상세 재무 데이터 가져오기 (https://finance.naver.com/item/main.nhn?code=기업코드) - def getDat..

cocoabba.tistory.com

[Python] BeautifulSoup find return None 처리

 

[Python] BeautifulSoup find return None 처리

네이버 증권 페이지에서 시가총액 순으로 다양한 지표를 불러와서 원하는 데이터를 얻기 위한 스크랩핑 과정에서 발생한 에러 처리 내용 공유 하고 싶은 과제 : 네이버 증권에서 finance.naver.com//i

cocoabba.tistory.com

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함