728x90
URL
URL 분석
네이버 뉴스의 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을 이용하여 읽어올 요소가 있을 때까지 뉴스 분야와 언론사, 뉴스 제목, 뉴스 내용에 해당하는 각 요소들을 출력합니다.
실행 결과
GitHub
https://github.com/Qkrwnsgus0522/Java
728x90