본문 바로가기

개발공부/JAVA

[JAVA] Jsoup 사용하여 네이버 주가 크롤링 (소스포함)

 

갑자기 쓰던 API가 유료전환되는 바람에 그냥 네이버 크롤링을 하기로 했다! ╯︿╰

 

자바 크롤링 라이브러리인 JSoup을 사용한다

 

1. 라이브러리 추가

: 직접 다운을 받고 연결하거나 pom.xml에 추가해주면됨

 

https://jsoup.org/download

 

Download and install jsoup

Download and install jsoup jsoup is available as a downloadable .jar java library. The current release version is 1.14.1. What's new See the 1.14.1 release announcement for the latest changes, or the changelog for the full history. Previous releases of jso

jsoup.org

 

- 이클립스에서 추가할 경우

해당 프로젝트 우클릭 > properties > Java Build Path > Libraries > Add External JARS > Apply and Close

 

 

 - pom.xml 추가 

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.13.1</version>
</dependency>

 

2. 자기가 크롤링 하고 싶은 url 주소 확인

나의 경우 네이버 주가 페이지에서 삼성전자를 보겠다 하면 이 url 주소이다

회사마다 code 파라미터가 다르니 확인하면 될 듯!

 

https://finance.naver.com/item/main.nhn?code=005930 

 

삼성전자 - 네이버 금융 : 네이버 금융

관심종목의 실시간 주가를 가장 빠르게 확인하는 곳

finance.naver.com

 

3. f12를 누르고 자신이 원하는 데이터가 어딨는지 확인해본다

내가 원하는 값이 이렇게 정리되어있넹??

나는 저렇게 new_totalinfo 클래스 안에 있는 dl 밑에 dd를 리스트로 받아서 가져올 계획이다

다른방식으로 가져와도 무방!!

 

4. 소스코드!

 

우선 가장 기본이 되는 코드 설명부터

String URL = "https://finance.naver.com/item/main.nhn?code=005930"; //원하는 url 
Document doc;


try {
//connect해주는거라 화면상에서 띄웠을때 오류가 발생할수 있으니 필수로 작성해주자! 

        doc = Jsoup.connect(URL).get(); //원하는 url에서 전체 구조를 받아온다
        Elements elem = doc.select(".date"); //doc.select를 통해 안에서 원하는 elements만 쏙 뽑아와서

       
        //이제 내가 원하는 값들을 정리해준다!

} catch (IOException e) {
         e.printStackTrace();
}


 

📌여기서 꿀팁!!

doc.select하는 부분은

아까 f12 개발자모드에서 원하는 코드에서 왼쪽버튼을 누르고 copy> copy selector해주면 뜬다!

나는 리스트로 전체 받아올거니까 다르게함

F12를 누른뒤 소스에서 원하는 부분을 찾고 왼쪽버튼 누르고 COPY -> COPY SELECTOR

 

package fortest;

import java.io.IOException;
import java.text.ParseException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

public class test {
	public static void main(String[] args) throws ParseException {
		
		String URL = "https://finance.naver.com/item/main.nhn?code=005930";
		Document doc;

		try {
			doc = Jsoup.connect(URL).get();
			Elements elem = doc.select(".date");
			String[] str = elem.text().split(" ");

			Elements todaylist =doc.select(".new_totalinfo dl>dd");
			
			String juga = todaylist.get(3).text().split(" ")[1];
			String DungRakrate = todaylist.get(3).text().split(" ")[6];
			String siga =  todaylist.get(5).text().split(" ")[1];
			String goga = todaylist.get(6).text().split(" ")[1];
			String zeoga = todaylist.get(8).text().split(" ")[1];
			String georaeryang = todaylist.get(10).text().split(" ")[1];

			String stype = todaylist.get(3).text().split(" ")[3]; //상한가,상승,보합,하한가,하락 구분

			String vsyesterday = todaylist.get(3).text().split(" ")[4];
			
			System.out.println("삼성전자 주가------------------");
			System.out.println("주가:"+juga);
			System.out.println("등락률:"+DungRakrate);
			System.out.println("시가:"+siga);
			System.out.println("고가:"+goga);
			System.out.println("저가:"+zeoga);
			System.out.println("거래량:"+georaeryang);
			System.out.println("타입:"+stype);
			System.out.println("전일대비:"+vsyesterday);
			System.out.println("가져오는 시간:"+str[0]+str[1]);
			
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

 

결과값

 

📌여기서 잠깐! 

없는 페이지라고 뜬다면 헤더정보를 넣어주어야한다(물론 정확한 주소는 기본값)

Document doc2 = Jsoup.connect(URL2)
			  .userAgent("Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36")
	            .header("scheme", "https")
	            .header("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8")
	            .header("accept-encoding", "gzip, deflate, br")
	            .header("accept-language", "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,es;q=0.6")
	            .header("cache-control", "no-cache")
	            .header("pragma", "no-cache")
	            .header("upgrade-insecure-requests", "1")
	            .get();

 

이렇게 connect하는 부분에 내용 붙여넣으면 성공!