본문 바로가기

웹_프론트_백엔드/JAVA프레임윅기반_풀스택

2020.04.03

1. HTML, XML [Document Object Model (DOM)] 파싱 방법
1) Jsoup(외부 라이브러리)
2) w3c.org 사용(기본)

 


2. JSON 파싱 방법
1) json.org
2) jackson-databind

 

 

3. 빨간색 엑스는 주로 코드 문제, 빨간색 느낀표는 주로 Build Path 문제

 

4. 해당 웹페이지가 동적인지 정적인지 확인하기

 : json으로 끌어오지 못함

 

** 동적인 부분은 JavaScript를 이용
① 페이지 소스 보기(Ctrl + U)에서 보면 정적인 소스 코드를 볼 수 없다

② web developer 툴을 이용해서 JS만 제외 시킬수 있다.

 

** 이때, postman이라는 툴을 이용해 볼 수 있다..!

 : https://www.postman.com/ 다운 가능, 아래의의 사진의 파란색 별 부분이 json

 

[실습코드]

 

1. Lec32_WebCrawl
1) com.lec.java.crawl13 패키지, Crawl13Main 클래스

** Crawl13Main 클래스

package com.lec.java.crawl13;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

/*
 * Jackson 라이브러리
 * 	Java Object를 JSON으로 변환하거나 JSON을 Java Object로 변환하는데 사용할 수 있는 Java 라이브러리입니다.
 * 		Jackson Github - https://github.com/FasterXML/jackson
 * 
 * Jackson 특징
 * 	1.Stream API : 스트림 형식으로 데이터를 분석하고 생성하기 때문에 성능이 좋습니다.
 * 	2.Tree Model : XML의 DOM 처럼 Node 형태로 데이터를 다룰 수 있기 때문에 유연성이 좋습니다.
 * 	3.Data Binding : POJO 기반의 자바 객체들을 JSON으로 변환시킬 수 있습니다.
 * 
 * Maven 설정
 * 	jackson-databind 라이브러리는 jackson-core 및 jackson-annotation 라이브러리의 의존성을 포함하기 때문에 
 * 	메이븐을 사용하는 경우 jackson-databind 라이브러리만 추가해주시면 됩니다.
 * 
 * MVNrepository : v 2.10.2
 * 	https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
 * 	https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core
 * 	https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations
 * 
 * 	JavaScript의 배열	↔	Java의 list<>
 * 	JavaScript의 object	↔	Java의 객체(Class)
 * 
 */

public class Crawl13Main {

	public static void main(String[] args) {
		System.out.println("jackson-databind 사용");

		User user = new User();
		user.setName("제이슨");
		user.setAge(10);
		user.setScore1(new Score(100, 80, 70));
		List<String> list = new ArrayList<String>();
		list.add("JSON 은 Javascript Object Notation 의 약자입니다");
		list.add("JSON 은 데이터 교환 포맷으로 인기 짱입니다");
		list.add("JSON 은 배열이 있습니다 (XML보다 장점!)");
		list.add("JSON 은 타입 검증에 대해선 XML보다 약합니다");
		user.setMessages(list);
		
		javaToJson(user);
		
		jsonToJava();
		
		System.out.println("\n프로그램 종료");
	} // end main()
	
	// Java 객체 --> JSON 변환
	public static void javaToJson(User user) {
		ObjectMapper mapper = new ObjectMapper();
		try {
			// Java 객체(user) --> JSON 변화 (user.json 파일)
			mapper.writeValue(new File("data/user.json"), user);
			
			// Java 객체 --> JSON 문자열
			System.out.println(mapper.writeValueAsString(user));
			
			// JSON 문자열 변환시 예쁜 포맷(Pretty Format)
			System.out.println(
					mapper.writerWithDefaultPrettyPrinter().writeValueAsString(user));
			
			// 예쁜 포멧(Pretty Format)으로 JSON 파일 저장
			mapper.writerWithDefaultPrettyPrinter().writeValue(new File("data/user2.json"), user);
			
		} catch (JsonGenerationException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	} // end javaToJson()
	
	// JSON --> Java 객체로 변환
	public static void jsonToJava() {
		ObjectMapper mapper = new ObjectMapper();
		
		// JSON 파일 --> Java 객체
		try {
			User user1 = mapper.readValue(new File("data/user.json"), User.class);
			System.out.println(user1);
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	} // end jsonToJava()
	
} // end class

 

** User 클래스

package com.lec.java.crawl13;

import java.util.List;

public class User {
	private String name;
	private int age;
	private List<String> messages;
	private Score score1;
	
	public String getName() {return name;}
	public void setName(String name) {this.name = name;}
	public int getAge() {return age;}
	public void setAge(int age) {this.age = age;}
	public List<String> getMessages() {return messages;}
	public void setMessages(List<String> messages) {this.messages = messages;}	
    
	public Score getScore1() {
		return score1;
	}
	public void setScore1(Score score1) {
		this.score1 = score1;
	}
    
	@Override
	public String toString() {
		return "[name:" + name + ",age:" + age + ",messages:" + messages +"]";
	}
}

class Score {
	private int kor;
	private int eng;
	private int math;
	
	public Score() {}	
	public Score(int kor, int eng, int math) {
		super();
		this.kor = kor;
		this.eng = eng;
		this.math = math;
	}
    
	public int getKor() {return kor;}
	public void setKor(int kor) {this.kor = kor;}
	public int getEng() {return eng;}
	public void setEng(int eng) {this.eng = eng;}
	public int getMath() {return math;}
	public void setMath(int math) {this.math = math;}
	
}

 

[추가] user.json, user2.json이 data 폴더에 생성됨

2) com.lec.java.crawl14 패키지, Crawl14Main 클래스

package com.lec.java.crawl14;

import java.io.IOException;
import java.net.URL;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;

/* 
 * XML, Json 파싱1
 * 
 * ■서울시 지하철호선별 역별 승하차 인원 정보 
 * http://data.seoul.go.kr/dataList/datasetView.do?infId=OA-12914&srvType=A&serviceKind=1&currentPageNo=1
 * 
 * 샘플 url
 * XML 버젼 
 * http://openapi.seoul.go.kr:8088/키값을넣으세요/xml/CardSubwayStatsNew/1/5/20181001
 * 예) http://openapi.seoul.go.kr:8088/704c4a6d7262696e33396a544e7551/xml/CardSubwayStatsNew/1/5/20181001
 *   
 * JSON 버젼 
 * http://openapi.seoul.go.kr:8088/키값을넣으세요/json/CardSubwayStatsNew/1/5/20181001
 * 예) http://openapi.seoul.go.kr:8088/704c4a6d7262696e33396a544e7551/json/CardSubwayStatsNew/1/5/20181001
 *  
 * */

public class Crawl14Main {

	public static void main(String[] args) throws IOException {
		System.out.println("jackson-databind 연습 : URL -> json -> Java");

		ObjectMapper mapper = new ObjectMapper();
		
		URL url = new URL("http://openapi.seoul.go.kr:8088/704c4a6d7262696e33396a544e7551/json/CardSubwayStatsNew/1/5/20181001");
		
		Subway subway = mapper.readValue(url, Subway.class);
		
		System.out.println(subway.getCardSubwayStatsNew().getList_total_count());
		
		for(SubRow e : subway.getCardSubwayStatsNew().getRow()) {
			System.out.printf("%5s : %8s역 [승차:%6d 하차:%6d]\n", 
					e.getLineNum(), 
					e.getStationName(), 
					e.getRidePassenger(), 
					e.getAlightPassenger());
		}
		
		
		System.out.println("\n프로그램 종료");
	} // end main()

} // end class

@JsonIgnoreProperties(ignoreUnknown = true)
class Subway{
	public Stats CardSubwayStatsNew; 

	public Stats getCardSubwayStatsNew() {return CardSubwayStatsNew;}
	public void setCardSubwayStatsNew(Stats cardSubwayStatsNew) {this.CardSubwayStatsNew = cardSubwayStatsNew;}
} // end Subway

@JsonIgnoreProperties(ignoreUnknown = true)
class Stats {
	
	private int list_total_count;
	
	private List<SubRow> row;

	public int getList_total_count() {return list_total_count;}
	public void setList_total_count(int list_total_count) {this.list_total_count = list_total_count;}
	
	public List<SubRow> getRow() {return row;}
	public void setRow(List<SubRow> row) {this.row = row;}
	
} // end Stats

// JSON 필드명과 매핑되는 Java 객체의 변수명을 달리 하고 싶다면
// @JsonProperty 사용 
@JsonIgnoreProperties(ignoreUnknown = true)
class SubRow {
	
	@JsonProperty("LINE_NUM")   // JSON 의 LINE_NUM --> lineNum 으로 매핑
	private String lineNum;
	
	@JsonProperty("SUB_STA_NM")
	private String stationName;
	
	@JsonProperty("RIDE_PASGR_NUM")
	private int ridePassenger;
	
	@JsonProperty("ALIGHT_PASGR_NUM")
	private int alightPassenger;
	
	public SubRow() {super();}
	public SubRow(String lineNum, String stationName, int ridePassenger, int alightPassenger) {
		super();
		this.lineNum = lineNum;
		this.stationName = stationName;
		this.ridePassenger = ridePassenger;
		this.alightPassenger = alightPassenger;
	}

	public String getLineNum() {return lineNum;}
	public void setLineNum(String lineNum) {this.lineNum = lineNum;}

	public String getStationName() {return stationName;}
	public void setStationName(String stationName) {this.stationName = stationName;}

	public int getRidePassenger() {return ridePassenger;}
	public void setRidePassenger(int ridePassenger) {this.ridePassenger = ridePassenger;}

	public int getAlightPassenger() {return alightPassenger;}
	public void setAlightPassenger(int alightPassenger) {this.alightPassenger = alightPassenger;}
	
} // end SubRow

 

3) com.lec.java.crawl15 패키지, Crawl15Main 클래스

package com.lec.java.crawl15;

import java.io.IOException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.ObjectMapper;

/*
 * XML, JSON 파싱 연습
 * ■서울시 지하철 역사 정보
 * http://data.seoul.go.kr/dataList/datasetView.do?infId=OA-12753&srvType=A&serviceKind=1&currentPageNo=1
 * 
 * 샘플url
 * 
 * XML 버젼
 * http://swopenAPI.seoul.go.kr/api/subway/704c4a6d7262696e33396a544e7551/xml/stationInfo/1/5/서울
 * 
 * JSON 버젼
 * http://swopenAPI.seoul.go.kr/api/subway/704c4a6d7262696e33396a544e7551/json/stationInfo/1/5/서울
 * 
 */

public class Crawl15Main {

	public static void main(String[] args) throws IOException {
		System.out.println("jackson-databind 연습2 : URL -> json -> Java");
		
		ObjectMapper mapper = new ObjectMapper();
		
		String needURL = "http://swopenapi.seoul.go.kr/api/subway/704c4a6d7262696e33396a544e7551/json/stationInfo/1/5/"
				+ URLEncoder.encode("서울", "utf-8");
		
		URL url = new URL(needURL);
		
		Subway subway = mapper.readValue(url, Subway.class);
		
		for(SubRow e : subway.getStationList()) {
			System.out.println(e.getStatnNm() + "역\t " + 
					e.getSubwayId() + "\t" + e.getSubwayNm());
		} // end for
		
	} // end main()

} // end class

@JsonIgnoreProperties(ignoreUnknown = true)
class Subway {
	
	private List<SubRow> stationList;

	public List<SubRow> getStationList() {return stationList;}
	public void setStationList(List<SubRow> stationList) {this.stationList = stationList;}
} // end Subway	
	

@JsonIgnoreProperties(ignoreUnknown = true)
class SubRow {
	private String statnNm;
	private String subwayId;
	private String subwayNm;
	
	public String getStatnNm() {return statnNm;}
	public void setStatnNm(String statnNm) {this.statnNm = statnNm;}
	
	public String getSubwayId() {return subwayId;}
	public void setSubwayId(String subwayId) {this.subwayId = subwayId;}
	
	public String getSubwayNm() {return subwayNm;}
	public void setSubwayNm(String subwayNm) {this.subwayNm = subwayNm;}
} // end SubRow

 

4) com.lec.java.crawl16 패캐지, Crawl16Main 클래스

** 내가 만든 코드

package com.lec.java.crawl16;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.ObjectMapper;

//https://www.yogiyo.co.kr/api/v1/restaurants-geo/?items=20&lat=37.4936151279937&lng=127.032670651995&order=rank&page=0&search=
public class Crawl16Main{

	public static void main(String[] args) throws IOException {
		System.out.println("요기요 맛집정보 : header 추가");
		
		String url = "https://www.yogiyo.co.kr/api/v1/restaurants-geo/?items=20&lat=37.4936151279937&lng=127.032670651995&order=rank&page=0&search=";
		
		
		StringBuffer sb = readFromUrl(url);
		//System.out.println(sb);
		
		ObjectMapper mapper = new ObjectMapper();
		
		Food food = mapper.readValue(sb.toString(), Food.class);
		
		
		for(FoodDetailList e : food.getRestaurants()) {
			System.out.println(e.getslug() + "  <평점> " + e.getReview_avg());
		}
		
		System.out.println("\n프로그램 종료");
	} // end main()
	
	public static StringBuffer readFromUrl(String urlAddress) {
		
		StringBuffer sb = new StringBuffer();	// response 받은 데이터 담을 객체
		
		URL url = null;			// java.net.URL
		HttpURLConnection conn = null;	// java.net.HttpURLConnectrion
		
		InputStream in = null;
		InputStreamReader reader = null;	// byte 스트림 --> 문자기반 Reader
		BufferedReader br = null;
		
		char[] buf = new char[512];		// 문자용 버퍼
		
		// BufferedReader <- InputStreamReader <- InputStream <- HttpURLConnection 
		
		try {
			url = new URL(urlAddress);
			conn = (HttpURLConnection)url.openConnection();  // Connection 객체 생성
			
			if(conn != null) {
				conn.setConnectTimeout(2000);	// 2초이내에 '연결'이 수립안되면
								// java.net.SocketTimeoutException 발생
				
				conn.setRequestMethod("GET");	// GET 방식	request
				// "GET", "POST", ...
				conn.setRequestProperty("Content-Type", 
					"application/x-www-form-urlencoded; charset=UTF-8");
				conn.setUseCaches(false);	// 캐시사용안함
				
				
				// 헤더 정보 추가==============================================
				conn.setRequestProperty("x-apikey", "iphoneap");
				conn.setRequestProperty("x-apisecret", "fe5183cc3dea12bd0ce299cf110a75a2");
				// =======================================================
				
				
				System.out.println("request 시작: " + urlAddress);
				conn.connect();	// request 발생 --> 이후 response 받을때까지 delay
				System.out.println("response 완료");
				
				// response 받은 후 가장 먼저 response code 값 확인
				int restponseCode = conn.getResponseCode();
				System.out.println("response code: " + restponseCode);
				// 참조 : https://developer.mozilla.org/ko/docs/Web/HTTP/Status
				if(restponseCode == HttpURLConnection.HTTP_OK) {
					
					in = conn.getInputStream();	// InputStream <- HttpURLConnection
					reader = new InputStreamReader(in,"utf-8");//InputStreamReader<-InputStream
					br = new BufferedReader(reader); // BufferedReader <- InputStreamReader
					
					int cnt;	// 읽은 글자 개수
					while((cnt = br.read(buf)) != -1) {
						sb.append(buf, 0, cnt);	// response 받은 텍스트를 StringBuffer에 추가
					}
					
				} else {
					System.out.println("response 실패");
					return null;
				}
				
			} else {
				System.out.println("conn null");
				return null;
			}
			
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				br.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			if(conn != null) {conn.disconnect();}	// 작업 끝나고 Connection 해제
		}
		
		return sb;
		
	} // end readFromUrl()

} // end class


@JsonIgnoreProperties(ignoreUnknown = true)
class Food {
	private List<FoodDetailList> restaurants;

	public List<FoodDetailList> getRestaurants() {return restaurants;}
	public void setRestaurants(List<FoodDetailList> restaurants) {this.restaurants = restaurants;}
	
}

@JsonIgnoreProperties(ignoreUnknown = true)
class FoodDetailList {
	
	private String slug;
	private int review_avg;
	
	public String getslug() {return slug;}
	public void setslug(String slug) {this.slug = slug;}
	
	public int getReview_avg() {return review_avg;}
	public void setReview_avg(int review_avg) {this.review_avg = review_avg;}
}

 

** 쌤이 만든 코드

package com.lec.java.crawl16;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;

// https://www.yogiyo.co.kr/api/v1/restaurants-geo/?items=20&lat=37.4936151279937&lng=127.032670651995&order=rank&page=0&search=
public class Crawl16Main {

	public static void main(String[] args) throws IOException{
		System.out.println("요기요 맛집정보 : header 추가");

		String url = "https://www.yogiyo.co.kr/api/v1/restaurants-geo/?items=20&lat=37.4936151279937&lng=127.032670651995&order=rank&page=0&search=";
		
		StringBuffer sb = readFromUrl(url);
		//System.out.println(sb);
		
		ObjectMapper mapper = new ObjectMapper();
		
		// 맛집 이름 / 평점
		System.out.println(mapper.readValue(sb.toString(), Yogiyo.class));
		
		
		System.out.println("\n프로그램 종료");
	} // end main()

	public static StringBuffer readFromUrl(String urlAddress) {
		
		StringBuffer sb = new StringBuffer();	// response 받은 데이터 담을 객체
		
		URL url = null;			// java.net.URL
		HttpURLConnection conn = null;	// java.net.HttpURLConnection
		
		InputStream in = null;
		InputStreamReader reader = null;	// byte 스트림 --> 문자기반 Reader
		BufferedReader br = null; 
		
		char [] buf = new char[512];   // 문자용 버퍼
		
		// BufferedReader <- InputStreamReader <- InputStream <- HttpURLConnection 
		
		try {
			url = new URL(urlAddress);
			conn = (HttpURLConnection)url.openConnection();	// Connection 객체 생성
			
			if(conn != null) {
				conn.setConnectTimeout(2000);	// 2초이내에 '연결' 이 수립안되면
								// java.net.SocketTimeoutException 발생
				
				conn.setRequestMethod("GET");	// GET 방식 request
				// "GET", "POST" ...
				conn.setRequestProperty("Content-Type", 
					"application/x-www-form-urlencoded; charset=UTF-8");
				conn.setUseCaches(false);	// 캐시사용안함
				
				
				// 헤더 정보 추가
				conn.setRequestProperty("X-ApiKey", "iphoneap");
				conn.setRequestProperty("X-ApiSecret", "fe5183cc3dea12bd0ce299cf110a75a2");
				
				
				System.out.println("request 시작: " + urlAddress);
				conn.connect();    // request 발생 --> 이후 response 받을때까지 delay
				System.out.println("response 완료");
				
				// response 받은후 가장 먼저 response code 값 확인
				int responseCode = conn.getResponseCode();
				System.out.println("response code : " + responseCode);
				// 참조 : https://developer.mozilla.org/ko/docs/Web/HTTP/Status
				if(responseCode == HttpURLConnection.HTTP_OK) {
					
					in = conn.getInputStream();	// InputStream <- HttpURLConnection 
					reader = new InputStreamReader(in,"utf-8");//InputStreamReader<-InputStream
					br = new BufferedReader(reader); // BufferedReader <- InputStreamReader
					
					int cnt;  // 읽은 글자 개수
					while((cnt = br.read(buf)) != -1) {
						sb.append(buf, 0, cnt); // response 받은 텍스트를 StringBuffer에 추가
					}
					
				} else {
					System.out.println("response 실패");
					return null;
				}
			} else {
				System.out.println("conn null");
				return null;
			}
			
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				br.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			if(conn != null) conn.disconnect();   // 작업 끝나고 Connection 해제
		}
		return sb;
	}
    
} // end class


@JsonIgnoreProperties(ignoreUnknown = true)
class Yogiyo {
	private List<Restaurant> restaurants;

	public List<Restaurant> getRestaurants() {return restaurants;}
	public void setRestaurants(List<Restaurant> restaurants) {this.restaurants = restaurants;}
	
	@Override
	public String toString() {
		StringBuffer sb = new StringBuffer("");
		for(Restaurant e : restaurants) {
			sb.append(e.toString() + "\n");
		}
		return sb.toString();
	}
}

@JsonIgnoreProperties(ignoreUnknown = true)
class Restaurant {
	private String name;
	
	@JsonProperty("review_avg")
	private double reviewAvg;

	public String getName() {return name;}
	public void setName(String name) {this.name = name;}
	public double getReviewAvg() {return reviewAvg;}
	public void setReviewAvg(double reviewAvg) {this.reviewAvg = reviewAvg;}
	@Override
	public String toString() {
		return String.format("%s %.1f", name, reviewAvg);
	}
}

 

[헤더 정보 보기] F12 개발자 모드 > Network > x-apikey와 x-apisecret 확인

[추가] 처음에는 제대로 연결되지 않음 

** 헤더 정보를 추가해줘야 연결이 가능

** readFromUrl()에 헤더 추가

** 정상적으로 응답 완..!!

 

5) com.lec.java.crawl17 패키지, Crawl17Main 클래스

package com.lec.java.crawl17;

import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

/*
 * Selenium 라이브러리 다운로드 (Java 버젼으로!)
 * 	https://www.seleniumhq.org/download/
 * 
 *  BuildPath 추가
 *  
 * 브라우저 드라이버 다운로드 
 *  http://chromedriver.chromium.org/downloads
 *  
 */

public class Crawl17Main {
	
	// WebDriver
	private WebDriver driver;
	private WebElement element;
	private String url;
	
	private static final String WEB_DRIVER_ID = "webdriver.chrome.driver";
	private static final String WEB_DRIBER_PATH = "D:/JavaApp1/download/chromedriver.exe";
	
	
	public static void main(String[] args) {
		System.out.println("Selenium 사용");
		
		Crawl17Main app = new Crawl17Main();
		app.init();
		//app.naverLogin();
		//app.faceBookLogin();
		app.naverRelated("파이썬");
		
		System.out.println("\n프로그램 종료");
	} // end main()
	
	
	public void init() {
		System.setProperty(WEB_DRIVER_ID, WEB_DRIBER_PATH);
		
		// Driver setup
		ChromeOptions options = new ChromeOptions();
		
		options.setCapability("ignoreProtectedModeSettings", true);
		driver = new ChromeDriver(options);	// 제어되는 브라우저 가동!
		// driver 를 통해서 브라우저 제어
	} // end init()

	public void naverLogin() {
		String url = "https://nid.naver.com/nidlogin.login";
		driver.get(url);	// url 주소로 이동
		
		// 아이디 입력
		element = driver.findElement(By.id("id"));
		//System.out.println(element.getSize());
		element.sendKeys("진짜로 아이디랑 비번");	// 키보드 타이핑 입력
		
		// 패스워드 입력
		element = driver.findElement(By.id("pw"));
		element.sendKeys("입력된다...!! 우앙");
		
		// 로그인 버튼 클릭
		element = driver.findElement(By.className("btn_global"));
		element.click();
	} // end naverLogin()
	
	// Facebook 로그인
	public void faceBookLogin() {
		String url = "https://facebook.com";
		driver.get(url);
		
		// 아이디 입력
		driver.findElement(By.id("email")).sendKeys("헤헿 페북아이디 입력~");
		driver.findElement(By.id("pass")).sendKeys("흐헤헤헤헤~");
		driver.findElement(By.id("pass")).sendKeys(Keys.ENTER);
		
		try {
			Thread.sleep(4000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
	} // end faceBookLogin()
	
	public void naverRelated(String keyword) {
		driver.get("https://www.naver.com");
		driver.findElement(By.id("query")).sendKeys(keyword);	
		driver.findElement(By.id("query")).sendKeys(Keys.ENTER);
		
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		List<WebElement> list = driver.findElements(By.cssSelector(".lst_relate ul li"));
		System.out.println(list.size() + "개");
		
		for(WebElement e : list) {
			System.out.println(
			e.findElement(By.tagName("a")).getText().trim());
			
		}
		
	} // end naverRelated()
	
} // end class

 

[추가] init() 메서드 : driver를 통해서 제어되는 브라우저 가동..!!

[추가] naverLogin 메서드 실행 : 네이버 로그인 후 클릭까지

[추가] naverRelated 메서드 실행 : 파이썬 검색 후 연관검색어 크롤링

 

 

2. 네이버 영화 인기 검색어 크롤링

package com.lec.java.crawl01;

import java.io.IOException;

import org.jsoup.Connection.Response;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class NaverMovie {

	public static void main(String[] args) throws IOException {
		System.out.println("네이버 영화 인기 검색어");

		String url;
		Response response;
		Elements elements;
		Document doc; // DOM

		url = "https://movie.naver.com/movie/sdb/rank/rmovie.nhn";

		doc = Jsoup.connect(url).execute().parse();
		
		elements = doc.select("#assistant > div:nth-child(1) > ul.r_ranking > li > a:first-child");		
		//System.out.println(elements.size());
		
		for(Element e : elements) {
			// 1위, 2위... 텍스트 <span> 없애려면 해당 element 삭제 (remove())
			e.selectFirst("span.blind").remove(); 
			System.out.println(e.text().trim());
		} 
        
		System.out.println("\n프로그램 종료");
	} // end main()

} // end class

'웹_프론트_백엔드 > JAVA프레임윅기반_풀스택' 카테고리의 다른 글

2020.04.07  (0) 2020.04.07
2020.04.06  (0) 2020.04.06
2020.04.02  (0) 2020.04.02
2020.04.01  (0) 2020.04.01
2020.03.31  (0) 2020.03.31