JAVA
[JAVA] JAVA 웹 크롤링 맛보기, 예시
yn98
2024. 7. 25. 17:46
웹 크롤링이란?
인터넷 상의 웹 페이지를 자동으로 탐색하고 정보를 수집하는 프로세스를 말한다. 주로 검색 엔진이나 데이터 수집을 목적으로 사용된다.
웹 크롤링 과정
- URL 탐색: 크롤러(Crawler)라고도 불리는 프로그램은 먼저 시작 URL을 설정하고 이를 기반으로 다른 페이지로 이동한다. 일반적으로 시작 URL은 특정 웹사이트의 첫 페이지가 된다.
- 웹 페이지 다운로드: 크롤러는 HTTP 또는 HTTPS 프로토콜을 사용하여 웹 서버에 요청을 보내고, 웹 페이지의 HTML 문서를 다운로드한다.
- HTML 파싱: 다운로드한 HTML 문서를 파싱하여 원하는 데이터를 추출한다. 일반적으로 이는 특정 태그(예: <a>, <div>, <p> 등)의 내용을 추출하거나, 특정 속성(예: href, src 등)의 값을 가져오는 과정을 포함한다.
- 데이터 추출: 파싱된 데이터에서 필요한 정보를 추출한다. 이 정보는 텍스트, 이미지, 링크, 메타 데이터 등 다양할 수 있다.
- 데이터 저장 또는 처리: 추출한 데이터를 필요에 따라 저장하거나, 다른 시스템으로 전달하여 추가적인 처리를 한다. 예를 들어, 데이터베이스에 저장하거나 분석하여 결과를 생성할 수 있다.
- 재귀적 탐색: 크롤러는 일반적으로 초기 URL에서 시작하여 링크를 따라가며 재귀적으로 탐색을 진행한다. 이 과정을 통해 웹 사이트 전체 또는 특정 부분을 전체적으로 탐색할 수 있다.
나는 Java 웹 크롤링 라이브러리인 Jsoup을 이용하여 크롤링을 시도했다.
Jsoup ?
- Jsoup은 Java로 작성된 HTML 파싱 및 조작 라이브러리다.
- 간편하게 HTML 문서를 로드하고, CSS 선택자를 사용하여 원하는 요소를 선택할 수 있다.
- 웹 페이지의 구조를 탐색하고 데이터를 추출하는 데 매우 유용하다.
나는 예시로 교보문고 사이트를 웹 크롤링 해보았다.
웹 크롤링이 가능한 사이트가 있고, 불가능한 사이트가 있는데, 몇번의 시도 끝에 가능한 사이트를 찾았다.
아래는 교보문고 사이트를 크롤링한 예시이다.
메인 페이지에 보이는 책들의 이름을 크롤링해보았다.
package crawling;
import java.io.IOException;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
// java.xxx.Xxxxx
// org.xxx.Xxxxx
// 회사명.xxx.Xxxxx >> 외부 라이브러리
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
// 웹 크롤링 : 웹 데이터 모아서 정제 및 가공
// 정적 크롤링 => 웹 페이지에만 접근
// 페이지에 직접 작성된 데이터만 접근가능
// "페이지 소스 코드 보기"로 보이는 데이터만 가져오는것
// ex) jsoup <<
// 동적 크롤링 => 웹 페이지가 참조하는 데이터까지 접근가능
// 본 서버의 데이터를 암호화했다면 접근불가능
// 오피지지 웹 사이트는
// 페이지 골격코드만 만듦
// 실시간으로 데이터를 본 서버에서 받아오는 구조
// => 동적 크롤링을 사용해야함
// 웹 크롤링
public class Test02 {
public static void main(String[] args) {
String url="https://www.kyobobook.co.kr/";
// 웹 페이지에서 "index"란, 표지 페이지(첫 페이지)를 의미함
Connection conn = Jsoup.connect(url);
// Jsoup으로 url 연결시도
// 연결객체가 반환됨
// Jsoup은 JAVA의 기본 패키지가 아니다.
// 라이브러리 == 소스코드모음집
// Jsoup 라이브러리를 별도로 설치해야함
// .jar JAVA아카이브==JAVA압축파일==소스코드모음집==라이브러리==패키지
try {
Document doc = conn.get();
Elements elems= doc.select("h3.prod_name");
for(Element elem:elems) {
System.out.println(elem.text());
}
} catch (IOException e) {
System.out.println("연결중 에러발생!");
}
// Document 란?
// 웹 페이지 화면 문서를 의미함
}
}
위 코드를 실행하면 다음과 같이 나온다.