☕ Java

[Java] Day20 - Jsoup : Java HTML Parser 네이버 뉴스 크롤링

harveydent 2023. 5. 31. 13:45
728x90

URL

https://news.naver.com/

 

네이버 뉴스

정치, 경제, 사회, 생활/문화, 세계, IT/과학 등 언론사별, 분야별 뉴스 기사 제공

news.naver.com

URL 분석

정치 news.naver.com/...&sid1=100
경제 news.naver.com/...&sid1=101
사회 news.naver.com/...&sid1=102

네이버 뉴스의 URL을 보면 정치뉴스부터 sid1의 값이 1씩 규칙적으로 증가하는 것을 볼 수 있습니다.

코드 구현

public class Crawling {
	public static void main(String[] args) {
    	final String url = "https://news.naver.com/main/main.naver?mode=LSD&mid=shm&sid1=";
        
        for (int i = 100; i < 106; i++) { // 100 ~ 105
        	
        	Connection conn = Jsoup.connect(url + i);

네이버 뉴스 페이지의 주소를 String url 변수에 초기화한 뒤 for문 안에서 Connection 클래스를 이용해 100부터 105까지 페이지 주소의 문자열을 주소화합니다.

			Document doc = null;
			
			try {
				doc = conn.get();
			} catch (Exception e) {
				e.printStackTrace();
			}

Document 클래스를 이용하여 주소화된 페이지의 주소를 가져옵니다.

			Elements elemsTitle = doc.select("a.sh_text_headline");
			Elements elemsPress = doc.select("div.sh_text_press");
			Elements elemsText = doc.select("div.sh_text_lede");

Elements 클래스를 이용하여 페이지에서 뉴스 제목과 언론사, 뉴스 내용에 해당하는 각 요소들의 코드를 변수에 초기화합니다.

분야 태그 분석

정치 분야이름 태그
경제 분야이름 태그
사회 분야이름 태그

이제 뉴스 분야를 추출해야 합니다.

뉴스 분야에 해당하는 태그를 분석해 보니 클래스명이 h2, h3, h4와 같이 1씩 규칙적으로 증가하는 것을 볼 수 있습니다.

			String cateName1 = "div#snb > h2.h";
			String cateName2 = " > a";
			
			System.out.print(doc.select("a.h_news > span.blind").text() + " > ");
			System.out.println(doc.select(cateName1 + (i - 98) + cateName2).text());
			System.out.println("=======================================================");

따라서 페이지에서 추출한 뉴스 분야 태그 선택자를 cateName1, cateName2로 분리한 뒤 for문의 i를 이용하여 해당 페이지마다 다른 클래스 명을 추출할 수 있도록 작성합니다.

			Iterator<Element> itrTitle = elemsTitle.iterator();
			Iterator<Element> itrPress = elemsPress.iterator();
			Iterator<Element> itrText = elemsText.iterator();
			
			while(itrTitle.hasNext() && itrPress.hasNext() && itrText.hasNext()) {
				String press = itrPress.next().text();
				String title = itrTitle.next().text();
				String text = itrText.next().text();
				System.out.println("[" + press + "] " + title);
				System.out.println(text);
			}
			System.out.println();
		}
	}
}

마지막으로 Iterator을 이용하여 읽어올 요소가 있을 때까지 뉴스 분야와 언론사, 뉴스 제목, 뉴스 내용에 해당하는 각 요소들을 출력합니다.

실행 결과

정치, 경제, 사회 뉴스
생활/문화, 세계, IT/과학 뉴스

GitHub

https://github.com/Qkrwnsgus0522/Java

 

GitHub - Qkrwnsgus0522/Java

Contribute to Qkrwnsgus0522/Java development by creating an account on GitHub.

github.com

 

728x90