JAVA

웹 스크래퍼, 크롤링 Java 구현

wooyit 2023. 2. 8. 08:14

웹 스크래퍼

  • Java에서 웹 스크래핑용 라이브러리 선택: Jsoup, Selenium, HtmlUnit 등과 같이 Java에서 웹 스크래핑에 사용할 수 있는 여러 라이브러리가 있습니다. 요구 사항에 따라 이러한 라이브러리 중 하나를 선택할 수 있습니다.
  • HTML 콘텐츠 가져오기: 라이브러리를 선택하면 HTTP 요청을 보내 웹 페이지의 HTML 콘텐츠를 가져올 수 있습니다.
  • HTML 콘텐츠 구문 분석: HTML 콘텐츠를 가져온 후 이를 구문 분석하여 필요한 정보를 추출할 수 있습니다. HTML 콘텐츠의 구조에 따라 CSS 선택자, XPath 등 다양한 파싱 기법을 사용할 수 있습니다.
  • 추출된 정보 저장: 마지막으로 추출된 정보를 CSV 파일, 데이터베이스 등과 같은 구조화된 형식으로 저장할 수 있습니다.
import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.select.Elements; 

public class WebScraper { 

  public static void main(String[] args) throws Exception { 
       Document document = Jsoup.connect("https://example.com").get(); Elements links =          
       document.select("a[href]"); 
       for (Element link : links) { 
           System.out.println("Link: " + link.attr("href")); 
           System.out.println("Text: " + link.text()); 
       } 
   } 
}

 

웹 크롤러

 

import java.io.IOException;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;
import java.util.HashSet;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class WebCrawler {
    private static final int MAX_PAGES_TO_SEARCH = 10;
    private Set<String> pagesVisited = new HashSet<String>();
    private Queue<String> pagesToVisit = new LinkedList<String>();

    /**
     * Returns the HTML content of a URL as a Document object
     */
    private Document getHtmlDocument(String url) throws IOException {
        return Jsoup.connect(url).get();
    }

    /**
     * Returns all the links (URLs) on a page
     */
    private void search(String url) throws IOException {
        Document htmlDocument = getHtmlDocument(url);
        Elements linksOnPage = htmlDocument.select("a[href]");

        System.out.println("**Visiting** Received web page at " + url);

        for (Element link : linksOnPage) {
            String linkUrl = link.absUrl("href");

            if (!pagesVisited.contains(linkUrl) && pagesVisited.size() < MAX_PAGES_TO_SEARCH) {
                pagesToVisit.add(linkUrl);
            }
        }
    }

    public void crawl() throws IOException {
        while (!pagesToVisit.isEmpty() && pagesVisited.size() < MAX_PAGES_TO_SEARCH) {
            String nextUrl = pagesToVisit.poll();
            if (!pagesVisited.contains(nextUrl)) {
                search(nextUrl);
                pagesVisited.add(nextUrl);
            }
        }
        System.out.println("\n**Done** Visited " + pagesVisited.size() + " web page(s)");
    }

    public static void main(String[] args) throws IOException {
        WebCrawler crawler = new WebCrawler();
        crawler.pagesToVisit.add("https://www.example.com/");
        crawler.crawl();
    }
}

이 코드는 큐와 세트를 사용하여 각각 방문할 링크와 이미 방문한 링크를 추적합니다.

Jsoup 라이브러리는 웹 페이지의 HTML 콘텐츠를 가져오고 이를 구문 분석하여 링크를 추출하는 데 사용됩니다.

코드는 큐에 루트 URL을 추가하고 방문한 것으로 표시하는 것으로 시작합니다.

그런 다음 크롤링 방법은 반복적으로 대기열에서 URL을 가져오고 HTML 콘텐츠를 가져오고 대기열에 새 링크를 추가합니다.

크롤링의 깊이는 MAX_DEPTH 상수에 의해 제어되며 프로세스가 반복되는 최대 횟수를 지정합니다.

'JAVA' 카테고리의 다른 글

AXON Framework 구현 방법  (1) 2023.02.24
JAVA applicationEventPublisher로 순환참조 해결!  (0) 2023.02.13
JAVA SE vs JAVA EE 개념  (0) 2022.07.25
서블릿(Servlet)이 뭐지..?  (0) 2022.07.22
Spring Web Application 구동  (0) 2022.07.21