[Spring Boot] Java로 웹 크롤링 하기 - Jsoup
이번 프로젝트는 유독 다른 웹 페이지의 정보들이 많이 필요했는데
그래서 웹 페이지 크롤링해야 되는 작업이 많았다.
웹 페이지 크롤링이란?
웹 페이지 HTML을 그대로 가져와서 필요한 모든 정보들을 추출해 내는 행위
프로젝트에서 웹 크롤링을 어떤 언어로 할지 고민을 좀 하긴 했다.
내가 사이드 프로젝트에 합류하기 전에
팀원이 작성해둔 크롤링 파이썬(Python) 코드가 있었지만
앞으로 내가 개발하고 운영해야 하기 때문에 자바로 해야 더 효율적이라는 판단을 내렸다.
그래서 내 맘대로 Jsoup을 사용하기로 했다.
자바(Java)를 사용해서 개발중이라
웹 크롤링 관련 라이브러리를 찾아보니
Jsoup 라이브러리를 찾을 수 있었다.
Jsoup 공식 페이지를 들어가서 보니까
사용법도 어렵지 않아 보이고
빠르게 적용 및 사용이 가능할 듯 보인다.
JSoup 라이브러리 적용 및 사용하기
1. 예제 살펴보기
공식 페이지를 보면 알겠지만
HTML5 DOM 메소드와 CSS 선택자를 지원하고
오픈소스라 부담 없이도 사용이 가능할 듯하다.
나와있는 예제를 보면
Document doc = Jsoup.connect("https://en.wikipedia.org/").get();
log(doc.title());
Elements newsHeadlines = doc.select("#mp-itn b a");
for (Element headline : newsHeadlines) {
log("%s\n\t%s",
headline.attr("title"), headline.absUrl("href"));
}
connect 메소드로 크롤링할 URL을 연결하고
get 메소드로 document를 가져온다.
긁어온 document에서
select 메소드를 사용해서 element를 찾으면 된다.
딱 봐도 엄청 간단하게 사용이 가능하다!!
2. 라이브러리 추가하기 (Gradle, Maven)
Gradle, Maven 빌드 방법에 따라 다음과 같이 라이브러리 dependency를 추가한다.
- Gradle (build.gradle)
implementation 'org.jsoup:jsoup:1.15.3'
- Maven (pom.xml)
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.15.3</version>
</dependency>
이제 Jsoup을 사용할 준비는 끝났다!
3. Jsoup 사용하기
Connection 객체를 반환하는 메소드와
Elements 객체를 반환하는 메소드를 구현해봤다.
public static Connection getJsoupConnection(String url) throws Exception {
return Jsoup.connect(url);
}
public static Elements getJsoupElements(Connection connection, String url, String query) throws Exception {
Connection conn = !ObjectUtils.isEmpty(connection) ? connection : getJsoupConnection(url);
Elements result = null;
result = conn.get().select(query);
return result;
}
만든 메소드를 가지고 실제로 사용을 해보면
String viewerUrl = "http://test";
String query = "#id";
Elements selects = CrawlingUtils.getJsoupElements(null, viewerUrl, query);
System.out.println(selects.get(0).text());
System.out.println(selects.get(0).html());
System.out.println(selects.get(0).children());
System.out.println(selects.get(0).parent());
System.out.println(selects.get(0).parent().previousElementSibling());
라이브러리 자체에서 다양한 기능들을
제공해주고 있기 때문에
프로젝트에 많은 도움이 되었다.
4. Jsoup 라이브러리의 한계
계속해서 크롤링을 잘하다가
정말 큰 문제가 발생했다😱
특정 페이지에서 document는 잘 받아오지만
element를 제대로 받아오지 못한다.
알고 보니 Jsoup은
동적 페이지는 크롤링을
하지 못한다고 한다.....😭
어쩐지 순조롭다 싶었네
해결하기 위해 구글링을 해보니
Jsoup으로는 안 되는 것 같다....
다행히 또 다른 라이브러리인 Selenium이 있는데
Selenium은 동적 페이지도 크롤링이 가능하다고 한다.
'사이드 프로젝트 > 크롤링' 카테고리의 다른 글
[Spring Boot] Java로 웹 크롤링 하기 - Selenium (0) | 2022.12.26 |
---|