갑자기 쓰던 API가 유료전환되는 바람에 그냥 네이버 크롤링을 하기로 했다! ╯︿╰
자바 크롤링 라이브러리인 JSoup을 사용한다
1. 라이브러리 추가
: 직접 다운을 받고 연결하거나 pom.xml에 추가해주면됨
- 이클립스에서 추가할 경우
해당 프로젝트 우클릭 > 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
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해주면 뜬다!
나는 리스트로 전체 받아올거니까 다르게함
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하는 부분에 내용 붙여넣으면 성공!
'개발공부 > JAVA' 카테고리의 다른 글
Spring Initializr로 Spring Boot 프로젝트 생성하는 방법 (0) | 2022.08.21 |
---|---|
[인프런강의] 더 자바, 자바8 1강 (0) | 2022.08.20 |
[JAVA] 날짜 관련 코드 모음집(날짜 더하기, 빼기, 변환, 형식..등등) (0) | 2021.06.30 |
[JAVA] 문자열 자르기 ( indexOf()/ substring() / split() ) (0) | 2021.04.13 |
자바스터디 9주차 feat.백기선님 (예외처리) (0) | 2021.02.03 |