데이터베이스
데이터크롤링(스크래핑) - 해당 페이지의 데이터 추출하는 행위 ( 네트워크 이용 )
text(csv)
xml
JSON --> 이런 거로 처리
공식적으로 제공
공공기관 자료 ( data.go.kr )
구글 ( developers.google.com )
네이버 ( developers.naver.com ), 다음 ...
영화 정보 (www.kobis.or.kr) , https://www.kobis.or.kr/kobisopenapi/homepg/main/main.do <- 오픈API
비공식적 제공 : html 분석
인트라넷 : 사내망
192.168.XXX.XXX ( 아이피 번호 )
라우터(통신사 공유기) : 내부 ( 인트라넷 ) / 외부 ( 인터넷 )
인터넷 : 외부망
그외 ( 아이피 번호 )
IPv4 ---확장---> IPv6
(cmd에서 ipconfig/all) -> 이더넷 어댑터 이더넷
-> 물리적 주소 : 네트워크 카드 고유 아이디 ( 지문 ) : 전세계에서 중복될 수 없다.
port라는 개념을 통해 프로그램이 개방
외부에서 프로그램 접근시
1. 프로토콜(전송규약)
2. 아이피
3. port
를 알아야 접근 가능
Well Known Port (기본값들은 생략 가능)
프로토콜 : 포트
http : 80/8080
https : 443
mail : 25
mariadb : 3306
ipconfig // ipconfig/all : 아이피 확인 가능
ping ~~ : ~~ 서버 접근 가능 여부확인 ( 응답 없으면 방화벽 오픈되지 않은 것)
tracert ~~ : 내가 ~~까지 지나가는 경로값 추적 ( 출발지 ~ 목적지 사이 라우터 추적 )
(*) 는 막아놓은 것
netstat -an : 네트워크 상태 및 프로토콜 통계를 보여줌 ( 포트 개방 용도 파악 )
클라이언트(요청) <-----네트워크-----> 서버(응답) : C/S
(서버 하나에 여러 클라이언트 묶일 수 있다, 하나 죽으면 끝)
ex>
브라우저와 웹서버(톰캣) 관계
mysql 명령어와 mariadb 서비스 관계
P2P(peer to peer) : 클라이언트 , 서버 역할 동시에 함 -> 블록체인(p2p 통해 만들어짐)
(체인 형식으로 연결됨, 어느 하나가 죽어도 다른 연결 가능)
아이피와 이름을 알아내는 클래스
public class Network1 {
public static void main(String[] args) {
// IP 정보 <- 도메인, network는 java.net 패키지 사용
try {
InetAddress inetAddress1 = InetAddress.getByName("www.daum.net");
System.out.println(inetAddress1.getHostAddress()); --> 아이피 알아냄
System.out.println(inetAddress1.getHostName()); --> 이름 알아냄
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
naver 같이 아이피 여러개 있는 곳은 배열 사용한다.
InetAddress[] inetAddresses = InetAddress.getAllByName("www.naver.com");
for(InetAddress inetaddAddress : inetAddresses) {
System.out.println(inetaddAddress.getHostAddress());
https - 프로토콜
search.naver.com:437 - 도메인(아이피):포트
search.naver - 경로(파일명)
?sm=tab_hty.top&where=nexearch&query=%ED%95%9C%EC%86%8C%ED%9D%AC&oquery=%E3%85%87%E3%85%87&tqi=ivOOwlprvOsssvtQgMRssssst1w-458169 - 쿼리
쿼리는 키와 값으로 이뤄짐
import java.net.MalformedURLException;
import java.net.URL;
public class Network1 {
public static void main(String[] args) {
// IP 정보 <- 도메인, network는 java.net 패키지 사용
String strUrl = "https://search.naver.com/search.naver?
where=nexearch&query=%ED%95%9C%EC%86%8C%ED%9D%AC&
oquery=%E3%85%87%E3%85%87&tqi=ivOOwlprvOsssvtQgMRssssst1w-458169";
//url 클래스화 시키기
try {
URL url = new URL(strUrl);
System.out.println(url.getProtocol()); --> protocol 출력
System.out.println(url.getHost()); --> 도메인 출력
System.out.println(url.getPort()); --> port 출력
System.out.println(url.getPath()); --> 경로 출력
System.out.println(url.getQuery()); --> 쿼리 출력
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
url 클래스 --> 웹서버 접근 --> html 읽어옴
(접속은 url로 읽어오는 거는 IO stream으로)
기본
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
public class Network3 {
public static void main(String[] args) {
InputStream is = null;
try {
URL url = new URL("https://m.daum.net");
is = url.openStream();
int data = 0;
while((data = is.read()) != -1) {
System.out.print((char) data);
}
System.out.println();
} catch (MalformedURLException e) {
System.out.println("[에러] : " + e.getMessage());
} catch (IOException e) {
System.out.println("[에러] : " + e.getMessage());
} finally {
if(is != null) try { is.close(); } catch(IOException e) {}
}
}
}
daum의 html 정보 inputStream으로 읽어옴 / 깨지는 건 한글이니까 bufferedReader 사용
bufferedReader
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
public class Network5 {
public static void main(String[] args) {
BufferedReader br = null;
try {
URL url = new URL("https://m.daum.net");
br = new BufferedReader(new InputStreamReader(url.openStream()));
String line = "";
while((line = br.readLine()) != null) {
System.out.print(line);
}
System.out.println();
} catch (MalformedURLException e) {
System.out.println("[에러] : " + e.getMessage());
} catch (IOException e) {
System.out.println("[에러] : " + e.getMessage());
} finally {
if(br != null) try { br.close(); } catch(IOException e) {}
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
public class Network5 {
public static void main(String[] args) {
BufferedReader br = null;
try {
URL url = new URL("https://news.daum.net");
br = new BufferedReader(new InputStreamReader(url.openStream()));
String line = "";
boolean flag = false;
while((line = br.readLine()) != null) {
//equals
//contains, startsWith / endsWith
//indexOf --> 이런 것들로 사용 가능
//<ul class="list_newsissue">
//</ul>
//class="wrap_thumb" data-tiara-layer="article_main"
//</a>
if(line.contains("class=\"link_txt\" data-tiara-layer=\"article_main\"")) { //시작 부분
flag = true;
}
if(line.contains("</a>")) { // 끝 부분
flag = false;
}
if(flag) {
System.out.println(br.readLine().trim()); //한 줄 건너서 읽기.공백제거
}
}
System.out.println();
} catch (MalformedURLException e) {
System.out.println("[에러] : " + e.getMessage());
} catch (IOException e) {
System.out.println("[에러] : " + e.getMessage());
} finally {
if(br != null) try { br.close(); } catch(IOException e) {}
}
}
내가 가져오고 싶은 정보의 공통적인 데이터를 찾아서 뽑고 flag로 if문을 걸어서 정보 뽑기.
↓↓↓↓↓
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class Network5 {
public static void main(String[] args) {
BufferedReader br = null;
try {
URLConnection conn = new URL("https://news.daum.net").openConnection();
br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = null;
while((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (MalformedURLException e) {
System.out.println("[에러] : " + e.getMessage());
} catch (IOException e) {
System.out.println("[에러] : " + e.getMessage());
} finally {
if(br != null) try { br.close(); } catch(IOException e) {}
}
}
}
HttpURLConnection는 코드 상태값을 얻을 수 있다. (에러 코드를 잡아낼 수 있음)
HttpURLConnection conn = (HttpURLConnection)new URL("https://news.daum.net").openConnection();
int responseCode = conn.getResponseCode();
System.out.println(responseCode);
외 위 코드와 동일작용
url 잘못 입력시 나오는 코드값
조건문 사용하여 처리해줌
HttpURLConnection conn = (HttpURLConnection)new URL("https://news.daum.net").openConnection();
//int responseCode = conn.getResponseCode();
//System.out.println(responseCode);
if(conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
System.out.println(conn.getRequestMethod());
System.out.println(conn.getResponseMessage());
}
getRequestMethod = 요청방식 ( get / post 이런 방식들)
getResponseMessage(String) = 메세지 반환
getResponseCode(int) = 코드 반환
바이트 단위로 가져오기 위해 BufferedInput/OutputStream 사용
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class Network7 {
public static void main(String[] args) {
// bufferedInput/outputstream
BufferedInputStream bis = null; <-- 이미지 읽고
BufferedOutputStream bos = null; <-- 쓰기(저장)
try {
HttpURLConnection conn = (HttpURLConnection)new URL("https://t1.daumcdn.net/daumtop_chanel/op/20200723055344399.png").openConnection();
bis = new BufferedInputStream(conn.getInputStream());
bos = new BufferedOutputStream(new FileOutputStream("./daum.png"));
int data = 0;
while((data = bis.read()) != -1) {
bos.write(data);
}
System.out.println("다운로드 완료");
} catch (MalformedURLException e) {
System.out.println("[에러] : " + e.getMessage());
} catch (IOException e) {
System.out.println("[에러] : " + e.getMessage());
} finally {
if(bos != null) try { bos.close(); } catch(IOException e) {}
if(bis != null) try { bis.close(); } catch(IOException e) {}
}
}
}
textField2.setText( new File("").getAbsolutePath().replaceAll( "\\\\", "/" ) + "/" ); <-- 경로 설정
btn.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
HttpURLConnection conn =
(HttpURLConnection)new URL("https://search.pstatic.net/common/?src=http%3A%2F%2F
imgnews.naver.net%2Fimage%2F213%2F2022%2F05%2F03%2F0001215166_001_20220503151503059.
jpg&type=a340").openConnection(); <-- 이미지 연결
bis = new BufferedInputStream(conn.getInputStream()); <-- 읽어오기
//bos = new BufferedOutputStream(new FileOutputStream("./sohee.jpg"));
<-- 만든 후 주석처리하기
int data = 0;
while((data = bis.read()) != -1) {
//bos.write(data); <-- 만든 후 주석처리하기
lbl1.setIcon( new ImageIcon( "./sohee.jpg" ) ); <--라벨에 보이기
}
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} finally {
if(bos != null) try { bos.close(); } catch(IOException e1) {}
if(bis != null) try { bis.close(); } catch(IOException e1) {}
}
}
});
HTML 페이지를 웹브라우저가 사용하는 DOM(Document Object Model) 형식으로 변경
python의 beutifulsoup을 java버전으로 만든 것이 https://jsoup.org/ 사이트다.
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JSoup1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String html = "<html>"
+ "<head><title>First parse</title></head>"
+ "<body>"
+ "<p>Parsed HTML into a doc.</p>"
+ "<p>Parsed HTML into a doc.</p>"
+ "</body>"
+ "</html>";
Document doc = Jsoup.parse(html); // DOM 구조로 정렬
// //System.out.println(doc);
// System.out.println(doc.title()); // 타이틀 출력
// Elements titles = doc.getElementsByTag("title");
// System.out.println(titles); // html 기능 + 타이틀 출력2
// System.out.println(titles.text()); // 타이틀 출력2
Elements pTags = doc.getElementsByTag("p");
// System.out.println(pTags);
for(int i = 0; i < pTags.size(); i++) {
Element pTag = pTags.get(i);
System.out.println(pTag); // 기능 + 텍스트 출력
System.out.println(pTag.tagName()); // 기능이름만 출력
System.out.println(pTag.text()); // 텍스트만 출력
}
}
}
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JSoup2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String html = "<html>"
+ "<head><title>First parse</title></head>"
+ "<body>"
+ "<p id='i1' class = 'c1'>Parsed HTML into a doc 1.</p>"
+ "<p id='i2' class = 'c2'>Parsed HTML into a doc 2.</p>"
+ "<p id='i3' class = 'c1'>Parsed HTML into a doc 3.</p>"
+ "<p id='i4' class = 'c2'>Parsed HTML into a doc 4.</p>"
+ "</body>"
+ "</html>";
Document doc = Jsoup.parse(html); // DOM 구조로 정렬
//Id에 대한 정보 가져옴
Element pTag = doc.getElementById("i1");
System.out.println(pTag);
System.out.println();
// class에 대한 정보 가져옴
Elements pTags = doc.getElementsByClass("c1");
System.out.println(pTags);
}
}
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JSoup3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String html = "<html>"
+ "<head><title>First parse</title></head>"
+ "<body>"
+ "<a href = 'https://www.daum.net'>"
+ "<img class ='c1' src ='./daum.jpg'>"
+ "<div id = 'i1'>다음바로가기</div>"
+ "</a>"
+ "<a href = 'https://www.naver.com'>"
+ "<img class ='c1' src ='./naver.jpg'>"
+ "<div id = 'i2'>네이버바로가기</div>"
+ "</a>"
+ "<a href = 'https://www.google.co.kr'>"
+ "<img class ='c1's src ='./google.jpg'>"
+ "<div id = 'i3'>구글바로가기</div>"
+ "</a>"
+ "</body>"
+ "</html>";
Document doc = Jsoup.parse(html); // DOM 구조로 정렬
Elements divTags = doc.select("#i1"); // (select) 설정한 아이디 값 읽기
System.out.println(divTags.text());
Elements imgTags = doc.select("img.c1"); // class의 c1 값 가져오기
System.out.println((imgTags));
//속성 읽기
for(Element e : imgTags) { //c1이 여러개이므로 반복문
System.out.println(e.attr("src"));
}
//img에서 src가 ㄴjpg로 끝나는 값 가져오기
Elements imgTag2 = doc.select("img[src$=jpg]");
System.out.println(imgTag2);
}
}
보기 편하게 줄바꿈 적용한것
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.GridLayout;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;
import javax.swing.border.EtchedBorder;
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
public class NewsView1 extends JFrame {
private JPanel contentPane;
private JTextField textField1;
private JTextField textField2;
private JTextField textField3;
private JTextField textField4;
private JTextField textField5;
private JTextField textField6;
private JTextField textField7;
private JTextField textField8;
private JTextField textField9;
private JTextField textField10;
private JButton mainbtn;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
NewsView1 frame = new NewsView1();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public NewsView1() {
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 800, 600);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
mainbtn = new JButton("실시간 뉴스보기");
mainbtn.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
BufferedReader br = null;
try {
URL url = new URL("https://news.daum.net");
br = new BufferedReader(new InputStreamReader(url.openStream()));
String line = "";
boolean flag = false;
while((line = br.readLine()) != null) {
if(line.contains("class=\"link_txt\" data-tiara-layer=\"article_main\"")) {
flag = true;
}
if(line.contains("</a>")) {
flag = false;
}
String[] strArr = new String[11];
if(flag) {
if(line.contains("data-tiara-type=\"harmony\" data-tiara-ordnum=\"" + 1 + "\"")) {
strArr[1] = br.readLine().trim();
textField1.setText(strArr[1]);
}
else if(line.contains("data-tiara-type=\"harmony\" data-tiara-ordnum=\"" + 2 + "\"")) {
strArr[2] = br.readLine().trim();
textField2.setText(strArr[2]);
}
else if(line.contains("data-tiara-type=\"harmony\" data-tiara-ordnum=\"" + 3 + "\"")) {
strArr[3] = br.readLine().trim();
textField3.setText(strArr[3]);
}
else if(line.contains("data-tiara-type=\"harmony\" data-tiara-ordnum=\"" + 4 + "\"")) {
strArr[4] = br.readLine().trim();
textField4.setText(strArr[4]);
}
else if(line.contains("data-tiara-type=\"harmony\" data-tiara-ordnum=\"" + 5 + "\"")) {
strArr[5] = br.readLine().trim();
textField5.setText(strArr[5]);
}
else if(line.contains("data-tiara-type=\"harmony\" data-tiara-ordnum=\"" + 6 + "\"")) {
strArr[6] = br.readLine().trim();
textField6.setText(strArr[6]);
}
else if(line.contains("data-tiara-type=\"harmony\" data-tiara-ordnum=\"" + 7 + "\"")) {
strArr[7] = br.readLine().trim();
textField7.setText(strArr[7]);
}
else if(line.contains("data-tiara-type=\"harmony\" data-tiara-ordnum=\"" + 8 + "\"")) {
strArr[8] = br.readLine().trim();
textField8.setText(strArr[8]);
}
else if(line.contains("data-tiara-type=\"harmony\" data-tiara-ordnum=\"" + 9 + "\"")) {
strArr[9] = br.readLine().trim();
textField9.setText(strArr[9]);
}
else if(line.contains("data-tiara-type=\"harmony\" data-tiara-ordnum=\"" + 10 + "\"")) {
strArr[10] = br.readLine().trim();
textField10.setText(strArr[10]);
}
}
}
} catch (MalformedURLException e1) {
System.out.println("[에러] : " + e1.getMessage());
} catch (IOException e1) {
System.out.println("[에러] : " + e1.getMessage());
} finally {
if(br != null) try { br.close(); } catch(IOException e1) {}
}
}
});
mainbtn.setBounds(12, 10, 760, 23);
contentPane.add(mainbtn);
JPanel panel = new JPanel();
panel.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.LOWERED, new Color(255, 255, 255), new Color(160, 160, 160)), "\uB274\uC2A4 \uBCF4\uAE30", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
panel.setBounds(12, 78, 761, 375);
contentPane.add(panel);
panel.setLayout(null);
textField1 = new JTextField();
textField1.setText("뉴스 내용");
textField1.setBounds(6, 18, 564, 21);
panel.add(textField1);
textField1.setColumns(10);
JButton btn1 = new JButton("바로가기");
btn1.setBounds(582, 17, 173, 23);
panel.add(btn1);
textField2 = new JTextField();
textField2.setText("뉴스 내용");
textField2.setBounds(6, 53, 564, 21);
panel.add(textField2);
textField2.setColumns(10);
JButton btn2 = new JButton("바로가기");
btn2.setBounds(582, 52, 173, 23);
panel.add(btn2);
textField3 = new JTextField();
textField3.setText("뉴스 내용");
textField3.setBounds(6, 88, 564, 21);
panel.add(textField3);
textField3.setColumns(10);
JButton btn3 = new JButton("바로가기");
btn3.setBounds(582, 87, 173, 23);
panel.add(btn3);
textField4 = new JTextField();
textField4.setText("뉴스 내용");
textField4.setBounds(6, 123, 564, 21);
panel.add(textField4);
textField4.setColumns(10);
JButton btn4 = new JButton("바로가기");
btn4.setBounds(582, 122, 173, 23);
panel.add(btn4);
textField5 = new JTextField();
textField5.setText("뉴스 내용");
textField5.setBounds(6, 158, 564, 21);
panel.add(textField5);
textField5.setColumns(10);
JButton btn5 = new JButton("바로가기");
btn5.setBounds(582, 157, 173, 23);
panel.add(btn5);
textField6 = new JTextField();
textField6.setText("뉴스 내용");
textField6.setBounds(6, 193, 564, 21);
panel.add(textField6);
textField6.setColumns(10);
JButton btn6 = new JButton("바로가기");
btn6.setBounds(582, 192, 173, 23);
panel.add(btn6);
textField7 = new JTextField();
textField7.setText("뉴스 내용");
textField7.setBounds(6, 228, 564, 21);
panel.add(textField7);
textField7.setColumns(10);
JButton btn7 = new JButton("바로가기");
btn7.setBounds(582, 227, 173, 23);
panel.add(btn7);
textField8 = new JTextField();
textField8.setText("뉴스 내용");
textField8.setBounds(6, 263, 564, 21);
panel.add(textField8);
textField8.setColumns(10);
JButton btn8 = new JButton("바로가기");
btn8.setBounds(582, 262, 173, 23);
panel.add(btn8);
textField9 = new JTextField();
textField9.setText("뉴스 내용");
textField9.setBounds(6, 298, 564, 21);
panel.add(textField9);
textField9.setColumns(10);
textField10 = new JTextField();
textField10.setText("뉴스 내용");
textField10.setBounds(6, 333, 564, 21);
panel.add(textField10);
textField10.setColumns(10);
JButton btn9 = new JButton("바로가기");
btn9.setBounds(582, 297, 173, 23);
panel.add(btn9);
JButton btn10 = new JButton("바로가기");
btn10.setBounds(582, 332, 173, 23);
panel.add(btn10);
}
public class MouseAdapterModel extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
}
}