즐겁게!! 자신있게!! 살아보세!!

재밌는 인생을 위하여! 영촤!

Language_Study/JAVA

[JAVA, App] 20.Parsing

Godwony 2020. 12. 28. 18:11
728x90
반응형

XML Parsing

  • RSS(Really Simple Syndication, Rich Site Summary): 빠른 속도로 변경되는 데이터를 제공하기 위한 서비스로 예전에는 XML을 많이 사용
  • XML: 태그 형식으로 표현하는 데이터 포맷
    • XML 의 해석은 XML 상단에 DTD가 있으면 DTD가 하고 없으면 개발자가 해석
  • HTML은 브라우저가 해석하기 때문에 우리가 원하는 내용만 골라서 보는게 안되고 출력을 직접 하게 되면 화면크기에 따라 원하는 모양으로 볼 수가 없습니다.
    • 데이터를 제공해서 보고자 하는 쪽에서 원하는 것만 골라서 원하는 크기로 볼 수 있도록 해줍니다.

1.XML Parsing

  • DOM(Document Object Model) Parser 이용
    • 내용을 메모리에 트리 형태로 전부 펼쳐놓고 원하는 데이터를 찾아가는 방식
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocuemtBuilder();
Document document = builder.parse(String uri);
//uri 대신에 InputStream inputStream, File file 을 대입해도 됩니다.
//DOM의 형태로 메모리에 펼칩니다.

//루트 찾기
Element root = document.getDocumentElement();

//원하는 태그 찾아오기
NodeList list = root.getElementsByTagName(String tag);
//위에서 찾은 list를 가지고 반복문을 수행
int n = list.getLength();
for(int i=0; i<n; i=i+1){
    Node item = list.item(i);
    Node text = item.getFirstChild();
    text.getNodeValue() //태그 안의 내용
}
public class HaniMain {

    public static void main(String[] args) {
        //문자열을 다운로드 받는 부분
        //다운로드 받은 문자열을 저장할 변수
        String xml = null;
        try {
            URL url = new URL("http://www.hani.co.kr/rss/sports/");
            HttpURLConnection con = (HttpURLConnection)url.openConnection();
            con.setConnectTimeout(20000);
            con.setUseCaches(false);

            BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
            StringBuilder sb = new StringBuilder();
            while(true) {
                String line = br.readLine();
                if(line == null) {
                    break;
                }
                sb.append(line + "\n");
            }
            //데이터를 문자열로 변환
            xml = sb.toString();
            //System.out.println(xml);

        }catch(Exception e) {
            System.out.println("다운로드 예외:" + e.getMessage());
            e.printStackTrace();
        }

        //xml 파싱을 해서 출력하는 부분
        if(xml == null) {
            System.out.println("데이터를 다운로드 받지 못했습니다.");
        }else {
            try {
                //String을 InputStream으로 변환
                InputStream is = new ByteArrayInputStream(xml.getBytes());

                //파싱 객체를 생성
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                DocumentBuilder builder = factory.newDocumentBuilder();
                //메모리에 펼치기 - DOM
                Document document = builder.parse(is);
                //루트 찾기
                Element root = document.getDocumentElement();

                //원하는 태그 찾아오기 - title 태그와 link 태그의 데이터 찾아오기
                NodeList titleList = root.getElementsByTagName("title");
                NodeList linkList = root.getElementsByTagName("link");

                //데이터 개수 알아내기
                int len = titleList.getLength();

                ArrayList<String> titles = new ArrayList<String>();

                //순회
                for(int i = 0; i<len; i=i+1) {
                    //태그 하나의 항목 가져오기
                    Node title = titleList.item(i);
                    Node link = linkList.item(i);
                    //태그 하나의 텍스트 출력
                    Node imsi = title.getFirstChild();
                    System.out.print(imsi.getNodeValue());
                    titles.add(imsi.getNodeValue());

                    Node temp = link.getFirstChild();
                    System.out.print(":" + temp.getNodeValue());

                    System.out.print("\n");
                }

                int i = 0;
                while(true) {
                    System.out.println(titles.get(i%titles.size()));
                    Thread.sleep(3000);
                    i = i+1;
                }

            }catch(Exception e) {
                System.out.println("xml 파싱 예외:" + e.getMessage());
                e.printStackTrace();
            }

        }
    }

}

java 에서의 외부 라이브러리 사용

  • 일반 java application 은 jar(java 압축 파일) 파일을 build path에 추가
  • java web application 은 WEB-INF/lib 디렉토리에 jar 파일을 복사
  • maven 이나 gradle 기반의 프로젝트는 설정 파일에 의존성을 설정
  • 자바 라이브러리는 www.mvnrepository.com에서 다운로드 가능

json parsing

1.JSON

  • 자바스크립트 객체 표현법으로 데이터를 표현
    • 파이썬의 list 와 dict 표현법과도 동일
  • {"key":"value", "key":"value"....} : 객체
  • ["data1", "data2"....] : 배열

2.파싱을 할려면 외부 라이브러리 이용

1) www.mvnrepository.com 에서 json을 검색해서 다운로드

2) 다운로드 한 파일을 프로젝트에 복사

3) 복사한 파일을 선택하고 마우스 오른쪽을 클릭해서 [Build Path] - [Add To Build Path]를 클릭
* Build Path에 추가하면 실행할 때 이 파일에 있는 클래스들을 jvm이 로드를 사용할 수 있도록 해줍니다.

3.파싱

1) JSONObject

  • 객체를 가져올 때 사용하는 자료형

2) JSONArray

  • 배열을 가져올 때 사용하는 자료형

3) 파싱 과정

  • 문자열을 가지고 new JSONObject(String json) 이나 new JSONArray(String json)을 호출해서 객체나 배열 생성

  • JSONObject는 get자료형(String key): key에 해당하는 데이터를 자료형으로 리턴

  • JSONArray는 get자료형(int index): index에 해당하는 데이터를 자료형으로 리턴, 배열은 개수를 length 메소드로 리턴

4) kakao open api 사용

  • 최근의 open api 들은 인증키를 url에 포함시키지 않고 header에 포함시켜서 요청하도록 합니다.

  • developer.kakao.com에서 open api 데이터 사용을 신청

    • 228e2b377f259ec5a956a267b27ded62
  • 도서검색

  • URL - https://dapi.kakao.com/v3/search/book?target=title&query=검색할 도서명

  • Header - Authorization: KakaoAK 228e2b377f259ec5a956a267b27ded62"

  • URL은 반드시 인코딩을 해주어야 합니다.

  • 한글이 있으면 UTF-8로 변환해서 대입해야 합니다.

  • java.net.Encoder.encode(String str, String enctype);

  • java.net.Encoder.encode("미움받을 용기", "utf-8");

  • ?뒤에 들어가는 데이터를 parameter 라고 하는데 이름=값&이름=값... 의 형태

  • 파라미터는 순서가 없기 때문에 아무거나 먼저 입력해도 됩니다.

4.kakao 의 도서검색 API 파싱

public class KakaoOpenAPI {

    public static void main(String[] args) {
        //데이터를 다운로드 받는 부분
        String json = null;
        try {
            //검색할 도서이름 입력
            System.out.print("검색할 도서명:");
            Scanner sc = new Scanner(System.in);
            String book = sc.nextLine();

            //book을 한글로 입력할 수 도 있으므로 인코딩
            book = URLEncoder.encode(book, "utf-8");

            //다운로드 받을 URL생성
            URL url = new URL(
                "https://dapi.kakao.com/v3/search/book?size=50&page=2&sort=latest&target=title&query=" + book);
            //연결 객체 생성
            HttpURLConnection con = (HttpURLConnection)url.openConnection();
            //옵션 설정
            con.setConnectTimeout(20000);
            con.setUseCaches(false);
            //헤더 설정
            con.addRequestProperty(
                "Authorization", "KakaoAK 228e2b377f259ec5a956a267b27ded62");

            BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
            StringBuilder sb = new StringBuilder();
            while(true) {
                String line = br.readLine();
                if(line == null) {
                    break;
                }
                sb.append(line + "\n");
            }
            json = sb.toString();

            br.close();
            con.disconnect();
            sc.close();

            //System.out.println(json);

        }catch(Exception e) {
            System.out.println("다운로드 예외:" + e.getMessage());
            e.printStackTrace();
        }

        //데이터를 파싱하는 부분
        if(json == null) {
            System.out.println("읽어온 데이터가 없습니다.");
        }else {
            //전체 문자열을 JSON 객체로 변환
            JSONObject root = new JSONObject(json);
            //System.out.println(root);

            //meta 키의 내용을 JSONObject로 가져오기
            //JSONObject meta = root.getJSONObject("meta");
            //System.out.println(meta);

            //documents 키의 내용을 JSONArray로 가져오기
            JSONArray documents = root.getJSONArray("documents");
            //System.out.println(documents);

            //배열의 데이터 개수 찾아오기
            int len = documents.length();
            for(int i=0; i<len; i=i+1) {
                JSONObject document = documents.getJSONObject(i);
                //System.out.println(document);
                try {
                    String title = document.getString("title");
                    int price = document.getInt("price");
                    String thumb = document.getString("thumbnail");
                    //인코딩은 문자열을 메모리에 저장되는 코드로 변환하는 것이고 
                    //디코딩은 메모리에 저장된 코드를 원래의 문자열로 복원하는 것입니다.
                    System.out.println(
                            title + ":" + price + "원" + URLDecoder.decode(thumb,"utf-8"));
                }catch(Exception e) {}
            }
        }

    }

}

HTML 파싱

  • 사이트에서 출력은 되어 있는데 Open API 형태로 데이터를 제공하지 않는 경우 HTML을 읽어서 사용

  • HTML 가져올 때는 URL의 인코딩에 주의하고 읽어온 데이터의 인코딩에도 주의

  • 읽어야 하는 데이터가 ajax(비동기적으로 데이터 가져오는 기술) 형태로 만들어져 있거나 로그인을 해야하는 경우 또는 자바스크립트 코드를 실행해야 하는 경우에는 selenium 같은 라이브러리를 사용해야 합니다.

  • 자바에서 HTML 파싱에 많이 이용되는 라이브러리는 JSoup

  • tag: 중복 될 수 있습니다.

  • id: 중복될 수 없습니다. - 개발자가 만든 것이라서 없는 태그도 있습니다.

  • class: 중복 될 수 있습니다.

  • xpath: 중복 될 수 없습니다. - 태그의 경로라서 개발자가 만드는 것이 아니고 브라우저가 위치를 찾는 개념

  • selector: DOM 객체를 선택하기 위한 문법

HTML

1.Tag: 브라우저가 해석해서 랜더링하기 위한 명령어

  • 하나의 페이지에서 중복될 수 있습니다.

2.class: 동일한 디자인을 적용하기 위해서 태그에 적용하는 속성

  • 하나의 페이지에서 중복될 수 있습니다.

3.id: 자바스크립트에서 하나의 태그를 구분하기 위해서 적용하는 속성

  • 하나의 페이지에서는 절대로 중복될 수 없습니다.

4.name: 서버에서 처리하기 위해 붙이는 이름

  • 중복될 수 있습니다.

5.attribute: 태그 내에서 설정하는 옵션으로 key-value 형태로 설정

  • <태그 옵션이름='값'> : 스크래핑을 할 때는 a 태그의 href 속성이 가장 중요

6.selector: 별도로 설정하는 것이 아니고 css 에서 태그들을 선택하기 위해 만든 문법

태그
.클래스이름
#id

7.xpath: 별도로 설정하는 것이 아니고 브라우저가 태그의 경로를 나타내기 위해서 사용하는 문법

  • 태그의 경로를 구분해서 나타내기 때문에 중복될 수 없습니다.

java가 실행을 할 때 클래스를 찾는 방법

1.자신의 애플리케이션에 찾습니다.

2.1번에서 없으면 jvm이 제공하는 라이브러리에서 찾습니다.

3.자바실행을 할 때 자신의 build path에 추가된 라이브러리를 jvm에 로드를 합니다.

  • 2번에서도 없으면 build path에 추가된 라이브러리에서 찾습니다.
  • build path에 추가될 때는 링크가 설정됩니다.
  • 외부 라이브러리를 사용할 때는 프로젝트에서 포함해서 배포를 하던가 다운로드 링크를 같이 제공해야 합니다.

HTML Parsing

  • Java 에서는 Python 의 BeautifulSoup 와 유사한 JSoup 라는 라이브러리를 이용

1.https://www.naver.com에서 원하는 항목의 값 가져오기

1) 프로젝트의 build path 에 jsoup 라이브러리를 추가

  • www.mvnrepository.com에서 jsoup를 검색해서 다운로드
  • 다운로드 받은 파일을 프로젝트에 복사
  • 복사한 파일을 선택해서 마우스 오른쪽을 클릭하고 [Build Path] - [Add To Build Path]를 실행

2) 코드를 작성

public class NaverMain {

    public static void main(String[] args) {
        //필요한 HTML을 다운로드 : https://www.naver.com에서 다운로드
        String html = null;
        try {
            //다운로드 받을 URL을 생성
            //URL에 한글이 있으면 URLEncoder.encode 이용해서 인코딩을 해야 합니다.
            String addr = "https://www.naver.com";
            URL url = new URL(addr);

            //연결
            HttpURLConnection con = (HttpURLConnection)url.openConnection();
            con.setConnectTimeout(30000);
            con.setUseCaches(false);

            //데이터를 다운로드
            StringBuilder sb = new StringBuilder();
            BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
            while(true) {
                String line = br.readLine();
                if(line == null) {
                    break;
                }
                sb.append(line + "\n");
            }

            //사용한 스트림 정리
            br.close();
            con.disconnect();
            //데이터 확인
            html = sb.toString();
            //System.out.println(html);

        }catch(Exception e) {
            System.out.println("다운로드 예외:" + e.getMessage());
            e.printStackTrace();
        }

        if(html == null) {
            System.out.println("다운로드 받은 문자열이 없습니다.");
            return;
        }

        //HTML 파싱을 해서 원하는 자료구조를 만들기
        try {
            //문자열을 메모리에 DOM(Document Object Model)으로 펼치기
            Document document = Jsoup.parse(html);
            //span 태그 가져오기 - 태그는 중복될 수 있으므로 여러 개 리턴
            /*
            Elements span = document.getElementsByTag("span");
            //가져온 데이터를 순회하면서 출력
            for(int i=0; i < span.size(); i=i+1) {
                Element element = span.get(i);
                System.out.println(element.text());
            }
            */

            //클래스 이름을 이용해서 찾아오기
            /*
            Elements span = document.getElementsByClass("an_txt");
            //가져온 데이터를 순회하면서 출력
            for(int i=0; i < span.size(); i=i+1) {
                Element element = span.get(i);
                System.out.println(element.text());
            }
            */

            //선택자 이용
            Elements span = document.select("#PM_ID_serviceNavi > li:nth-child(9) > a > span.an_txt");
            //가져온 데이터를 순회하면서 출력
            for(int i=0; i < span.size(); i=i+1) {
                Element element = span.get(i);
                //text() 대신에 getAttr(String key)를 이용하면 속성의 값을 가져옴
                System.out.println(element.text());
            }

        }catch(Exception e) {
            System.out.println("파싱 예외:" + e.getMessage());
            e.printStackTrace();
        }

    }

}

2.한겨레 신문사에서 검색을 해서 실제 기사를 전부 읽어서 파일에 저장하기

    public static void main(String[] args) {
        //한겨레 신문사 웹 페이지에서 코로나 로 검색된 기사 내용을 전부 파일에 저장하기

        //1.코로나로 검색된 기사 개수 파악하기
        //기사 개수를 저장할 변수
        int cnt = 0;
        try {
            //한글로 된 검색어를 인코딩
            String keyword = URLEncoder.encode("코로나", "utf-8");
            //한겨레 신문사 뉴스 검색 URL 만들기
            String addr = "http://search.hani.co.kr/Search?command=query&keyword=" 
                          + keyword 
                          + "&media=news&submedia=&sort=d&period=all"
                          + "&datefrom=2000.01.01&dateto=2020.01.28&pageseq=0";
            URL url = new URL(addr);
            //연결 옵션과 연결
            HttpURLConnection con = (HttpURLConnection)url.openConnection();
            con.setConnectTimeout(20000);
            con.setUseCaches(false);

            //문자열을 전부 읽어서 sb에 저장하기
            StringBuilder sb = new StringBuilder();
            BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
            while(true) {
                String line = br.readLine();
                if(line == null) {
                    break;
                }
                sb.append(line + "\n");
            }
            String html = sb.toString();
            br.close();
            con.disconnect();
            //데이터 확인 - 확인되면 주석 처리
            //System.out.println(html);

            //html을 DOM 으로 펼치기
            Document document = Jsoup.parse(html);

            //태그 이름으로 찾기
            //Elements spans = document.getElementsByTag("span");

            //클래스이름으로 찾기
            //Elements spans = document.getElementsByClass("total");

            //선택자를 이용해서 찾기
            Elements spans = document.select(
                    "#contents > div.search-result-section.first-child > div > span");

            String temp = spans.get(0).text();
            //240 건 이라고 temp 에 저장
            //240만 추출해서 정수로 변환해서 cnt에 저장
            //공백으로 분할한 후 첫번째 데이터를 정수로 변환해서 cnt에 저장
            String [] ar = temp.split(" ");
            cnt = Integer.parseInt(ar[0]);
            //System.out.println(cnt);

        }catch(Exception e) {
            System.out.println("기사 개수 파악 예외:" + e.getMessage());
            e.printStackTrace();
        }

        if(cnt <= 0) {
            System.out.println("검색된 기사가 없습니다.");
            return;
        }

        //검색된 데이터의 링크를 전부 찾아서 list에 삽입
        ArrayList <String> list = new ArrayList<String>();
        try {
            //페이지 개수 구하기
            int pagesu = cnt / 10;
            if(pagesu % 10 != 0) {
                pagesu = pagesu + 1;
            }

            //페이지 단위로 순회
            for(int i=0; i<pagesu; i=i+1) {
                //한글로 된 검색어를 인코딩
                String keyword = URLEncoder.encode("코로나", "utf-8");
                //한겨레 신문사 뉴스 검색 URL 만들기
                String addr = "http://search.hani.co.kr/Search?command=query&keyword=" 
                              + keyword 
                              + "&media=news&submedia=&sort=d&period=all"
                              + "&datefrom=2000.01.01&dateto=2020.01.28&pageseq=" + i;
                URL url = new URL(addr);

                //연결 객체 만들기
                HttpURLConnection con = (HttpURLConnection)url.openConnection();
                con.setConnectTimeout(10000);
                con.setUseCaches(false);

                //특정 페이지의 데이터를 읽지 못하더라도 다음 페이지의 데이터를 읽기 위해서 반복문안에 예외처리문장 삽입
                try {
                    StringBuilder sb = new StringBuilder();
                    BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
                    while(true) {
                        String line = br.readLine();
                        if(line == null) {
                            break;
                        }
                        sb.append(line + "\n");
                    }
                    String html = sb.toString();
                    br.close();
                    con.disconnect();

                    Document document = Jsoup.parse(html);
                    Elements links = document.select("dl > dt > a");
                    for(int j=0; j<links.size(); j=j+1) {
                        //a 태그 안에 있는 문자열을 가져오기
                        //System.out.println(links.get(j).text());

                        //a 태그의 href 속성의 값 가져오기
                        //System.out.println(links.get(j).attr("href"));
                        list.add(links.get(j).attr("href"));
                    }
                    //System.out.println(list.size());

                }catch(Exception e) {
                    System.out.println("링크 수집 실패:" + e.getMessage());
                    e.printStackTrace();
                }

            }

        }catch(Exception e) {
            System.out.println("링크 수집 예외:" + e.getMessage());
            e.printStackTrace();
        }

        //list에 저장된 링크의 기사 데이터를 전부 읽어서 파일에 저장하기
        try {
            for(String addr : list) {
                try {
                    URL url = new URL(addr);
                    HttpURLConnection con = (HttpURLConnection)url.openConnection();
                    con.setUseCaches(false);
                    con.setConnectTimeout(10000);

                    StringBuilder sb = new StringBuilder();
                    BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
                    while(true) {
                        String line = br.readLine();
                        if(line == null) {
                            break;
                        }
                        sb.append(line + "\n");
                    }
                    String html = sb.toString();
                    br.close();
                    con.disconnect();
                    //System.out.println(html);
                    //파일에 기록

                    Document document = Jsoup.parse(html);
                    //class가 title 인 태그만 찾아오기
                    Elements articles = document.getElementsByClass("text");
                    //찾아온 데이터를 파일에 기록
                    for(int i=0; i<articles.size(); i=i+1) {
                        PrintWriter pw = new PrintWriter(
                                new FileOutputStream("./코로나.txt", true));
                        pw.println(articles.get(i).text());
                        pw.flush();
                        pw.close();
                    }

                    //실제 여러 개의 페이지에서 스크래핑 할 때 딜레이를 주는 것이 좋습니다.
                    //Thread.sleep(1000);
                }catch(Exception e) {
                    System.out.println("기사 읽기 예외:" + e.getMessage());
                }
            }

        }catch(Exception e) {
            System.out.println("링크 읽기 예외:" + e.getMessage());
            e.printStackTrace();
        }

    }

일반적인 방법으로 web의 데이터를 못 읽는 경우

1.ajax 를 이용해서 동적으로 데이터를 가져와서 출력하는 경우

  • ajax: 현재 페이지를 다시 호출하지 않고 동적으로 데이터를 가져오는 기술
    • java 의 HttpURLConnection 이나 python의 requests 모듈은 접속했을 때 존재하는 데이터만 읽어 올 수 있습니다.

2.로그인을 해야만 사용이 가능한 데이터

selenium

  • 웹 페이지를 테스트 하기 위한 라이브러리로 출발
  • 브라우저를 실행시켜 직접 제어가능한 라이브러리
  • 브라우저로 URL에 접속한 후 일정 시간 대기 한 후 페이지의 데이터를 읽어내면 ajax 형태로 읽어오는 데이터도 사용이 가능
  • 자바스크립트를 이용해서 로그인과 같은 폼에 데이터 입력이 가능하기 때문에 로그인 한 후 접근 가능한 데이터도 사용이 가능
  • 자바 이외 파이썬에서도 사용이 가능

1.준비

1) selenium 라이브러리를 다운로드 받아서 프로젝트에 포함

  • www.seleniumhq.org에서 다운로드
  • 다운로드 받은 파일을 프로젝트에 복사하고 파일을 선택한 후 [Build Path] - [Add To Build Path]

2) 동작시키고자 하는 브라우저의 드라이버 파일을 다운로드

  • 브라우저 없이 하고자 하면 pantom.js를 다운로드 받으면 되는데 deprecated
  • chrome 의 경우는 버전에 맞는 드라이버를 다운로드
  • https://chromedriver.chromium.org/downloads 에서 다운로드 한 후 압축해제

2.크롬을 실행시켜 사이트에 접속

1) 크롬 드라이버 이름과 드라이버 위치를 시스템 프로퍼티에 추가
System.setProperty("webdriver.chrome.driver", String 드라이버 파일의 경로);

2) 크롬 실행
WebDriver driver = new ChromeDriver();

3) 사이트 접속
driver.get("사이트 URL");

4) 사이트의 html
drvier.getPageSource()

5) 크롬을 실행시켜 naver에 접속하고 html 가져오기

public static void main(String[] args) {
        //크롬 드라이버의 위치를 프로퍼티에 추가
        System.setProperty("webdriver.chrome.driver", "c:\\chromedriver.exe");
        //크롬 실행
        WebDriver driver = new ChromeDriver();
        //크롬에서 사이트에 접속
        driver.get("https://www.naver.com");
        //접속한 사이트의 html 가져오기
        System.out.println(driver.getPageSource());
    }

3.Element 선택

driver.findElement(By.id, "id")
driver.findElement(By.xpath, "xpath")

driver.findElements(By.tagName, "tag")
driver.findElements(By.class, "class")
  • 선택한 요소가 폼의 입력도구 인 경우 .send_keys(String value) 를 호출하면 value 폼의 입력도구가 채워짐
  • 선택한 요소가 폼의 버튼이나 링크 인 경우 .click() 를 호출하면 버튼이나 링크를 클릭한 효과
  • 폼의 submit 이면 .submit()을 호출하면 폼의 데이터를 전송

4.페이지 접속과 해제

  • get(String url): url에 접속

  • close(): 종료

5.프레임(페이지를 나누어서 다른 html을 불러온다던가 다른 DOM 객체를 가져와서 출력)전환

  • switchTo().frame(프레임 Element)

6.크롬을 실행시키지 않고 작업

ChromeOptions options = new ChromeOptions();
options.addArguments("headless");
WebDriver driver = new ChromeDriver(options);

7.다음 로그인을 해서 카페에 글 쓰기

public class DaumLogin {

    public static void main(String[] args) {
        //크롬 드라이버의 위치를 프로퍼티에 추가
        System.setProperty("webdriver.chrome.driver", "c:\\chromedriver.exe");
        //크롬 실행
        WebDriver driver = new ChromeDriver();
        //크롬에서 다음 로그인 사이트에 접속
        driver.get("https://logins.daum.net/accounts/signinform.do?url=https%3A%2F%2Fwww.daum.net%2F");

        //아이디와 비밀번호 입력받기
        Scanner sc = new Scanner(System.in);
        System.out.print("아이디를 입력하세요:");
        String id = sc.nextLine();
        System.out.print("비밀번호를 입력하세요:");
        String pw = sc.nextLine();

        //아이디란과 비밀번호 입력란에 입력받은 내용을 입력하기
        driver.findElement(By.xpath("//*[@id=\"id\"]")).sendKeys(id);
        driver.findElement(By.xpath("//*[@id=\"inputPwd\"]")).sendKeys(pw);

        //로그인 버튼 클릭
        driver.findElement(By.xpath("//*[@id=\"loginBtn\"]")).click();

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //카페에 접속
        //ggangpae1 - wnddkd1969
        driver.get("http://cafe.daum.net/samhak7/_memo");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //프레임을 전환 : down 이라는 프레임으로 전환
        driver.switchTo().frame(driver.findElement(By.id("down")));
        System.out.print("입력할 메모:");
        String memo = sc.nextLine();
        //입력받은 내용을 입력란에 추가
        driver.findElement(By.xpath(
                "//*[@id=\"memoForm\"]/div/table/tbody/tr[1]/td[1]/div/textarea")).sendKeys(memo);
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //등록 버튼 클릭
        driver.findElement(By.xpath(
            "//*[@id=\"memoForm\"]/div/table/tbody/tr[1]/td[2]/a[1]/span[2]")).click();
        sc.close();

    }

}
728x90
반응형

'Language_Study > JAVA' 카테고리의 다른 글

[JAVA, App] 22.Stream API  (0) 2020.12.28
[JAVA, App] 21.Lambda  (0) 2020.12.28
[JAVA, App] 19.통신  (0) 2020.12.27
[JAVA, App] 18.Stream  (0) 2020.12.27
[JAVA, App] 17.자바GUI  (0) 2020.12.27