Notice
Recent Posts
Recent Comments
Link
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

ALLYES

[2022년 청년친화형 기업 ESG지원 사업 - 27] 본문

ESG

[2022년 청년친화형 기업 ESG지원 사업 - 27]

Allyes_99 2022. 10. 11. 17:38

일시 : 2022.10.11

시간 : 9:00 ~18:00


오전 : Servlet

오후 : Crawling


 

오전 [Servlet]

  1. Web Server Programming을 사용하는 이유
    • (요청에 따른)동적인 페이지를 생성하기 위해서
  2. JSP/Servlet를 배우는 이유
    • 자원관리의 효율성
      • 1개의 Process에서 다량의 Thread를 생성시켜 처리하여 과부하가 작음
    • 진입장벽이 높음
      • 선수과목으로 Java를 충분히 이해해야함
    • 취업하기 좋음

 

  • Servlet
    • Server + Applet의 합성어
    • Applet : Java 프로그램이 웹 서버에서 자동으로 설치되어 동작하는 프로그램
    • Servlet' : Server 상에서 작동하는 프로그램
    • Java를 기반으로 하는 Web Application Programming 기술
    • Client 요청에 동적으로 작동하고 응답은 HTML을 이용
    • Servlet은 HttpServlet 클래스를 상속받음
  • 웹 서버 프로그램의 구조

 

  • Java - main()
  • Servlet - service()
package com;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Ex01
 */
@WebServlet("/Ex01")
public class Ex01 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
		// 요청하는 Client의 IP주소 확인
		String ip = request.getRemoteAddr();
		System.out.println("접속한 사람 ip : " + ip);

		
		// response.setCharacterEncoding()
		// html문서를 응답할때 문자 인코딩을 설정하는 메소드
		response.setCharacterEncoding("EUC-KR");
		
		// PrintWriter : Servlet가 HTML문서를 응답할때
		// HTMl문서 안에다가 태그 및 글자를 작성할 수 있는 객체
		PrintWriter out = response.getWriter();
		
		out.print("<html>");
		out.print("<body>");
		
		out.print("<h1>배고픈자의 홈페이지</h1>");

		if(ip.equals("59.0.129.84")) {
			out.print("<h1>강사님 어서오세요</h1>");
		}
		else if(ip.equals("218.157.38.14")) {
			out.print("<h1>아가 어서오고</h1>");
			}
		else if(ip.equals("121.147.52.193")) {
			out.print("<h2>그르게 점심 뭐먹지</h2>");
		}
		else if(ip.equals("222.102.104.14")) {
			out.print("<h2>쩡현!</h2>");
		}
		out.print("<img src = '1.jpg'>");
		out.print("<h2> 밥줘 </h2>");
		
		
		out.print("</body>");
		out.print("</html>");
		
	}

}

 

  • URL Mapping 수정 방법
  • 1. 코드 상에 @WebServlet("??") 에서 수정
package com;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Ex02URLMapping
 */
@WebServlet("/Ex02")
// 서블릿에 해당되는 url을 mapping 시켜둠
public class Ex02URLMapping extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// URL Mapping : Web browser에서 Servlet을 동작시키기 위해
		// 				 URL 값을 연결 시키는 것
		
		// 수정이 가능하다 보니 특징이 2가지 있음
		// 1. 긴 url을 단축 시킬 수 있음
		// 2. 보안상의 문제를 해결할 수 있음
		
		System.out.println("URL Mapping Servlet 실행");
		
	}

}
  • 2. 서블릿을 생성할 때 mapping 루트 지정

임의로 이름 지정(Ex04Test)

package com;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Ex03URLTest
 */
@WebServlet("/Ex03")
public class Ex03URLTest extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

}

점심시간


오후 [Crawling]

  • Selenium
    • 개념
      • 동적인 웹 페이지의 데이터를 수집할 때 사용하는 라이브러리
      • 동적인 웹 페이지 : 사용자의 제어에 의해서 보여지는 컨텐츠를 가진 페이지
      • ex) 클릭했을 때 새로운 컨텐츠가 보여지거나, 스크롤을 내렸을 때 새로운 컨텐츠가 보여지는 것
      • 제어 : 클릭, 스크롤, 창닫기, 데이터 입력하기 등
    • 환경구축
      • selenium 설치 -> !pip install selenium
      • webdriver 설치 : https://chromedriver.chromium.org/downloads 
        • 현재 브라우저 버전에 맞춰서 설치할 것
        • 윈도우, 맥, 리눅스 3가지로 제공하기 때문에 현재 운영체제에 맞춰 설치
        • 압축 푼 exe 파일을 파이썬 파일 위치와 동일한 폴더에 옮길 것!
# webdriver를 실행 및 브라우저 제어를 위한 라이브러리
from selenium import webdriver as wb

# 키보드의 값을 제어할 수 있는 라이브러리
from selenium.webdriver.common.keys import Keys

# 요소를 접근하기 위한 방식을 활용할 수 있는 라이브러리
from selenium.webdriver.common.by import By
# Chrome() : 설치된 webdriver를 실행시키기 위한 함수
# 사용방법 : Chrome(경로(생략가능))
# ex) smhrd 사용자 계정에 webdriver 파일이 있는 경우 : wb.Chrome("C:/Users/smhrd/webdriver.exe")
#     실행할 python 파일과 같은 폴에 있는 경우 -> wb.Chrome() : 경로 생략
driver = wb.Chrome()

# 브라우저 실행
driver.get(url)
driver.back() # 뒤로 가기
driver.forward() # 앞으로 가기
driver.quit() # 브라우저 닫기
# 입력창에 데이터 보내기
# ex) <a>Naver</a> : element
# driver.find_element(접근방식, 요소를 선택할 수 있는 값) : 요소객체에 접근할 때 사용하는 함수
# send_kyes(데이터) : 접근한 요소에 데이터를 전송하는 함수
driver.find_element(By.CSS_SELECTOR, "#query").send_keys("커피\n")
# driver : 브라우저
# find_element : 요소찾기(선택자, 값)
# => 요소객체
# \n: enter
driver.find_element(By.CSS_SELECTOR, "#query").send_keys("커피")
driver.find_element(By.CSS_SELECTOR, "#search_btn").click()

# '더보기' 버튼을 클릭하는 구문
# 컴퓨터 해상도에 따라서 '더보기' 클릭횟수가 달라지기 때문에 while문으로 구현
# 조건이 True로 되어 있기 때문에 무한 반복이 발생 -> 버튼이 없으면? 오류 발생
# 오류에 대한 예외처리를 try~except구문을 이용해서 반복문을 벗어나게 처리함(break)
# time.sleep() : 1초마다 한번씩 클릭
#              * 브라우저에 컨텐츠가 보여지는 시간을 고려해서 초를 정의(네트워크상태)
while True:
    try:
        driver.find_element(By.CSS_SELECTOR, "a.c_05").click()
        time.sleep(1)
    except:
        break;
# 브라우저 제어를 통해 수집하고자 하는 데이터가 보여졌을 경우 데이터 수집 시작!
driver.find_element(By.CSS_SELECTOR, "h4.h.fz_03").text

driver.find_element(By.CSS_SELECTOR, "div.item-price > strong").text
# span.blind + strong : 6700, 똑같은 결과값

# 전체 메뉴 이름/가격 수집
#   selenium     BeautifulSoup
# find_element = select_one() = 1개 반환
# find_element = select() = list 반환
menuNm = driver.find_elements(By.CSS_SELECTOR,"h4.h.fz_03")
price = driver.find_elements(By.CSS_SELECTOR, "span.blind + strong")
len(menuNm), len(price)

for i in range(len(menuNm)):
    print(menuNm[i].text)
    print(price[i].text)
# 수집한 메뉴 이름/가격을 데이터프레임으로 만들어보기!
import pandas as pd

list_menu =[]
list_price = []
for i in range(len(menuNm)):
    list_menu.append(menuNm[i].text)
    list_price.append(price[i].text)
    
    
len(list_menu), len(list_price)

hsd_dic =  {"메뉴명" : list_menu, "가격" : list_price}

F_df = pd.DataFrame(F_dic)
F_df

결과 창