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() //태그 안의 내용
}
- http://www.hani.co.kr/rss/sports/ : 한겨레 스포츠 rss
- 위 주소에서 title 과 link 만 추출해서 출력
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.한겨레 신문사에서 검색을 해서 실제 기사를 전부 읽어서 파일에 저장하기
검색을 이용해서 데이터를 읽어올 때는 주소 패턴을 정확하게 이해
http://search.hani.co.kr/Search?command=query&keyword=%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D&media=news&submedia=&sort=d&period=all&datefrom=2000.01.01&dateto=2020.01.28&pageseq=2keyword 가 검색어
datefrom 이 시작날짜 dateto가 종료 날짜
pageseq가 페이지 번호 - 0부터 시작
기사 개수를 읽어오는 것이 먼저 - 반복문을 언제까지 돌려하는지 설정
기사 검색이나 게시판, sns 검색의 경우 검색의 결과로 나온것은 대부분 제목과 본문의 링크입니다.
검색의 결과에서 링크를 전부 찾아서 실제 기사나 본문의 내용을 읽어와야 합니다.
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) 사이트의 htmldrvier.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();
}
}
'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 |