JAVA 크롤러 만들기 1 - 뉴스 기사 크롤링

반응형

빅데이터와 크롤링

크롤링은 빅데이터를 수집하는 기술로서 의의가 있다. 따라서 먼저 빅데이터에 관련하여 간단히 알아보자.

빅데이터

빅데이터 관련 복습 -> 수집 방법 공부 -> 웹 크롤링
Q. 하루에 생성되는 데이터의 양은 ? 250경 바이트, 300억 페이스북 메시지, 10억 트윗 (2018년 기준)

빅데이터 3V, 4V, 5V

빅데이터의 3가지 특징

  • Volume
  • Velocity
  • Variety (여기까진 과거, 최근에는 4V, 5V 개념까지 확장, 이것도 2018년 기준)
  • Vearcity[və|rӕsəti]: 정확성, 진실성
  • Value : 가치

빅데이터 처리 절차

빅데이터의 처리가 이루어지는 과정 (Big Data Processing Flow)

  1. 수집(Web page, sensor)
  2. 저장(Server, DB)
  3. 분석(Hadoop, R) - 시각화

빅데이터 수집 데이터의 형태

빅데이터 수집 데이터 형태(Big Data Collection Technology Data Type)

  • Structured 정형데이터 (관계형 DB, 엑셀과 같은 형태)
  • Semi-Structured 반정형데이터 (XML, HTML)
  • Unstructured 비정형(이미지, 영상, SNS, 음악)

빅데이터 수집 기술

빅데이터 수집 기술(Big Data Collection Technology)

  • 로그수집기(프로그램 사용기록)
  • 크롤링
  • 오픈API
  • 센싱

Crawling, 크롤링

  • Webpage 의 데이터를 추출할 수 있게 만들어주는 기술
  • 거미줄처럼 얽혀 있는 인터넷 링크를 따라다니며 방대한 데이터를 수집하는 기술

Web Crawler

인터넷에 있는 웹 페이지를 방문하여 자료를 수집하는 프로그램

용도

  • 저작관을 위반한 사이트를 감시
  • Google, Daum, Naver : 검색엔진을 위해서 문서를 수집
  • 프로젝트에 필요한 컨텐츠를 수집할 때
  • 날씨, 버스시간표 등 공공 데이터의 개인적 목적의 활용
  • Web Crawling 의 흐름
  1. 웹페이지 링크 방문
  2. 텍스트, 이미지, 영상, 날씨정보, 인구 수 등 수집
  3. DB 저장
  4. Web Crawling 의 조건
  • Web page 의 구조
  • 어떻게 내가 원하는 데이터를 추출할것인가?
반응형

jsoup JAVA 웹 크롤러

JAVA 에서 웹 크롤링(Web Crawling) 을 위한 LIbrary로 Jsoup(제이숩라고 발음) 이 있다.
HTML 의 내용 추출 라이브러리, 텍스트, 음악, 영상 추출

다운로드 및 설치

jsoup core library 다운로드(jar 파일)

프로젝트에 jar 파일 추가하기

아래 두 링크를 참고하여, 프로젝트에 다운로드 받은 jsoup jar 파일을 추가하도록 하자.

(BuildPath에서Add External JAR Files로 다운로드 받은 라이브러리를 추가한다.)

Eclipse에서 프로젝트에 외부 jar 추가하기
IntelliJ에서 프로젝트에 외부 jar 추가하기

웹페이지 연결하기

Jsoup.connect("[http://www.naver.com").get()](http://www.naver.com").get());
//위 코드는 IOException 예외 처리가 필요하다.

위 코드 자체는 오류를 발생시킨다. try-catch 구문을 활용하거나 함수에 throws 를 활용하자.

네이버 뉴스 기사 크롤링

Jsoup객체의 connect 메소드는 static 메소드 이므로 별도의 인스턴스를 생성해줄 필요가 없다.

package com.company;

import java.io.IOException;

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

public class Main {
    public static void main(String[] args) {
        try {
            //아래 URL 은 삭제되었을 수 있으므로, 문제가 발생한다면 최신 기사의 URL 을 사용한다.
            Document doc = Jsoup.connect("https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=105&oid=421&aid=0004721371").get();

            Elements elements = doc.select("#articleBodyContents");

            String[] p = elements.get(0).text().split("\\.");

            for (int i = 0; i < p.length; i++) {
                System.out.println(p[i]);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

기사-스크린샷-검정바탕에-하얀글씨
jsoup 라이브러리를 활용하여 네이버 뉴스 기사에 접근한 뒤 내용을 추출하여 console 창에 출력해보았다.

jsuop 라이브러리를 활용하면 jsoup 에서 제공하는 Document 객체를 활용하여 웹 페이지에서 불러온 페이지 정보를 내용을 더욱 편리하게 제어할 수 있다.

Q. 메소드체이닝이란?

String[] p = elements.get(0).text().split("\\.");

위 코드와 같이 .을 연속해서 찍는 형태를 의미한다.

Google 메인 페이지 링크 크롤링

구글 메인페이지에서 수많은 태그들 중에 특정 클래스(이 글에서는 .Fx4vi 클래스, 링크를 의미하는 클래스인 것으로 추정)를 찾아 해당 태그의 컨텐츠(웹페이지에 표시되는 글자)와 해당 태그의 href 속성의 값을 나타내보자.

import java.io.IOException;

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

public class Main {

    public static void main(String[] args) {
        try {
            //1. url 접근
            Document doc = Jsoup.connect("http://www.google.com").get();
            System.out.println(doc.text()); //text() : 웹 페이지 내의 텍스트만 추출
            System.out.println(doc.select(".Fx4vi").first()); //select(CSS Selector) : 웹 페이지에서 원하는 태그 검색
            System.out.println(doc.select(".Fx4vi").last());

            //2. 내가 추출하고자 하는 데이터 검색
            Elements elements = doc.select(".Fx4vi"); //Elements : ArrayList<Element> 형태로 태그가 저장
            System.out.println(elements.get(0).text());
            System.out.println(elements.get(3).text());
            System.out.println(elements.get(0).attr("href")); //attr(Attrubute) : 해당 태그의 속성값 추출

            System.out.println();
            for (int i = 0; i < elements.size(); i++) {
                System.out.println(elements.get(i).text() + " : " + elements.get(i).attr("href"));
                //클래스명이 `.Fx4vi` 인 태그에 해당하는 Text와 링크주소 출력
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

regex란?

REGEX (Regular Expression) : 정규표현식

파싱과 크롤링

파싱은 한 페이지에서 추출하는 기술이라면, 웹크롤링은 해당하는 페이지의 링크를 타고 타고 들어가 연쇄적으로 내용을 추출하는 기술을 의미한다.

파일 I/O

크롤링한 정보를 특정한 형식의 파일로 내보낼 수 있어야 한다.
따라서 이번 챕터에서는 파일을 읽고(INPUT), 쓰는(OUTPUT) 방법에 대해서 학습해보자.

이미 접한적이 있는 I/O

//Input
new Scanner(System.in); 

//Output
System.out.println();

스트림(Stream)

데이터 운반시 사용되는 연결통로라고 생각하자. 프로그램과 저장공간(운영체제에)의 사이에 연결다리라고도 할 수 있다. 컵에 담긴 음료와 사람의 입 사이에 빨대의 역할이라고 비유하기도 한다. 데이터를 한 공간에서 다른 공간으로 옮겨야 할 때, 그 운반을 담당하는 객체이다.

스트리밍 서비스 라는 이름으로 우리에겐 친숙한 용어이다.

스트림의 특징

  • 입력과 출력이 동시에 이루어지지는 않는다. 즉, 단방향인 특성을 가지고 있다(FIFO).
  • 전송형태는 binary. 2진수 형태로 전달된다.
  • 크게 바이트스트림과 문자스트림으로 분류할 수 있다.
    • 바이트 스트림
      1byte, 문자, 파일, 동영상, 이미지
      대표적으로 InputStream, OutputStream
    • 문자 스트림
      2byte(char형), 문자, 텍스트파일, 엑셀
      대표적으로 Reader, Writer, FileReader, FileWriter
    • Q. 둘의 결정적인 차이?
      문자는 자동으로 인코딩되지만, 바이트스트림은 또 다른 코딩스킬이 필요하다.
      여기서는 문자 스트림만을 다룬다.

JAVA FileReader, FileWriter

JAVA File 객체

정보관리 객체 : File
Q.File 을 사용하는 이유는?)
File 이 존재하는지 존재하지 않는지 알 수 있다. file.exists()
그 외 파일의 저장, 읽기, 수정 등의 다양한 역할을 수행할 수 있다.

FileWriter

import java.io.FileWriter;
import java.io.IOException;

public class FileWriterEx01 {

    public static void main(String[] args) {
        try {
            FileWriter fileWriter = new FileWriter("C:\\Users\\pc-13\\Desktop\\word.txt");

            fileWriter.write("안녕하세요. File 을 Writing 합니다.");

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

※ Stream 을 사용한 뒤에는 반드시 close를 해주자. (Scanner, FileWriter, fileReader 등)

FileReader

package com.IO;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class FileReaderEx01 {

    public static void main(String[] args) throws Exception {
        try {
            File file = new File("C:\\Users\\pc-13\\Desktop\\text.txt"); //이미 존재하는 파일이어야 한다. 없다면 만들어주자.
            System.out.println(file.exists()); // 파일 존재 여부 확인

            FileReader reader = new FileReader(file); // 입력 스트림 생성

            int ch = 0; // 문자 저장 변수 생성

            // FileReader 의 read() 함수는 실행할 때마다 파일 데이터를 문자단위(char)로 불러와 char형 데이터를 int 타입으로 리턴한다.
            // 더 이상 불러온 데이터가 존재하지 않으면 `-1`을 return한다.
            while ((ch = reader.read()) != -1) {
                System.out.print((char)ch);
            }

            reader.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

[스트림 실습1] 웹페이지 파싱 결과를 파일로 저장하기

import java.io.FileWriter;
import java.io.IOException;

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

public class FileWriterPractice01 {

    public static void main(String[] args) {
        try {
            //1.url 접근
            Document doc = Jsoup.connect("https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=105&oid=421&aid=0004721371").get();

            //2.찾고자 하는 태그를 검색
            Elements elements = doc.select("#articleBodyContents");

            //3.문자변환
            String[] p = elements.get(0).text().split("\\."); //.을 기준으로 나눠짐

            //4.파일 저장
            FileWriter fileWriter = new FileWriter("C:\\Users\\pc-13\\Desktop\\news.txt");

            for (int i = 0; i < p.length; i++) {
                System.out.println(p[i]);
                fileWriter.write(p[i] + "\r\n"); //텍스트내에서 줄바꿈 \r\n
            }

            fileWriter.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

EOL(End Of Line), 줄바꿈문자

\r\n 과 \n의 차이 : \n 은 윈도우 메모장에서 다음과 같은 문자가 표시된다. 따라서 = \r\n으로 해주어야 온전히 줄바꿈이 된다.

윈도우-줄바꿈문자-스크린샷
윈도우의 \n 줄바꿈 문자

 

반응형

Designed by JB FACTORY