주니 개발 도서관

자바(JAVA)

(19) 자바 Jsoup을 이용한 웹 크롤링

주니홍 2022. 7. 18. 02:46

웹 크롤링 이란,

컴퓨터 소프트웨어 기술로 웹 사이트들에서 원하는 정보를 추출하는 것을 의미합니다

 

웹 크롤러 란,

인터넷에 있는 웹페이지를 방문해서 자료를 수집하는 일을 하는 프로그램을 말합니다

 

여러 웹 크롤러가 존재합니다

저는 그중 Jsoup을 사용해 보도록 하겠습니다

 

Jsoup은 HTML 파싱 Java 라이브러리입니다

주로 정적인 웹 페이지를 파싱하고자 하는 경우,

간단하게 HTML을 가져와 파싱을 할 수 있는 라이브러리입니다.

 

간단하게 말하면 화면을 만들기 위해 사용되는 html태그 및 정보들을 가져와

새로운 구조를 만든다고 생각하면 됩니다

 

외부의 라이브러리에서 사용하기에,

라이브러리에 등록하고 connect를 해주어야 사용 가능합니다

 

final String url = "https://comic.naver.com/webtoon/weekdayList?week=mon";

Document doc = null;

try {
	doc = Jsoup.connect(url).get();
} catch (IOException e) {	
// TODO Auto-generated catch block
		e.printStackTrace();
}

Elements eles = doc.select("#content > div.list_area.daily_img > ul > li:nth-child(1) > dl > dt > a");

Iterator<Element> itr = eles.iterator();

while(itr.hasNext()) {
	String name = itr.next().text();
	System.out.println(name);
}

 

1. URL (주소)을 설정해주어야한다

final String url = "https://comic.naver.com/webtoon/weekdayList?week=mon";

- 어디의 URL정보를 사용할지 알기 위해서

String 변수에 담아 편하게 사용합니다

 

 

 

2. Document 설정

Document doc = null;

- JAVA에서 제공하는 것이 아닌 Jsoup에서 제공하는 클래스입니다

 

- URL의 HTML 코드를 담아주기 위한 클래스 입니다

 

-변수로 사용하기 위해 미리 null로 초기화 시켜 놓았습니다

 

 

 

3. doc = Jsoup.connect(URL).get();

try {
	doc = Jsoup.connect(url).get();
} catch (IOException e) {	
// TODO Auto-generated catch block
		e.printStackTrace();
}

- Jsoup은 외부 라이브러리이기때문에 connect 해줘야 합니다

 

- 인풋값의 URL안에있는 HTML코드를 get(); 으로 불러주는데

아웃풋이 Document 이기에 doc 변수에 담아서 사용합니다

 

- URL값이 잘못됐는지 안됐는지 확인하기 어렵기 때문에 try/catch 강제입니다

 

- doc를 출력해 보았을때의 콘솔창 입니다

( HTML의 코드를 보여줍니다. 네이버 월요웹툰 URL 입니다 )

 

 

HTML에서 원하는 값 가져오는 방법 **

4.  Elements else = doc.select( " 태그명, class속성명, id 속성명 " );

Elements eles = doc.select("#content > div.list_area.daily_img > ul > li:nth-child(1) > dl > dt > a");

- select로 불러온 값들을 저장할 Elements 클래스입니다

해당 클래스는 Jsoup의 클래스입니다

Elements = 배열을 구성하는 각각의 값을 배열 요소(element) 라고 합니다

그 중 요소라는 뜻을 가졌습니다

 

 

HTML에서 원하는 값을 가져오는 기본적인 방법

현재 URL에서 F12를 누르면 해당 창이 나오는데,

네모 박스를 클릭하여필요한 정보에 마우스를 올려 클릭하면,

해당 '태그' 의 정보를 알려주며 (네모박스)

 

어디에 있는지 알려줍니다!

doc.select( 인풋값 )으로 경로를 보내주면 되는데

" 참교육 " 이라는 정보를 가져와 보도록 하겠습니다

 

body > div > div > div > div > ul > li > dl > dt > a

~태그 안에 > ~태그 안에  > ~태그 안에 라는 생각으로 들어갑니다

 

해당 방법으로는 <dt> class 에 포함된 모든 <a>를 불러옵니다

Elements  else  = doc.select(body>div>div>div>div>ul>li>dl>dt>a)

else를 출력 했을때의 콘솔창입니다

 


 

참교육이라는 값 하나만을 부르고 싶다면

 

복사한 것을 doc.select( 안에 넣어준다면 )

해당 요소만 뽑아올 수 있다

 

복사한 값의 결과값이 2가지 종류로 나뉘는데

1. li:nth-child( 정수 )  - 공식을 가진 코드

- 이런식으로 어떠한 곳에 정수가 있다면, 해당 정수를 변경해주면

그 정수의 위치에 있는 값을 가져온다

 

- li 만 남기고 다 지운다면

정수값으로 들어가는 모든 경우를 가져와 준다는 것을 생각해 볼 수 있다

(사용해보면 익숙해 질 것이다)

 

 

2. 공식이 없는 코드

-  이땐 태그뒤에 붙은  .  을 기준으로 HTML을 보며 비교해본다

tr.fist 부분을 접어보니, 웹툰 제목의 값들이

tr클래스안에 하나씩 저장되어있는 것을 확인

 

.fist를 지워 모든 tr 클래스를 불러온다면

해당 웹툰페이지의 제목을 모두 가져올 수 있다고 예상가능하다

( .fist를 지운후 출력해본 콘솔창 )

 


 

5. Elements 들을 배열 Iterator에 저장

Iterator<Element> itr = eles.iterator();

-  eles.iterator();

Iterator에 저장하여 사용하기위해 만들어진 Elements의 메소드이며,

해당 메소드도 Jsoup에서 iterator를 사용하기 위한 메소드 입니다

 

 

6. lterator를 사용

while(itr.hasNext()) {
	String name = itr.next().text();
	System.out.println(name);
}

itr.hasNext()

- 다음 값이 존재하니? T or F

 

itr.next()

- 배열에 차례로 저장된 하나의 값을 가져옴

- 아웃풋이 Elements 이다

 

.txet()

- Elements의 메소드이며,

태그값을 제외한 원하는 값만을 가져온다+ String 값으로 바꿔준다

 

해당 String name값을 이용하면

 

CRUD를 이용하여 데이터베이스에 사용할 수 있을 것이다!

 

 


doc.select( ) 메서드 말고도

 

doc.doc.getElementsByClass( ) 클래스만 찾는 전용 메서드

등등 여러가지가 있으니 추가 공부 할 것

'자바(JAVA)' 카테고리의 다른 글

(18)Model View Controller (MVC)  (0) 2022.06.28
(17) throw 와 throws 의 차이  (0) 2022.06.28
(16) 파일 입출력  (0) 2022.06.27
(15) 콜론 ( : ) 의 기능  (0) 2022.06.27
(14) Exception(try,catch,throw)  (0) 2022.06.24