[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. 네트워크 문제
아래와 같이 .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();
반응형