본문 바로가기
Back-end/JAVA

[크롤링] Jsoup을 이용한 JAVA 크롤러 (1) - HTML 파싱

by 허도치 2020. 2. 25.
0.서론

 지금까지 크롤러를 만들때, 주로 Python을 이용해서 만들었다. 왜냐하면, 가장 쉽고 빠르게 만들 수 있기 때문이었다. 그동안 Python에 익숙해져 있다보니 Java로는 만들어 볼 생각을 안하게 되었다. 그러다가, 최근 Java로 메일을 발송하는 기능을 구현해보면서 'Jsoup'이라는 라이브러리를 알게되었다.

 Jsoup은 HTML을 파싱해주는 JAVA 오픈 소스 라이브러리이다. Python에서 BeautifulSoup과 비슷한 라이브러리이다. 둘에 차이가 있다면, BeautifulSoup은 파싱만 지원하여 별도의 Request 모듈이 필요하지만, Jsoup은 Request와 파싱을 모두 지원한다.

 Element를 탐색하는 기능은 CSS Selector를 이용하는 select 함수와 Javascript에서 사용되는 getElementsByClass와 같이 속성값을 통해 탐색하는 함수들을 제공한다. XPath를 지원하지않는 것이 아쉽지만 xsoup이라는 확장 라이브러리를 사용하면 XPath를 사용할 수 있다고 한다.

 예제를 통해서 사용법을 익혀보도록 하자.

 

 

1. 프로젝트 준비
1-1. Maven Project를 사용하는 경우

1) pom.xmlJsoup Dependency 추가.
    <dependency>
      <groupId>org.jsoup</groupId>
      <artifactId>jsoup</artifactId>
      <version>1.11.3</version>
    </dependency>

2) Maven Update 실행.

 

1-2. 라이브러리만 받을 경우

1) jar파일 다운로드
   - jsoup-1.11.3 [ 다운로드 ]

2) CLASSPATH 등록
   $ SETX CLASSPATH "%CLASSPATH%;C:\work\libs\jsoup-1.11.3.jar;"

3) 다른 버전을 받고 싶을 때
   - https://mvnrepository.com/artifact/org.jsoup/jsoup

 

1-3. 수집 대상 선정

1) 수집 대상
   - [크롤링] File, Image 크롤링 예제 포스트
   - https://heodolf.tistory.com/18
   
2) 선정 이유
   - 예전에 파이썬으로 File과 Image를 다운받는 크롤러를 테스트하려고 만든 포스트임.
   - 단순 텍스트를 크롤링하는 것은 간단하기 때문에 Jsoup을 이용해서도 File을 다운로드 받는 크롤러를 만들 계획임.

 

 

 

2. 간단한 크롤링 예제
2-1. 스크립트 작성
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
// Crawler.java
import java.io.IOException;
 
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.Connection;
 
public class Crawler {
    public static void main(String args[]){
        try {
            // 1. 수집 대상 URL
            String URL = "https://heodolf.tistory.com/18";
            
            // 2. Connection 생성
            Connection conn = Jsoup.connect(URL);
 
            // 3. HTML 파싱.
            Document html = conn.get(); // conn.post();
            
            // 4. HTML 출력
            System.out.println( html.toString() ); 
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
cs

 

2-2. 실행

1) IDE를 사용하는 경우
   - Java Application 실행

2) 콘솔을 사용하는 경우
   $ javac Crawler.java
   $ java Crawler.class

 

2-3. 실행 결과

1) 실행하면 위와 같이 수집대상의 HTML이 출력됨.

 

 

 

3. 요소 탐색 예제
3-1. 스크립트 작성
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// Crawler.java
import java.io.IOException;
 
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.Connection;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
 
public class Crawler {
    public static void main(String args[]){
        // 1. 수집 대상 URL
        String URL = "https://heodolf.tistory.com/18";
 
        try {
            // 2. Connection 생성
            Connection conn = Jsoup.connect(URL);
 
            // 3. HTML 파싱.
            Document html = conn.get(); // conn.post();
            
            // 4. 요소 탐색
            // 4-1. Attribute 탐색
            System.out.println("[Attribute 탐색]");
            Elements fileblocks = html.getElementsByClass("fileblock");
            for( Element fileblock : fileblocks ) {
                
                Elements files = fileblock.getElementsByTag("a");
                for( Element elm : files ) {
                String text = elm.text();
                String href = elm.attr("href");
                
                System.out.println( text+" > "+href );
                }
            }
            
            // 4-2. CSS Selector 탐색
            System.out.println("\n[CSS Selector 탐색]");
            Elements files = html.select(".fileblock a");
            for( Element elm : files ) {
                String text = elm.text();
                String href = elm.attr("href");
                
                System.out.println( text+" > "+href );
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
cs

 

3-2. 실행

1) IDE를 사용하는 경우
   - Java Application 실행

2) 콘솔을 사용하는 경우
   $ javac Crawler.java
   $ java Crawler.class

 

3-3. 실행 결과

1) Attribute 탐색
   - Element의 id, class, tag 등과 같은 속성값을 이용하여 요소를 탐색함.
   - getElementById, getElementsByClass, getElementsByTagName 등이 있음.
   - 한번의 하나의 속성값만 이용하여 탐색할 수 있기 때문에 깊이가 깊어질수록 복잡해짐.

2) CSS Selector 탐색
   - HTML에 스타일을 적용할 때 사용되는 CSS는 요소를 탐색하기위해 CSS Selector를 사용함.
   - 이 CSS Selector를 이용하여 Element를 탐색하는 기능.
   - select, not, next 등 많은 함수들에서 사용됨.
   - Attribute 탐색보다 자주사용되는 기능.

3) 추출된 데이터는 파일명과 용량, 파일의 다운로드 요청 URL임.

 

 

 

마치며

- 지금까지 Java로는 크롤링이 어려울거라는 생각이 강했는데 전혀 어렵지않았다. 물론, 지금까지 다른 언어로 크롤러를 만들어봤기 때문에 익숙해서 그럴수도 있다.
- 다음 포스트에서는 이번 포스트에서 추출한 파일의 다운로드 요청 URL을 가지고 실제 파일을 다운로드하는 기능을 구현해보도록 하겠다.
- 오늘 작성한 소스는 수집 대상 포스트에 업로드 해놓을 계획이다. 필요하다면 직접 크롤링해서 다운로드 받아보자.

댓글