열심히 끝까지
디바이스 융합 자바(Java) day24 - 웹크롤링+E-martmall과자코너크롤링 본문
디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)
디바이스 융합 자바(Java) day24 - 웹크롤링+E-martmall과자코너크롤링
노유림 2022. 7. 14. 19:15어제 막혀서 못 올린 예제까지 시작!
[7/13]
VO=========================
package class05;
public class VO {
private int eid;
private String name;
private int price;
private int num;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getEid() {
return eid;
}
public void setEid(int eid) {
this.eid = eid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return "VO [eid=" + eid + ", name=" + name + ", price=" + price + ", num=" + num + "]";
}
}
DAO================================
package class05;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class DAO {
Connection conn;
PreparedStatement pstmt;
final String sql_insert="INSERT INTO EMART VALUES((SELECT NVL(MAX(EID),0)+1 FROM EMART),?,?,?)";
final String sql_selectAll="SELECT * FROM EMART";
final String sql_selectOne="SELECT * FROM EMART WHERE EID=?";
final String sql_delete="";
public boolean insert(VO vo) {
conn=JDBCUtil.connect();
try {
pstmt=conn.prepareStatement(sql_insert);
pstmt.setString(1, vo.getName());
pstmt.setInt(2, vo.getPrice());
pstmt.setInt(3, vo.getNum());
pstmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}finally {
JDBCUtil.disconnect(pstmt, conn);
}
return true;
}
// selectAll(VO)
public ArrayList<VO> selectAll(VO vo){
ArrayList<VO> datas = new ArrayList<VO>();
conn=JDBCUtil.connect();
try {
pstmt=conn.prepareStatement(sql_selectAll);
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
VO data = new VO();
data.setEid(rs.getInt("eid"));
data.setName(rs.getString("name"));
data.setPrice(rs.getInt("price"));
datas.add(data);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCUtil.disconnect(pstmt, conn);
}
return datas;
}
}
Crawling============================================
[고생의 흔적]
1
package class05;
import java.io.IOException;
import java.util.Iterator;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Test01 {
public static void main(String[] args) {
// 크롤러
// Jsoup 사용 <- 기본 제공되는 친구가 아니다..
// 타켓 URL와 연결 -> conn 확보 (DBMS 처럼 connection 확보)
Document doc = null; // scope 이슈
final String url = "https://comic.naver.com/index";
Jsoup.connect(url); // 크롤러 사용 = import 불가
try {
doc = Jsoup.connect(url).get();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// System.out.println(doc); // 시간에 따라 다르게 생긴 html이 탄생할 수 있다.
// Jsoup으로 HTML 전체 문서를 받아옴
Elements eles = doc.select("ul > li > div > h6 > a > span"); // output = Elements(요소들)
// 하나 있을 수도 있고 여러 개 있을 수 있다.
// System.out.println(eles);
DAO dao = new DAO();
Iterator<Element> itr=eles.iterator(); // 제네릭 넣어주면 .text() 사용 가능
while(itr.hasNext()) {
// str = str.substring(6);
// System.out.println(itr.next()); // 요소 자체 출력
String str = itr.next().text(); // text() 태그를 쓰면 자동으로 떼어준다.
System.out.println(str);
VO vo= new VO();
// vo.setTitle(str);
// dao.insert(vo);
}
System.out.println("로그 : DB에 저장완료!");
// for(int i=0; i < vo.size(); i++) {
//
// }
}
}
2
package class05;
import java.io.IOException;
import java.util.Iterator;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Test02 {
public static void main(String[] args) {
final String url = "https://emart.ssg.com/best/main.ssg?Egnb=best#ajaxmore";
Document doc = null;
try {
doc = Jsoup.connect(url).get(); // document 받아오기
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
DAO dao = new DAO();
// String idstr = "ul#genreRecommand";
// String classStr="div.genreRecomInfo2";
//Elements eles=doc.select(classStr);
// Elements eles=doc.select("ul > li > div > h6 > a > span");
// System.out.println(eles);
// Elements eles=doc.select("ul > li > div > div > div > a > em");
// System.out.println(eles);
// String idstr = "ul#best_10";
// String classStr="div.title";
// String classStr="em.tx_ko";
String classStr="div.title > a > em.tx_ko";
// String price="div.opt_price";
String price="div.cunit_price > div.opt_price > em.ssg_price";
// String preview="div.cunit_app > div.rating > span.rate_tx > em";
Elements eles1 = doc.select(classStr);
Elements eles2 = doc.select(price);
// Elements eles3 = doc.select(preview);)
Iterator<Element> itr1 = eles1.iterator();
Iterator<Element> itr2 = eles2.iterator();
// Iterator<Element> itr3 = eles3.iterator();
while(itr1.hasNext()) {
String name = itr1.next().text();
System.out.print(name + "\t");
// String proPrice = itr2.next().text();
// System.out.println(proPrice);
// String use = itr3.next().text();
// System.out.println(use);
VO vo = new VO();
vo.setName(name);
// vo.setPrice(proPrice);
dao.insert(vo);
}
System.out.println("로그 : DB에 저장 완료!");
for(VO v:dao.selectAll(null)) {
System.out.println(v);
}
}
}
3
package class05;
import java.io.IOException;
import java.util.Iterator;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Test3 {
public static void main(String[] args) {
final String url = "https://emart.ssg.com/best/main.ssg?Egnb=best#ajaxmore";
Document doc = null;
try {
doc = Jsoup.connect(url).get(); // document 받아오기
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
DAO dao = new DAO();
String classStr= "div.title > a > em.tx_ko";
String price="div.cunit_price > div.opt_price > em.ssg_price";
String preview="div.cunit_app > div.rating > span.rate_tx";
Elements eles1 = doc.select(classStr);
Elements eles2 = doc.select(price);
Elements eles3 = doc.select(preview);
Iterator<Element> itr1 = eles1.iterator();
Iterator<Element> itr2 = eles2.iterator();
Iterator<Element> itr3 = eles3.iterator();
while(itr1.hasNext()) {
String name = itr1.next().text();
System.out.print(name + "\t");
String proPrice = itr2.next().text();
// System.out.println(proPrice);
String use = itr3.next().text();
// System.out.println(use);
VO vo = new VO();
vo.setName(name);
vo.setPrice(Integer.parseInt(proPrice.replaceAll("[^0-9]","")));
dao.insert(vo);
}
System.out.println("로그 : DB에 저장 완료!");
for(VO v:dao.selectAll(null)) {
System.out.println(v);
}
}
}
[7/14] 최종정리==============================
EMART 과자코너 정리하기
EmartVO=======================
package model;
public class EmartVO {
private int eid;
private String name;
private int price;
private float score;
private int num;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getEid() {
return eid;
}
public void setEid(int eid) {
this.eid = eid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public float getScore() {
return score;
}
public void setScore(float score) {
this.score = score;
}
@Override
public String toString() {
return eid + " 상품 이름 :" + name + ", 가격 : " + price + ", 별점 : " + score + ", 리뷰개수 : " + num;
}
}
EmartDAO=======================
package model;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class EmartDAO {
Connection conn;
PreparedStatement pstmt;
final String sql_insert="INSERT INTO EMART VALUES((SELECT NVL(MAX(EID),0)+1 FROM EMART),?,?,?,?)";
final String sql_selectAll ="SELECT * FROM EMART WHERE NAME LIKE '%'||?||'%' ORDER BY EID ASC";
final String sql_selectOne="SELECT * FROM EMART WHERE EID=?";
final String sql_delete="DELETE FROM EMART WHERE EID=?";
final String sql_update="UPDATE EMART SET PRICE=? WHERE EID=?";
final String sql_sample="SELECT COUNT(*) AS CNT FROM EMART";
// 데이터 추가
public boolean insert(EmartVO vo) {
conn=JDBCUtil.connect(); // JDBC 연결
try {
pstmt=conn.prepareStatement(sql_insert);
pstmt.setString(1, vo.getName()); // 이름
pstmt.setInt(2, vo.getPrice()); // 가격
pstmt.setFloat(3, vo.getScore()); // 평점
pstmt.setInt(4, vo.getNum()); // 리뷰개수
pstmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false; // 값을 못 넣은 것 > 실패로 판단
}finally {
JDBCUtil.disconnect(pstmt, conn); // JDBC 연결 해제
}
System.out.println("\t로그 : 상품 추가를 완료하였습니다.");
return true;
}
// selectAll(VO) 전체 선택
public ArrayList<EmartVO> selectAll(EmartVO vo){
ArrayList<EmartVO> datas = new ArrayList<EmartVO>();
conn=JDBCUtil.connect();
try {
pstmt=conn.prepareStatement(sql_selectAll);
pstmt.setString(1, vo.getName());
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
EmartVO data = new EmartVO();
data.setEid(rs.getInt("EID"));
data.setName(rs.getString("NAME"));
data.setPrice(rs.getInt("PRICE"));
data.setScore(rs.getFloat("SCORE"));
data.setNum(rs.getInt("CNT"));
datas.add(data);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCUtil.disconnect(pstmt, conn);
}
return datas;
}
// 상품 하나만 보이기
public EmartVO selectOne(EmartVO vo){
conn=JDBCUtil.connect();
ResultSet rs = null; // scope 공부
try {
pstmt = conn.prepareStatement(sql_selectOne);
pstmt.setInt(1, vo.getEid());
rs = pstmt.executeQuery();
if(rs.next()) {
vo.setName(rs.getString("NAME"));
vo.setPrice(rs.getInt("PRICE"));
vo.setScore(rs.getFloat("SCORE"));
vo.setNum(rs.getInt("CNT"));
// 이놈때문에 고생했습니다... "NUM"으로 되어 있을 줄은..
// 웃긴건 위에껀 잘 설정해줬다는겁니다;
}
else {
return null;
}
}catch(SQLException e) {
e.printStackTrace();
return null;
}finally {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JDBCUtil.disconnect(pstmt, conn);
}
return vo;
}
// 삭제 로직
public boolean productDelete(EmartVO vo){
conn=JDBCUtil.connect();
try {
pstmt = conn.prepareStatement(sql_delete);
pstmt.setInt(1, vo.getEid());
int res = pstmt.executeUpdate();
if(res == 0) {
return false;
}
}catch(SQLException e) {
e.printStackTrace();
return false;
}finally {
JDBCUtil.disconnect(pstmt, conn);
}
return true;
}
// 업데이트 로직
public boolean productUpdate(EmartVO vo){
conn=JDBCUtil.connect();
try {
pstmt = conn.prepareStatement(sql_update);
pstmt.setInt(2, vo.getEid()); // 값 가져오기 eid
pstmt.setInt(1, vo.getPrice()); // 값 설정 price
int res = pstmt.executeUpdate();
if(res == 0) {
return false;
}
}catch(SQLException e) {
e.printStackTrace();
return false;
}finally {
JDBCUtil.disconnect(pstmt, conn);
}
return true;
}
// hasSample 로직
public boolean hasSample(EmartVO vo) {
conn = JDBCUtil.connect();
try {
pstmt=conn.prepareStatement(sql_sample);
ResultSet rs = pstmt.executeQuery();
rs.next();
int cnt = rs.getInt("CNT");
if(cnt>=5) {
return true;
}
return false;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
finally {
JDBCUtil.disconnect(pstmt, conn);
}
}
}
EmartView=======================
package view;
import java.util.ArrayList;
import java.util.Scanner;
import model.EmartDAO;
import model.EmartVO;
public class EmartView {
Scanner sc = new Scanner(System.in);
EmartVO eVO = new EmartVO();
EmartDAO eDAO = new EmartDAO();
public int action;
// 메인메뉴 로직=====================================
public void mainmenu() {
while(true) {
System.out.println();
System.out.println("===이마트 과자코너===");
System.out.println(" 1. 상품 목록");
System.out.println(" 2. 상품 검색");
System.out.println(" 3. 상품 구매 < 점검 예정");
System.out.println(" 4. 종료");
System.out.println(" [관리자버튼 = 5]");
System.out.println("==================");
System.out.print("번호 입력 : ");
try {
action = sc.nextInt();
if(action==3) {
System.out.println("현재 점검중입니다. 다른 서비스를 이용하세요.");
continue;
}
if(action > 0 && action < 6) {
break;
}
System.out.println();
System.out.println("잘못된 입력입니다. 다시 입력해주세요.");
continue;
}catch(Exception e) {
e.printStackTrace();
System.out.println();
System.out.println("잘못된 입력입니다. 다시 입력해주세요.");
continue;
}
}
}
// 관리자 로직=====================================
public void adminmenu() {
while(true) {
System.out.println();
System.out.println("===이마트 과자코너 관리자===");
System.out.println(" 1. 상품 삭제");
System.out.println(" 2. 상품 가격 변경");
System.out.println(" 3. 상품 전체 확인");
System.out.println(" 4. 종료");
System.out.println("=======================");
System.out.print("번호 입력 : ");
try {
action = sc.nextInt();
if(action > 0 && action < 5) {
break;
}
System.out.println();
System.out.println("잘못된 입력입니다. 다시 입력해주세요.");
continue;
}catch(Exception e) {
e.printStackTrace();
System.out.println();
System.out.println("잘못된 입력입니다. 다시 입력해주세요.");
}
}
}
// 상품목록 로직
public void proList() {
System.out.println();
System.out.println("=====상품목록=====");
EmartVO eVO = new EmartVO();
ArrayList<EmartVO> datas = eDAO.selectAll(eVO);
for (EmartVO data : datas) {
System.out.println(data);
}
}
public void stringPro(int i) {
EmartVO vo = new EmartVO();
vo.setEid(i);
EmartVO data = eDAO.selectOne(vo);
System.out.println();
System.out.println("검색결과");
System.out.println(data);
}
// 상품 검색 로직
public void proSearch() {
System.out.println();
System.out.println("=====상품 검색=====");
System.out.print("상품 번호 검색 >> ");
}
// 상품 구매 로직
public void buyProduct() {
System.out.println();
System.out.println("=====상품 구매=====");
}
// 상품 삭제 로직
public void deleteProduct() {
System.out.println();
System.out.println("=====상품 삭제=====");
System.out.print("삭제할 번호 입력 : ");
}
// 삭제 후 로직
public void deleteAfter(int i) {
EmartVO vo = new EmartVO();
vo.setEid(i);
if(eDAO.productDelete(vo)) {
System.out.println("성공!");
}
else {
System.out.println("실패...");
}
}
// 상품 가격 변경 로직
public void updateProduct() {
System.out.println();
System.out.println("=====상품 변경=====");
System.out.print("변경할 제품 번호 입력 : ");
}
public void endMessage() {
System.out.println();
System.out.println("프로그램을 종료합니다.");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 가격 변경 로직
public void changeNum() {
System.out.print("바꿀 가격 입력 : ");
}
// 잘못된 번호 입력 시 출력
public void wrong() {
System.out.println("잘못된 번호 입력..");
System.out.println("다시 입력하세요");
}
// 성공로직
public void victory() {
System.out.println("성공!");
}
// 실패 로직
public void fail() {
System.out.println("실패...");
}
// 정수 입력 로직
public int inputInt() {
sc.nextLine();
int i = sc.nextInt();
return i;
}
// 문자열 입력 로직
public String inputString() {
sc.nextLine();
String s = sc.nextLine();
return s;
}
}
EmartController=======================
package controller;
import model.EmartDAO;
import model.EmartVO;
import view.EmartView;
public class EmartController {
EmartDAO eDAO;
EmartView eView;
public EmartController() {
eDAO = new EmartDAO();
eView = new EmartView();
if(!eDAO.hasSample(null)) {
EmartTest.sample();
}
}
public void startApp() {
while(true) {
eView.mainmenu();
if(eView.action==1) { // 목록
eView.proList();
continue;
}
else if(eView.action==2) { // 검색
eView.proSearch();
int i = eView.inputInt();
eView.stringPro(i);
continue;
}
else if(eView.action==3) { // 구매 하지만 지금 업데이트 중
continue;
}
else if(eView.action==4) { // 종료
eView.endMessage();
break;
}
else {
appAdmin();
}
}
}
public void appAdmin() {
while(true) {
eView.adminmenu();
if(eView.action==1) { // 삭제
eView.deleteProduct();
int i = 0;
try {
i = eView.inputInt();
}catch(Exception e) {
eView.wrong();
continue;
}
eView.deleteAfter(i);
continue;
}
else if(eView.action==2) { // 가격 변경
eView.updateProduct();
int eid = eView.inputInt();
eView.changeNum();
int price = eView.inputInt();
EmartVO vo = new EmartVO();
vo.setEid(eid);
vo.setPrice(price);
if(eDAO.productUpdate(vo)) {
eView.victory();
}else {
eView.fail();
}
continue;
}
else if(eView.action==3) { // 전체 출력
eView.proList();
continue;
}
else if(eView.action==4) { // 종료
eView.endMessage();
break;
}
}
}
}
EmartTest - 크롤링=======================
package controller;
import java.io.IOException;
import java.util.Iterator;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import model.EmartDAO;
import model.EmartVO;
public class EmartTest {
public static void sample() {
// 주소 가져오기
final String url = "https://emart.ssg.com/category/listCategoryItem.ssg?dispCtgId=6000095859";
Document doc = null;
try {
doc = Jsoup.connect(url).get(); // document 받아오기
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
EmartDAO eDAO = new EmartDAO();
// 이름 가져오기
//ul#best1 > div.title > a > em.tx_ko 경로 베스트항목
//ul#food_item_list > li > div > div > div > a > em.tx_ko 경로 BEST항목
String classStr= "ul.cunit_thmb_lst > li > div > div > div > a > em.tx_ko";
// 가격 가져오기
//ul#best1 > div.cunit_price > div.opt_price > em.ssg_price
//ul#food_item_list > li > div > div > div > em.ssg_price
String price="ul.cunit_thmb_lst > li > div > div > div > em.ssg_price";
// 별점 가져오기
//ul#best1 > div.cunt_app > div.rating > div.rate_bg > span.blind
//ul#food_item_list > li > div > div > div > div > span > span.blind
String score="ul.cunit_thmb_lst > li > div > div > div > div > span > span.blind";
// 리뷰개수
//ul#best1 > div.cunit_app > div.rating > span.rate_tx
//ul#food_item_list > li > div > div.cunit_app > div.rating > span.rate_tx > em
String preview="ul.cunit_thmb_lst > li > div > div.cunit_app > div.rating > span.rate_tx > em";
Elements eles1 = doc.select(classStr); // 이름
Elements eles2 = doc.select(price); // 가격
Elements eles3 = doc.select(score); // 점수
Elements eles4 = doc.select(preview); // 리뷰
Iterator<Element> itr1 = eles1.iterator();
Iterator<Element> itr2 = eles2.iterator();
Iterator<Element> itr3 = eles3.iterator();
Iterator<Element> itr4 = eles4.iterator();
while(itr4.hasNext()) {
String name = itr1.next().text();
// System.out.print(name + "\t");
String proPrice = itr2.next().text();
// System.out.print(proPrice+ "\t");
String sScore = itr3.next().text();
// System.out.print(sScore+"\t");
String use = itr4.next().text();
// System.out.println(use);
EmartVO eVO = new EmartVO();
eVO.setName(name);
eVO.setPrice(Integer.parseInt(proPrice.replaceAll("[^0-9]",""))); // 숫자를 제외한 모든 걸 공백
eVO.setScore(Float.parseFloat(sScore.replaceAll("[^0-9, .]",""))); // 숫자,.을 제외한 모든 걸 공백
eVO.setNum(Integer.parseInt(use.replaceAll("[^0-9]",""))); // 숫자를 제외한 모든걸 공백
eDAO.insert(eVO); // 추가
}
System.out.println("로그 : DB에 저장 완료!");
for(EmartVO v:eDAO.selectAll(null)) {
System.out.println(v);
}
}
}
Client=======================
package controller;
public class Client {
public static void main(String[] args) {
EmartController app = new EmartController();
app.startApp();
}
}
SQL문=====================
CREATE TABLE EMART(
EID INT PRIMARY KEY, -- "번호",
NAME VARCHAR(200) NOT NULL, --상품 이름
PRICE INT NOT NULL, ----상품 가격
SCORE FLOAT, --상품 평점 // 존재하지 않을 수도 있기 때문에 공백도 혀용
CNT INT --리뷰 개수 // 존재하지 않을 수도 있기 때문에 공백도 혀용
);
SELECT EID AS 번호, NAME AS "상품 이름", PRICE AS 가격, SCORE AS "평점", CNT AS "리뷰 개수" FROM EMART;
DROP TABLE EMART;
'디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)' 카테고리의 다른 글
디바이스 융합 자바(Java) day27 - 리스트(list),표(table),폼(form) (0) | 2022.07.19 |
---|---|
디바이스 융합 자바(Java) day26 - 웹개발,tomcat(톰캣)설치 및 자바연동, 웹 기본기(title, body,글씨체,사이띄우기 등,...) (0) | 2022.07.18 |
디바이스 융합 자바(Java) day23 - 웹 크롤링 (0) | 2022.07.13 |
디바이스 융합 자바(Java) day22 - 외래키,깃허브,비즈니스메서드(핵심관심,횡단관심(공통로직)),JDBC이용한 홈페이지 제작 (0) | 2022.07.12 |
디바이스 융합 자바(Java) day21 - 학생부 with MVC, Oracle (0) | 2022.07.05 |