[Java] 구글 설문조사 파싱

애이용·2021년 1월 2일
0

Java

목록 보기
2/8
post-thumbnail

구글 설문조사 양식

해당 설문조사 URL에 접속하면

위의 그림과 같이
설문조사 이름, 설문조사 설명, 설문조사 질문 리스트가 존재한다.
이때 질문에도 카테고리가 있는데, 크게 라디오버튼, 체크박스, 텍스트로 이루어져 있다.
또한 별 표시(*)가 있는 질문은 필수질문이다.

설문조사 이름, 설명, 질문 리스트(질문텍스트, 카테고리, 카테고리 서브텍스트, 필수문항 포함) 데이터를 뽑아오도록 하자

일단 Google, GoogleQuestion 클래스를 생성했다.

public class Google {

    private String name; // 설문조사 이름

    private String description; // 설명

    private List<GoogleQuestion> googleQuestions; // GoogleQuestion 리스트

}
public class GoogleQuestion {

    String questionText; // 질문 내용
    
    String category; // 질문 카테고리(ex. 라디오, 체크박스, 텍스트)
    
    boolean required; // 필수 문항 : true

    String[] questionChoices; // 서브 질문 배열
|

메인 !!!

설명은 주석 참고 바람
(한페이지당 하나의 질문으로 구성되어있는 설문조사는 불가능)

public class GoogleSurveyParsing {
    public static void main(String[] args) throws IOException {

        Google google = new Google();

        String GOOGLE_SURVEY_URL = "대상URL";

        Document doc = Jsoup.connect(GOOGLE_SURVEY_URL).get();
        Element element = doc.selectFirst(".freebirdFormviewerViewHeaderTitleRow"); // 설문조사 이름 select

        google.setName(element.text());

        element = doc.selectFirst(".freebirdFormviewerViewHeaderDescription"); // 설문조사 설명 select
        google.setDescription(element.text());

        Elements boxElements = doc.select(".freebirdFormviewerViewNumberedItemContainer"); // 각 질문 container


        List<GoogleQuestion> googleQuestionList = new ArrayList<>();
        for(Element e : boxElements) {

            // 질문 내용 & 필수항목 데이터

            GoogleQuestion googleQuestion = new GoogleQuestion();
            String questionText = e.selectFirst(".freebirdFormviewerComponentsQuestionBaseTitle").text(); // 질문내용 select
            googleQuestion.setQuestionText(questionText);
            if(questionText.charAt(questionText.length() - 1) == '*') { // 질문텍스트의 마지막 문자가 '*'이면 필수 문항에 해당
                googleQuestion.setRequired(true);
            }

            // 질문 카테고리 데이터

            String category = "";
            //  라디오 버튼 클래스명
            if (e.getElementsByClass("freebirdFormviewerViewItemsRadiogroupRadioGroup").size() > 0) category = "라디오";
            //  체크박스 클래스명
            if (e.getElementsByClass("freebirdFormviewerComponentsQuestionCheckboxRoot").size() > 0) category = "체크박스";
            //  텍스트 클래스명
            if (e.getElementsByClass("freebirdFormviewerComponentsQuestionTextRoot").size() > 0) category = "장문형";

            googleQuestion.setCategory(category);

            // 서브 질문 데이터

            Elements elements = e.select(".docssharedWizToggleLabeledPrimaryText"); // 서브 질문 텍스트 뽑기
            String[] subChoices = new String[elements.size()]; // 서브 질문 개수만큼 배열 선언
            int num = 0;
            for (Element eSub : elements) {
                subChoices[num++] = eSub.text();
            }

            googleQuestion.setQuestionChoices(subChoices);

            googleQuestionList.add(googleQuestion);

            google.setGoogleQuestions(googleQuestionList);
        }

        System.out.println(google.getName());
        System.out.println(google.getDescription());
        for(int i = 0; i < google.getGoogleQuestions().size(); i++){
            System.out.println("==============================================================================================================================================================================================");
            GoogleQuestion googleQuestion = googleQuestionList.get(i);
            System.out.println(googleQuestion.questionText);
            System.out.println("카테고리 : " + googleQuestion.category);
            System.out.println(googleQuestion.required?"(필수)":"(선택)");
            for(int j = 0; j < googleQuestion.getQuestionChoices().length; j++)
                System.out.println("    " +googleQuestion.questionChoices[j]);
        }
    }
}

프로젝트 하면서, 구글 설문조사의 url을 입력하면 파싱을 통해서 해당 데이터들을 데이터베이스에 저장해야하는 과제가 생겼다.
그래서 객체 클래스들을 따로 생성해서 만들었다.
구글 설문조사도 이렇게 데이터를 뽑아올 수 있을 거란 생각은 못했는데, 이번 기회에 할 수 있어서 매우 뿌듯 😀

profile
로그를 남기자 〰️

0개의 댓글