JAVA

[JAVA] JAVA 웹 크롤링 맛보기, 예시

yn98 2024. 7. 25. 17:46

웹 크롤링이란?

인터넷 상의 웹 페이지를 자동으로 탐색하고 정보를 수집하는 프로세스를 말한다. 주로 검색 엔진이나 데이터 수집을 목적으로 사용된다. 


웹 크롤링 과정

  1. URL 탐색: 크롤러(Crawler)라고도 불리는 프로그램은 먼저 시작 URL을 설정하고 이를 기반으로 다른 페이지로 이동한다. 일반적으로 시작 URL은 특정 웹사이트의 첫 페이지가 된다.
  2. 웹 페이지 다운로드: 크롤러는 HTTP 또는 HTTPS 프로토콜을 사용하여 웹 서버에 요청을 보내고, 웹 페이지의 HTML 문서를 다운로드한다.
  3. HTML 파싱: 다운로드한 HTML 문서를 파싱하여 원하는 데이터를 추출한다. 일반적으로 이는 특정 태그(예: <a>, <div>, <p> 등)의 내용을 추출하거나, 특정 속성(예: href, src 등)의 값을 가져오는 과정을 포함한다.
  4. 데이터 추출: 파싱된 데이터에서 필요한 정보를 추출한다. 이 정보는 텍스트, 이미지, 링크, 메타 데이터 등 다양할 수 있다.
  5. 데이터 저장 또는 처리: 추출한 데이터를 필요에 따라 저장하거나, 다른 시스템으로 전달하여 추가적인 처리를 한다. 예를 들어, 데이터베이스에 저장하거나 분석하여 결과를 생성할 수 있다.
  6. 재귀적 탐색: 크롤러는 일반적으로 초기 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 란?
		// 웹 페이지 화면 문서를 의미함
	}
}

 

 

위 코드를 실행하면 다음과 같이 나온다.