본문 바로가기
MyProject

[Project]AutoMailing WebServer(Spring 웹 스크래핑 부분)

by BK0625 2023. 4. 14.
반응형

전 직장에서 받은 단기 프로젝트이다.

 

당시 회사에서는 유해물질 측정 센서의 결과 값을 이용하는 프로젝트가 진행 중이였다.

 

문제는 간혹 센서가 꺼져버리는 경우가 있어서 센서가 잘 살아있는지 외부센서 API를 확인한 후에 전 날 센서가 이상이 없는지 확인해서 구두로 알리라는 지시가 내려왔다.

 

그런데 같이 일하는 동기가 매일 같은 업무를 하기 싫었는지 이걸 자동화 시켜보자고 했다.ㅋㅋ

 

API 서버는 5분 단위의 정보만 제공하지만 해당 정보를 날마다 보여주는 웹 페이지가 있었다.

 

처음엔 API 서버를 이용하려다가 그러면 하루가 1440분이니까 288번 API 서버를 다녀와야 했기 때문에 그냥 웹 페이지에서 웹 스크래핑을 통해 데이터를 긁어온 뒤 이상여부를 확인 후 메일로 자동으로 보내기로 했다.

 

그래서 나는 파이썬으로 한번 구현해본적이 있는 웹 스크래핑을, 같이 일하는 동기가 자동 메일을 만들기로 했다.

 

package kir.nclcorp.comm;

import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
//import org.jsoup.nodes.Elements;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.sql.Array;
import java.util.*;

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

public class WebScraping {
    //private final ObjectMapper objectMapper;
    //private final ResourceLoader resourceLoader;

    public static List<Map<String, String>> doScrape(String date, String seq) {
        String URL = "그 때 사용했던 URL"+seq+"&search_date="+date+"&search_time=&search_use_yn=Y";
        Document doc = null;
        try{
            doc = (Document) Jsoup.connect(URL).get();
        }catch (IOException e){
            System.out.println(e.getMessage());
        }

        Elements elements2 = doc.select("tbody > tr > td > p >strong");

        String[] arr = elements2.toString().split("<strong>");

        int lastLen = arr.length/16;

        List<Map<String, String>> list = new ArrayList<Map<String,String>>();

        for(int i=0; i<lastLen; i++){
            Map<String,String> map = new HashMap<String,String>();
            System.out.println(elements2.get((i*16)).text());
            map.put("센서시간",elements2.get((i*16)).text());
            map.put("등록시간",elements2.get((i*16)+1).text());
            map.put("PM10",elements2.get((i*16)+2).text());
            map.put("PM2.5",elements2.get((i*16)+3).text());
            map.put("PM1.0",elements2.get((i*16)+4).text());
            map.put("HUMI",elements2.get((i*16)+5).text());
            map.put("TEMP",elements2.get((i*16)+6).text());
            map.put("CO2",elements2.get((i*16)+7).text());
            map.put("VOC",elements2.get((i*16)+8).text());
            map.put("CO",elements2.get((i*16)+9).text());
            map.put("HCHO",elements2.get((i*16)+10).text());
            map.put("NO2",elements2.get((i*16)+11).text());
            map.put("O3",elements2.get((i*16)+12).text());
            map.put("SO2",elements2.get((i*16)+13).text());
            map.put("WD",elements2.get((i*16)+14).text());
            map.put("WS",elements2.get((i*16)+15).text());

            list.add(map);


        }
        return list;
    }
}

 

전체 코드다. 일단 해당 날짜와 센서 번호를 인자로 받아온다. 그래서 이렇게 Get 방식으로 웹페이지에 접속하는 것을 이용해 원하는 날짜의 정보와 센서의 값을 가져올 수 있도록 했다.

 

JSoup 라이브러리를 사용해서 웹 스크래핑을 진행했다.

 

 

이렇게 JSoup를 이용해서 해당 페이지의 소스 파일을 죄다 긁어서 가져온다.

 

 

 

그리고 우리가 원하는 정보는 테이블 안에 p 태그 안에 strong 태그 안에 있었기 때문에 해당 요소를 가져와서 select해준다.

 

 

그리고 이걸 <strong> 태그만 자르고 안에 데이터들만 배열 안에 넣어준다.

 

데이터의 항목은 총 16개이기 때문에

 

 

이렇게 반복문을 통해서 List<Map<String,String> list 에 담어서 넘겨주면 된다.

(반복문 안에 Map에 데이터를 넣고 반복문 마지막에서 list에 add)

 

이렇게 리스트를 return 해주면 내 임무는 끝이다.

 

메일 부분이 궁금하다면 아래 URL로..

http://dequista.tistory.com/25

 

AutoMailing WebServer

엔씨엘에서 두번째로 받은 단기프로젝트. 유해물질 측정 센서의 결과 값 다루는 프로젝트가 사내에서 진행중이다. 하지만 센서가 문제가 있는지 1분에 한 번씩 검출해야하는데 간혹 센서가 꺼

dequista.tistory.com

 

Github

https://github.com/chobkyu/NCL-Auto_Mailing

 

GitHub - chobkyu/NCL-Auto_Mailing: Scrap and mail

Scrap and mail. Contribute to chobkyu/NCL-Auto_Mailing development by creating an account on GitHub.

github.com

 

반응형