ALLYES
[2022년 청년친화형 기업 ESG지원 사업 - 27] 본문
일시 : 2022.10.11
시간 : 9:00 ~18:00
오전 : Servlet
오후 : Crawling
오전 [Servlet]
- Web Server Programming을 사용하는 이유
- (요청에 따른)동적인 페이지를 생성하기 위해서
- 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 루트 지정

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

'ESG' 카테고리의 다른 글
| [2022년 청년친화형 기업 ESG지원 사업 - 29] (1) | 2022.10.13 |
|---|---|
| [2022년 청년친화형 기업 ESG지원 사업 - 28] (0) | 2022.10.12 |
| [2022년 청년친화형 기업 ESG지원 사업 - 26] (0) | 2022.10.11 |
| [2022년 청년친화형 기업 ESG지원 사업 - 25] (0) | 2022.10.07 |
| [2022년 청년친화형 기업 ESG지원 사업 - 24] (1) | 2022.10.07 |