[Java] 웹 크롤링 라이브러리 Jsoup 및 userAgent

BE/Java 2024. 11. 2.
반응형

  목  차

  • Jsuop 설정
  • 웹 페이지 HTML 가져오기
  • 특정 요소 선택 및 텍스트 추출
  • userAgent 와 Header 설정

 

 


 

 Jsuop 설정

 

build.gradle에서 Jsuop 라이브러리를 프로젝트에 추가한다.

dependencies{
  implementation 'org.jsoup:jsoup:1.15.3'
}

 

 


 

  웹 페이지 HTML 가져오기

 

예시 코드

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class JsoupExample {
    public static void main(String[] args) {
        try {
            // 웹 페이지 HTML을 로드
            Document doc = Jsoup.connect("https://example.com").get();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

아래 코드가 html 을 불러오는 주요 코드인데, example.com 의 html 을 가져온다.

Document doc = Jsoup.connect("https://example.com").get();

 

doc.title()을 통해서 페이지 제목을 가져올 수 있다.

System.out.println(doc.title());  // 페이지 제목 출력

 

 


 

  특정 요소 선택 및 텍스트 추출

 

doc.select() 메서드로 HTML 요소를 선택 할 수 있다.

Document doc = Jsoup.connect("https://example.com").get();
            
// 특정 CSS 선택자 사용하여 요소 선택
Elements headings = doc.select("h1");  // 모든 h1 요소 선택

for (Element heading : headings) {
  System.out.println("Heading: " + heading.text());
}

 

// 특정 클래스의 텍스트 추출
Element paragraph = doc.select(".intro").first();  // 클래스가 'intro'인 첫 번째 요소

 

이렇게 추출한 요소에서 텍스트를 추출 할 수 있는데, .text()로 가능하다.

 

 


 

  serAgent 와 Header 설정

 

특정 웹은 크롤링을 금지한다. 

이럴 경우 timed out 에러가 뜨기도 하는데. 구글에서 찾을 수 있는 timed out 의 경우는 다음과 같다.

  1. 네트워크 문제 - 인터넷이 느릴 경우 발생
  2. 서버 응답 지연 - 서버가 느린 경우에 발생
  3. 서버의 크롤링 방지 기능 - 크롤링을 방지하기 위해서 요청을 제한

 

  1. 네트워크 문제

아래와 같이 .timeout() 메서드를 사용하여 시간 제한을 설정한다.

하지만 실제 사용 시간은 1/2 이다. 예를 들면, 아래와 같이 60초로 타임아웃을 설정한다면 30초가 된다.

Document doc = Jsoup.connect("https://example.com")
    .timeout(60000)  // 60초로 타임아웃 시간 설정
    .get();

 

 

  3. 서버의 크롤링 방지 기능

대부분의 경우 3번인데, UserAgent 가 없거나 동일한 서버에 빈번한 요청을 보내면 차단할 수도 있다.

 

다음은 애플 맥북 기준 UserAgent 설정 방법이다. 

userAgent 뿐만 아니라 이것저것 설정이 되어있어야 한다.

Document doc = Jsoup.connect(url)
                    .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3")
                    .referrer("http://www.google.com")
                    .header("Accept-Language", "en-US,en;q=0.9")
                    .header("Accept-Encoding", "gzip, deflate")
                    .timeout(50000)
                    .get();

 

 

반응형