티스토리 뷰
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 구조를 통해 확인 할 수 있다.
위 코드를 통해서 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') |
기업별 페이지로 이동한 후에 우선 가져오고 싶은 데이터는 아래 그림의 표 내용("기업실적분석")이다.
개발자 모드에서 이 화면의 HTML 구조를 확인해보면, table > tbody > tr > th 내에서 <strong> 태그 내에서 우리가 원하는 값을 나타내고 있었다. 하지만 다양한 시도를 했었지만, 결국은 이 페이지 내에서 <strong> 태그 내 "매출액"이라는 값을 나타내는 부분만 한정하면 이 값을 가져올 수 있었기 때문에 간단하게 아래 코드로 해당 row 값을 가져올 수 있었다.
여기에서 우리가 결국 가져오고 싶은 값은 매출액에 해당하는 ..tbody > tr > td 에 있는 각각의 값이다.
이에, strong text인 매출액을 한정 후 > parent 노드로 이동하여, 모든 td를 가져오는 구조로 구현하였다.
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
'개발 > 파이썬(PYTHON)' 카테고리의 다른 글
[PYTHON] 네이버 주식정보 가져오기 (4/4) - email 보내기 (0) | 2020.12.13 |
---|---|
[PYTHON] 네이버 주식정보 가져오기 (3/4) (7) | 2020.12.13 |
[PYTHON] 네이버 주식정보 가져오기 (1/4) - 크롤링 (1) | 2020.11.16 |
[Python] 네이버 증권 주식 종목 가져오기 스크랩핑(크롤링) (0) | 2020.11.15 |
[Python] BeautifulSoup find return None 처리 (0) | 2020.10.20 |
- Total
- Today
- Yesterday
- cortarNo
- 경제적 자유
- 네이버 주식
- pyplot
- Excel
- REST API
- 크몽
- 매물
- 부동산
- 대항력있는 임차인
- 네이버
- 상가
- pandas
- tkinter
- 개발자도구
- 크롤링
- eum.go.kr
- 평형정보
- beautifulsoup
- Export
- 네이버 부동산
- 파이썬
- 네이버쇼핑
- matplotlib
- PYTHON
- 경매
- DICTIONARY
- json
- 아파트
- 단지정보
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |