안녕하세요!~ 오랜만입니다. ㅎㅎㅎ
저번 포스팅은 값들을 가져오는 환경과 데이터만 가져오는 방법으로만 구현했네요
이제 크롤링을 간단하게 해서 직접 자바의 자료구조 형태로 저장을 해보도록 해보겠습니다!!!
우선 해당 라이브러리 설치나 사용방법을 모르시는분은 아래 링크 통해서 진행해주신후 함께 진행하시면 더욱
부드럽게 진행하실 수 있으십니다!
Jsoup 설치 방법 (자세히)
https://uno-kim.tistory.com/213
[JAVA]Jsoup 라이브러리를 이용한 크롤링 - Jsoup 사용법 + 라이브러리 저장하는 법
안녕하세요~! ㅎㅎ 오늘 포스팅은 그동안 크롤링를 하여 네이버 금융의 정보를 가져왔었는데 크게 사용되었던 라이브러리인 Jsoup 라이브러리 사용법 에 대해서 알아보겠습니다! 1. 라이브러리
uno-kim.tistory.com
Jsoup 사용방법(3가지 방법 소개)
https://uno-kim.tistory.com/215
[JAVA]Jsoup 라이브러리를 이용한 크롤링 - Jsoup 사용법
안녕하세요! 오늘 포스팅은 Jsoup 라이브러리를 알아보려고 해요 해당 라이브러리는 가장 편한 API 를 제공하며 HTML5 DOM 메서드와 CSS 선택기를 사용하여, URL을 가져오고 데이터를 추출 및 조작하기
uno-kim.tistory.com
2022.03.17 - 네이버 금융페이지를 몽땅 가져와보자! - 자바 크롤링(java)_1
네이버 금융페이지를 몽땅 가져와보자! - 자바 크롤링(java)_1
안녕하세요! 개인프로젝트의 일부분 중 하나인 크롤링에 대해서 공부해보겠습니다! 그리고 대상은 지금이제 처음 공부를 시작하셨거나 자바 초급수준이신 분들을 위한 난이도로 설명하겠습니
uno-kim.tistory.com
위의 글처럼 <HTML> 도큐먼트를 먼저가져왔습니다.
그것들을 어떻게 파싱하느냐가 중요하겠습니다!
그 힌트들을 얻기위해
브라우저에서 F12를 눌러 개발자도구를 눌러봅시다!
개발자 도구를 이용해서 필요한 구역의 정보들을 얻어보자

현재 저의 화면을 찍었습니다.
해당 사진의 우측 검은색 윈도우가 보이시나요?
바로 개발자 모드랍니다!

해당 좌측 상단의 빨간 박스 형태가 보이나요? 해당 버튼을 마우스로 눌러봅시다!

그 후 여러분이 원하는 정보에 마우스를 가져다댑니다.
그럼 해당 div 정보들이 보여요!
우선 div 태그의 class가 heading_area 구나 까지 알수있어요!
정말일까요? 확인해봐야죠?~~

이것은 제 웨일 브라우저의 일부분입니다.
처음 저희가 예상했던 heading_area 의 부모 노드까지 한번 찾아서 사진찍었답니다.
그럼
여기서 우리는 힌트를 얻었습니다.
내가 원하는 데이터 (코스피) 는 div 태그 class kospi_area group_qout 또는 그 하위 노드/ 엘리먼트에 있다.
이렇게 가설을 도출 할 수 있게됩니다.
그럼 과연 kospi_area 가 여기 부분에만 사용되었는지도 확인해야합니다.
왜냐하면 class는 많이 사용될 수 있으며, 많이 사용되었다면 파싱할때 조금 귀찮아 질때가 있어서
최대한 최소값들을 가져올 수 있도록 해야합니다.
??? : 설마 ctrl + F 해서 찾아야 하나요?

아니요!!
개발자모드의 콘솔을 이용해서, 해당 도큐먼트에 해당 클래스가 몇개가 사용되었는지 알 수 있습니다.

물론 document.get... 쓰기 귀찮으신분들도 있겠지만 우선적으로 기본을 알면 좋기에 사용해줍니다.
보시는것 처럼 하나만 쓰였군요! 그럼 이 클래스를 이용해서 찾아보도록 하겠습니다.
자바단으로 이동하겠습니다~!
package ㅎJavaTests;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class CrawlingNaverFins
{
public static void main(String[] args) throws IOException
{
String url = "https://finance.naver.com/";
String pharser = "";
Document doc = Jsoup.connect(url).get();
}
}
포스팅을 하기위해 클래스를 좀더 이쁘게 만들었습니다!!
지난소스들은 리팩토링이 많이되어있어서 설명이 어려워 질것 같았거든요 ㅠㅠㅠ
우선

이렇게 작성합니다. 파서는 앞서 우리가 찾아냈던 클래스 이름인
kospi_area
를 입력하셔야합니다.
그리고 앞에 .를 찍어주어야 합니다. 돔파서라던가 해당 jsoup , 그리고 웹에서는 클래스라는 것을
인지시키려면 . 을 붙입니다.

실행을 시키면
<div class="kospi_area group_quot quot_opn" style="height:269px"> <div class="heading_area"> <h4 class="h_opn"><a href="/sise/sise_index.naver?code=KOSPI" onclick="clickcr(this, 'tsc*k.title', '', '', event);" title="코스피지수 상세보기" class="_stock_section"><em><span class="blind">코스피</span></em></a></h4> <a href="/sise/sise_index.naver?code=KOSPI" onclick="clickcr(this, 'tsc*k.title', '', '', event);" title="코스피지수 상세보기"> <span class="num_quot dn"> <span class="num">2,687.45</span> <span class="num2">7.60</span> <span class="num3"><span class="blind">-</span>0.28<span class="per">%</span></span> <span class="blind">하락</span> </span> </a> <span class="clse_bg"></span> </div> <div class="chart_area"> <p class="blind">코스피 시세 차트</p> <a href="/sise/sise_index.naver?code=KOSPI" onclick="clickcr(this, 'tsc*k.chart', '', '', event);" title="코스피지수 상세보기"><img src="https://ssl.pstatic.net/imgfinance/chart/main/KOSPI.png?sidcode=1651501380625" width="301" height="127" alt="코스피지수 상세보기"></a> </div> <div class="dsc_area"> <dl class="dl"> <dt> <a href="/sise/sise_trans_style.naver?sosok=01" onclick="clickcr(this, 'tsc*k.private', '', '', event);" title="투자자별 매매 동향 상세보기">개인</a> </dt> <dd class="up"> <a href="/sise/sise_trans_style.naver?sosok=01" onclick="clickcr(this, 'tsc*k.private', '', '', event);">+2,247</a> <span class="blind">억원</span> </dd> <dt> <a href="/sise/sise_trans_style.naver?sosok=01" onclick="clickcr(this, 'tsc*k.foreign', '', '', event);" title="투자자별 매매 동향 상세보기">외국인</a> </dt> <dd class="dn"> <a href="/sise/sise_trans_style.naver?sosok=01" onclick="clickcr(this, 'tsc*k.foreign', '', '', event);">-675</a> <span class="blind">억원</span> </dd> <dt> <a href="/sise/sise_trans_style.naver?sosok=01" onclick="clickcr(this, 'tsc*k.institutional', '', '', event);" title="투자자별 매매 동향 상세보기">기관</a> </dt> <dd class="dn"> <a href="/sise/sise_trans_style.naver?sosok=01" onclick="clickcr(this, 'tsc*k.institutional', '', '', event);">-1,806</a> <span class="blind">억원</span> </dd> </dl> <dl class="dl2"> <dt class="blind"> 상한종목수 </dt> <dd class="dd"> <a href="/sise/sise_upper.naver" onclick="clickcr(this, 'tsc*k.ceiling', '', '', event);" title="상한종목 상세보기">2</a> </dd> <dt class="blind"> 상승종목수 </dt> <dd class="dd2"> <a href="/sise/sise_rise.naver?sosok=0" onclick="clickcr(this, 'tsc*k.rise', '', '', event);" title="상승종목 상세보기">424</a> </dd> <dt class="blind"> 보합종목수 </dt> <dd class="dd3"> <a href="/sise/sise_steady.naver?sosok=0" onclick="clickcr(this, 'tsc*k.steady', '', '', event);" title="보합종목 상세보기">90</a> </dd> <dt class="blind"> 하락종목수 </dt> <dd class="dd4"> <a href="/sise/sise_fall.naver?sosok=0" onclick="clickcr(this, 'tsc*k.drop', '', '', event);" title="하락종목 상세보기">413</a> </dd> <dt class="blind"> 하한종목수 </dt> <dd class="dd5"> <a href="/sise/sise_lower.naver" onclick="clickcr(this, 'tsc*k.floor', '', '', event);" title="하한종목 상세보기">0</a> </dd> </dl> </div> </div>
위처럼 나옵니다. 이는 해당 클래스의 모든 노드와 엘리먼트를 가져온 값이 맞습니다.
그리고 우리가 찾는 부분은 아래와 같이 kospi_area 클래스의 하위 노드입니다.


그럼 클래스가 kospi_area 인 것을들 쭉 모아놓고 를 찾으면 거기서도
heading_area
의 하위 노드만 나오겠지요?

그럼 아까 코드에서 추가해 봅니다.
package ㅎJavaTests;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class CrawlingNaverFins
{
public static void main(String[] args) throws IOException
{
String url = "https://finance.naver.com/"; // <-- 가져올 url
String pharser = ".kospi_area";
Document doc = Jsoup.connect(url).get(); // <-- 해당부분에서 doc에 url의 HTML 문서가 모두 들어가게 된다.
System.out.println(doc.select(pharser).select(".heading_area"));
}
}

이 사진은 최초 클래스만 select 했을때입니다.

이 사진은 변경 한 이후입니다.
오호... 어디보자 보자보자...
엇? 우리가 필요한 데이터는 대부분 a태그 안에 있네요?!
그럼 어떻게 해야할까요?
이걸또 정제하는 단계를 해봅시다! 눈치빠르신분들은 이미 눈치 채셨을겁니다.

package ㅎJavaTests;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class CrawlingNaverFins
{
public static void main(String[] args) throws IOException
{
String url = "https://finance.naver.com/"; // <-- 가져올 url
String pharser = ".kospi_area";
Document doc = Jsoup.connect(url).get(); // <-- 해당부분에서 doc에 url의 HTML 문서가 모두 들어가게 된다.
System.out.println(doc.select(pharser).select(".heading_area").select("a"));
}
}
네~~~ 맞습니다.

이사진과 같이 a태그만 나왔습니다. 호오.... 그럼 우선 여기있는 텍스트만 나오게 해볼까요?!

select () 매서드 이후 .text() 매서드를 추가해주시면 됩니다.
package ㅎJavaTests;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class CrawlingNaverFins
{
public static void main(String[] args) throws IOException
{
String url = "https://finance.naver.com/"; // <-- 가져올 url
String pharser = ".kospi_area";
Document doc = Jsoup.connect(url).get(); // <-- 해당부분에서 doc에 url의 HTML 문서가 모두 들어가게 된다.
System.out.println(doc.select(pharser).select(".heading_area").select("a").text());
}
}

!! 대박대박 우리가 필요로하는 글자만 나왔어요!!!!
이제 우리가 원하는 자료 구조로 한번 값을 저장해보곘습니다.
딱 보자마자 생각나시는 분들이 있겠죠?
바로
띄어쓰기로 구분자를 지어서 한다!

그것도 좋은 방법이지만 좀더 응용해 봅시다.
package ㅎJavaTests;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class CrawlingNaverFins
{
public static void main(String[] args) throws IOException
{
/* url 셋팅하고 파서셋팅하고, doc 셋팅하는 부분 */
String url = "https://finance.naver.com/"; // <-- 가져올 url
String pharser = ".kospi_area";
Document doc = Jsoup.connect(url).get(); // <-- 해당부분에서 doc에 url의 HTML 문서가 모두 들어가게 된다.
/* 셋팅 부분 끝 */
/* 입력할 자료구조를 설계 및 선언 */
HashMap<String, ArrayList<String>> outMap = new HashMap<String, ArrayList<String>>();
ArrayList<String> innerList = new ArrayList<String>();
/* 설계 및 선언 종료 */
/* 구분자를 통해 데이터들을 잘게 쪼갠다. */
String header = doc.select(pharser).select(".heading_area").select("a").get(0).text();
String[] str = doc.select(pharser).select(".heading_area").select("a").get(1).text().split(" ");
/* 종료 */
/* 각 자료구조형태에 데이터 삽입 */
for (String inner : str)
innerList.add(inner);
outMap.put(header, innerList);
/* 종료 */
/* 리턴 및 확인 */
System.out.println(outMap);
}
}


어머나!!엄청 간단하게 나왔습니다!!

그럼 코스닥도 마찬가지로 해보겠습니다.
정말 동일하게 해보곘습니다.
우선
1. 구분자를 코스닥 용으로 하나더 선언한다.
그리고 위와같은것을 동일하게 실행하자

코스닥도 동일한 구조인것 확인했구요~~~
kospi_area 가 kosdaq_area 으로 바뀌기만 하면 되겠군요??

넵 이 부분만 바꿔서 해보겠습니다!

짜잔!!!! 글자하나만 바꿨는데!!!!!!!!
코스피가!! 코스닥이되었습니다.
그럼 이것을 이용해서
package ㅎJavaTests;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class CrawlingNaverFins
{
@SuppressWarnings("unchecked")
public static void main(String[] args) throws IOException
{
/* url 셋팅하고 파서셋팅하고, doc 셋팅하는 부분 */
final String URL = "https://finance.naver.com/"; // <-- 가져올 url
final String KOSPI = ".kospi_area";
final String KOSDAQ = ".kosdaq_area";
Document doc = Jsoup.connect(URL).get(); // <-- 해당부분에서 doc에 url의 HTML 문서가 모두 들어가게 된다.
/* 셋팅 부분 끝 */
/* 입력할 자료구조를 설계 및 선언 */
HashMap<String, ArrayList<String>> outMap = new HashMap<String, ArrayList<String>>();
ArrayList<String> innerList = new ArrayList<String>();
String header = "";
String[] strArr = {};
/* 설계 및 선언 종료 */
/* 구분자를 통해 데이터들을 잘게 쪼갠다. */
header = doc.select(KOSPI).select(".heading_area").select("a").get(0).text();
strArr = doc.select(KOSPI).select(".heading_area").select("a").get(1).text().split(" ");
/* 종료 */
/* 각 자료구조형태에 데이터 삽입 */
for (String inner : strArr)
innerList.add(inner);
outMap.put(header, (ArrayList<String>) innerList.clone());
innerList.clear();
header = doc.select(KOSDAQ).select(".heading_area").select("a").get(0).text();
strArr = doc.select(KOSDAQ).select(".heading_area").select("a").get(1).text().split(" ");
for (String inner : strArr)
innerList.add(inner);
outMap.put(header, (ArrayList<String>) innerList.clone());
innerList.clear();
/* 종료 */
/* 리턴 및 확인 */
System.out.println(outMap);
}
}

코드를 평평하게 짜는걸 좋아해서 이렇게했습니다.
물론 변수를 하나하나 다 호출하셔도 됩니다. 저는 공통스러운건 묶어서 씁니다.
코딩을 시작한지 얼마 안되어서 어떤 성능이슈가 있는지 모릅니다... 알려주시면 감사하겠습니다.

결과는 위와 같이 잘나옵니다. 이제 웹단으로 가져가서 사용하시면 됩니다.
다음 포스팅은 다른 정보들을 크롤링하는 것을 올리겠습니다.
'프로젝트 > 금융' 카테고리의 다른 글
네이버 금융 크롤링 : 주식 종목 가져오기 (4) | 2022.10.26 |
---|---|
네이버 금융 크롤링 : 환율 금리 유가 차트 이미지를 가져와 보자! (0) | 2022.10.25 |
네이버 금융 크롤링 : 다른 정보들도 모조리 긁어와보자! (0) | 2022.10.24 |
네이버 금융페이지를 몽땅 가져와보자! - 자바 크롤링(java)_2 , 종목코드와 종목명 매핑하기 (0) | 2022.03.24 |
네이버 금융페이지를 몽땅 가져와보자! - 자바 크롤링(java)_1 (0) | 2022.03.17 |
댓글