JAVA

[JAVA] JSoup 구글 뉴스 크롤링 예제

인생아 2024. 10. 29. 15:28
반응형

구글 뉴스는 다양한 키워드를 활용해 최신 뉴스를 수집하고 특정 데이터(제목, 링크, 요약)를 추출하기에 좋은 웹사이트입니다. 이번 글에서는 JSoup을 활용한 구글 뉴스 크롤링 방법과 이를 통해 뉴스 데이터를 추출하는 다양한 기법을 다룹니다.

1. 구글 뉴스에서 키워드로 기사 제목과 링크 수집하기

구글 뉴스에서 특정 키워드를 검색해 해당 키워드 관련 뉴스 기사 제목과 링크를 추출합니다.

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;

public class GoogleNewsTitleLinkCrawler {
    public static void main(String[] args) {
        String keyword = "경제";
        String url = "https://news.google.com/search?q=" + keyword;

        try {
            Document doc = Jsoup.connect(url).get();
            Elements newsHeadlines = doc.select("a.DY5T1d"); // 구글 뉴스 제목 링크의 CSS 선택자

            for (Element headline : newsHeadlines) {
                System.out.println("Title: " + headline.text());
                System.out.println("Link: " + "https://news.google.com" + headline.attr("href"));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

설명:
위 코드는 "경제"라는 키워드를 검색하고, 해당 키워드와 관련된 뉴스 제목과 링크를 추출합니다. a.DY5T1d는 뉴스 링크의 CSS 선택자로, 구글 뉴스 페이지에서 쉽게 찾을 수 있습니다.

2. 뉴스 기사 요약 및 발행 날짜 추출

구글 뉴스에서 기사 요약발행 날짜를 추가로 추출하면 기사의 주요 정보를 더 얻을 수 있습니다. 요약 정보는 종종 p 태그에, 날짜 정보는 time 태그에 포함됩니다.

public class GoogleNewsSummaryDateCrawler {
    public static void main(String[] args) {
        String keyword = "경제";
        String url = "https://news.google.com/search?q=" + keyword;

        try {
            Document doc = Jsoup.connect(url).get();
            Elements newsItems = doc.select("article");

            for (Element item : newsItems) {
                String title = item.select("a.DY5T1d").text();
                String link = "https://news.google.com" + item.select("a.DY5T1d").attr("href");
                String summary = item.select("p").text(); // 요약 추출
                String date = item.select("time").attr("datetime"); // 발행 날짜 추출

                System.out.println("Title: " + title);
                System.out.println("Link: " + link);
                System.out.println("Summary: " + summary);
                System.out.println("Date: " + date);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

설명:
summary와 date 변수를 통해 각 뉴스 기사에 포함된 요약과 발행 날짜를 출력할 수 있습니다. 이 정보는 p 태그와 time 태그에서 추출되며, 구글 뉴스 페이지의 구조에 맞게 조정됩니다.

반응형

3. 다양한 페이지에서 뉴스 크롤링 (다음 페이지 포함)

구글 뉴스는 검색 결과가 여러 페이지로 나누어져 있을 수 있습니다. 다음 페이지를 자동으로 탐색하면서 데이터를 수집하려면 페이징 처리 기능을 추가할 수 있습니다.

public class GoogleNewsPaginationCrawler {
    public static void main(String[] args) {
        String keyword = "경제";
        String baseUrl = "https://news.google.com/search?q=" + keyword + "&page=";
        
        for (int page = 1; page <= 5; page++) { // 페이지 번호 조정 가능
            String url = baseUrl + page;

            try {
                Document doc = Jsoup.connect(url).get();
                Elements newsHeadlines = doc.select("a.DY5T1d");

                for (Element headline : newsHeadlines) {
                    System.out.println("Page: " + page);
                    System.out.println("Title: " + headline.text());
                    System.out.println("Link: " + "https://news.google.com" + headline.attr("href"));
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

설명:
위 코드에서는 page 변수를 이용하여 여러 페이지의 뉴스를 자동으로 크롤링합니다. 크롤링할 페이지 수는 page <= 5 부분에서 조정 가능합니다. 이를 통해 대량의 뉴스 데이터를 한 번에 수집할 수 있습니다.

4. 구글 뉴스에서 특정 주제 필터링 및 분류 크롤링

특정 주제(예: IT, 스포츠, 경제)별로 뉴스 데이터를 크롤링하여 분류하고 수집할 수도 있습니다. 이를 위해 키워드를 각 주제에 맞게 변경하거나, 여러 주제를 한 번에 수집할 수 있습니다.

import java.util.Arrays;
import java.util.List;

public class GoogleNewsCategoryCrawler {
    public static void main(String[] args) {
        List<String> categories = Arrays.asList("경제", "IT", "스포츠");
        String baseUrl = "https://news.google.com/search?q=";

        for (String category : categories) {
            String url = baseUrl + category;

            try {
                Document doc = Jsoup.connect(url).get();
                Elements newsHeadlines = doc.select("a.DY5T1d");

                System.out.println("Category: " + category);
                for (Element headline : newsHeadlines) {
                    System.out.println("Title: " + headline.text());
                    System.out.println("Link: " + "https://news.google.com" + headline.attr("href"));
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

설명:
이 코드는 List<String> categories에 포함된 여러 주제를 한 번에 크롤링하여 주제별로 결과를 분류합니다. 이를 통해 특정 카테고리에 따른 기사만 필터링하여 수집할 수 있습니다.

참고 사이트

반응형