(JAVA) JSOUP를 이용한 웹 크롤링 예제

lgw2236·2023년 1월 31일
0

개발기록

목록 보기
4/8
post-thumbnail

개인적으로 토이프로젝트를 진행하다가 최신 경제, 연예뉴스를 따오기 위해
JAVA JSOUP를 이용한 크롤링을 가볍게 해보았는데 신기하기도 하고 재밌기도 했어서
기록을 남겨보고자 한다..

> JSOUP 란?

URL, 파일, 문자열을 소스로 하여 html을 파싱할 수 있게 해주는 JAVA 라이브러리
<기능>
DOM 구조를 추적하거나 익숙한 CSS선택자를 사용하여 데이터를 찾아 추출 가능
문서내의 HTML요소, 속성, 텍스트 조작 가능
사용자가 입력한 데이터로부터 XSS(Cross-Site Script) 공격을 방지하기 위해서 안전한 화이트 리스트 방식으로 지정된 태그만 남기고 제거 가능

Target:Naver 연예뉴스 페이지, 최상단 뉴스 

TEST CODE

package com.example.issue;

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.beans.factory.annotation.Value;

import java.io.IOException;

public class crawling {

    public static void main(String[] args) {
        final String crawlingEnterUrl = "https://entertain.naver.com/home";
        Connection conn = Jsoup.connect(crawlingEnterUrl);

        try {
            Document document = conn.get();
            Elements enterUrlElements = document.getElementsByClass("lst_item _page_no_1");   
            Elements titleUrlElements = document.getElementsByClass("title_area");   
            Elements titleElements2 = document.select("div.title_area > a.title");
            Elements titleElements3 = document.select("a.thumb_area > img");
            	for (int i=0; i<10; i++) {
            		final String enterTitle = titleElements2.get(i).text();
            		final String enterImgLink = titleElements3.get(i).absUrl("src");
            		final String enterTag = titleElements2.get(i).absUrl("href");
            		
            		System.out.println("enterTitle:" +enterTitle);
    				System.out.println("enterImgLink:" +enterImgLink);
    				System.out.println("enterTag:" +enterTag);
    				
            	}

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

TEST CODE 간단한 FLOW

#1. Connection conn = Jsoup.connect(crawlingEnterUrl);
    Document document = conn.get();
-> 크롤링 하고자 하는 URL로부터 문서를 파싱

#2.  Elements enterUrlElements = document.getElementsByClass("lst_item _page_no_1");   
Elements titleUrlElements = document.getElementsByClass("title_area");   
Elements titleElements2 = document.select("div.title_area > a.title");
Elements titleElements3 = document.select("a.thumb_area > img");
-> 파싱된 문서 HTML 중 필요한 요소(Elements) 세부 파싱

#3. for (int i=0; i<10; i++) {
       final String enterTitle = titleElements2.get(i).text();
       final String enterImgLink = titleElements3.get(i).absUrl("src");
       final String enterTag = titleElements2.get(i).absUrl("href");
   }
 -> 원하는 데이터 값 추출 : 사용하기 편한 데이터 타입으로 변환하여 가져다 쓰면된다.
 EX) 객체 생성 후 해당 parameter들을 받아서 ArrayList 혹은 List 형식으로 사용
 
 
 주의) 해당 크롤링 로직은 크롤링하고자하는 PAGE의 구조,
 던져지는 ELEMTENTS 의 종류의 따라 유연하게 변경되어야 합니다.

결과값:

enterTitle:"멍뭉미 싱크로율 100%"…'멍뭉이' 유연석X차태현, 新 …
enterImgLink:https://ssl.pstatic.net/mimgnews/image/origin/076/2023/01/31/3965913.jpg?type=nfc200_122_q90
enterTag:https://entertain.naver.com/read?oid=076&aid=0003965913
enterTitle:송중기, 송혜교와 이혼 5개월 만에 케이티 만났다 [종합]
enterImgLink:https://mimgnews.pstatic.net/image/origin/213/2023/01/31/1243880.jpg?type=nfc200_122_q90
enterTag:https://entertain.naver.com/read?oid=213&aid=0001243880
enterTitle:박명수 "하루에 머리 400개씩 빠져", 김태진 "송중기 씨…
enterImgLink:https://mimgnews.pstatic.net/image/origin/408/2023/01/31/179023.jpg?type=nfc200_122_q90
enterTag:https://entertain.naver.com/read?oid=408&aid=0000179023
enterTitle:"덕질이 밥 먹여줘?"…'케이팝 제너레이션'이 답하다 [인터뷰M]
enterImgLink:https://mimgnews.pstatic.net/image/origin/408/2023/01/31/179030.jpg?type=nfc148_90_q90
enterTag:https://entertain.naver.com/read?oid=408&aid=0000179030
enterTitle:한고은, 자녀 계획 질문에 "올해 49세, 이 나이에 무슨 애야"('신랑수업')
enterImgLink:https://mimgnews.pstatic.net/image/origin/468/2023/01/31/918267.jpg?type=nfc148_90_q90
enterTag:https://entertain.naver.com/read?oid=468&aid=0000918267
enterTitle:송중기 올 여름 아빠되나? 케이티 8월 출산설에 "확인불가"[공식]
enterImgLink:https://s.pstatic.net/dthumb.phinf/?src=https://post-phinf.pstatic.net/MjAyMzAxMzBfMjQ1/MDAxNjc1MDU2OTMwMjQ4.MxsSkjfBTznvHvRW7gD8K5EfT802ZjuDqcF50g-KJtwg.x4nAjbGmz_FnIJR8TEzqAEQJe0eCWiMiwJsuT7akziUg.JPEG/IvFusw3EGHGnWl6-m8Qv_F6qoDwM.jpg&type=nf148_148&service=enter
enterTag:https://entertain.naver.com/read?oid=609&aid=0000683626&cid=1073787
enterTitle:혜리x'놀토' PD 새예능='혜미리예채파'..(여자)아이들 미연→르세라핌 김채원 합류 [공식]
enterImgLink:https://s.pstatic.net/dthumb.phinf/?src=https://post-phinf.pstatic.net/MjAyMzAxMzBfMTcx/MDAxNjc1MDY2Njc4OTA5.fZmaHYN8nEje1L3MNElwXWJzTI9volrbDuNeO6Zch3Eg.QQY1PvR_w1H5kfA8faDDGK5sv_UnyCPimD4IOAv8PAgg.JPEG/IQ2m-H3xELLp_DLTOPD2I1i6OedU.jpg&type=nf148_148&service=enter
enterTag:https://entertain.naver.com/read?oid=109&aid=0004781306&cid=1073787
enterTitle:'고딩엄빠3' 연년생 아들만 셋?…다둥이 '영월 여신' 등장
enterImgLink:https://s.pstatic.net/dthumb.phinf/?src=https://post-phinf.pstatic.net/MjAyMzAxMjhfNjQg/MDAxNjc0OTE1NzAxMTA3.ySM4sSrv72xAaub-mEyKC43vs3YvA09NJvs2WYM1zOQg.QJEHTUR8XvUL-5UNbHhevg45HVp6d4cx_eHT-dW5IHkg.JPEG/I2gDbF7lmbkgGIkF4OYGAwOFAYfo.jpg&type=nf148_148&service=enter
enterTag:https://entertain.naver.com/read?oid=144&aid=0000864272&cid=1073787
enterTitle:한고은, 자녀계획 질문에 "49세인데 무슨 애, 내 몸 감수하기도 힘들어"('신랑수업')
enterImgLink:https://s.pstatic.net/dthumb.phinf/?src=https://post-phinf.pstatic.net/MjAyMzAxMjZfMTYg/MDAxNjc0NzEyMDY1OTE2.p5RmGRTimjQvlIxM-edLsdD00g9WxQRGgdNYq5fM_mQg._8pnf0FOq99AAXphiQpyP4eAX2v20UwEOVRf-0aTkAkg.JPEG/IGj5jbhg7MsccECO3G-Auh_9SPj8.jpg&type=nf148_148&service=enter
enterTag:https://entertain.naver.com/read?oid=076&aid=0003965859&cid=1073787
enterTitle:광수, 싫다는 옥순 향한 끝없는 집착(나는 솔로)
enterImgLink:https://s.pstatic.net/dthumb.phinf/?src=https://post-phinf.pstatic.net/MjAyMzAxMjlfOCAg/MDAxNjc0OTk2ODA2MjAz.hps4gD1Hs1ejKpL_dSJearpRXkhRpZkQAF149ozffvMg.OKsaU2Gqi5QL2J7Bhe-WcRGDZcFB0nf3Lk-9i6OrOcMg.JPEG/IrdQY9OwaCbzTyjZZckrzOzbb1cE.jpg&type=nf148_148&service=enter
enterTag:https://entertain.naver.com/read?oid=144&aid=0000864248&cid=1073787

JSOUP DOCUMENTS 참조

https://jsoup.org/cookbook/extracting-data/selector-syntax - 세부 ELEMENTS 다루는법

profile
어제보다 오늘 더

0개의 댓글