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¤tPageNo=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¤tPageNo=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 |