Ruby Programming 8 Web Crawling 한국어 정보의 전산 처리 2017. 5. 24.

Slides:



Advertisements
Similar presentations
일정 관리 다이어리 제작 JSP Programming with a Workbook. 학습 목표  사용자의 일정을 관리할 수 있는 다이어리에 대하여 알아보자. JSP Programming with a Workbook2.
Advertisements

Python Essential 세미나 1 CGI 프로그램 작성법 발표자 : 박승기 ( 수 )
파이썬 (Python). 1 일 : 파이썬 프로그래밍 기초 2 일 : 객체, 문자열 3 일 : 문자인코딩, 정규표현식, 옛한글 4 일 : 파일 입출력 5 일 : 함수와 모듈 6 일 : 원시 말뭉치 다루기 실습 7 일 : 주석 말뭉치 다루기 실습 8 일 : 웹 데이터로.
프로그램이란 프로그램 생성 과정 프로젝트 생성 프로그램 실행 컴퓨터를 사용하는 이유는 무엇인가 ? – 주어진 문제를 쉽고, 빠르게 해결하기 위해서 사용한다. 컴퓨터를 사용한다는 것은 ? – 컴퓨터에 설치 혹은 저장된 프로그램을 사용하는 것이다. 문제를 해결하기 위한.
1/29 키보드로 직접 입력할 수 없는 다양한 기호와 한자를 입력하는 방법을 알아 보자. 또한 블록으로 영역을 설정하는 여러 가지 방법에 대해 살펴본 후 블록 으로 설정된 내용을 복사하여 붙여넣거나, 잘라내고 이동하는 방법에 대해서 도 알아보자. 02_ 문서의 입력과 편집.
조선일보 아카이브 이용안내
PHP 웹 프로그래밍 (PHP Web Programming) 웹 연동 기술 문양세 강원대학교 IT대학 컴퓨터과학전공.
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
Report #5 - due: 4/13 다음 10*5의 희소 행렬 A, B를 고려하라.
Power Java 제3장 이클립스 사용하기.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
Ruby Programming Date, scan, 웹 처리 한국어 정보의 전산 처리
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
컴퓨터 프로그래밍 기초 [Final] 기말고사
CHAPTER 02 OpenCV 개요 PART 01 영상 처리 개요 및 OpenCV 소개.
Visual Basic .NET 처음 사용하기.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
D / K / I / T / E / C / H / N / O / L / O / G / Y
학습목표 학습목차 다른 홈페이지의 HTML 파일 코드를 보는 방법에 대해 알아봅니다.
2007 1학기 11 프로젝트 기초 실습.
Chapter 07. 기본 함수 익히기.
11장. 1차원 배열.
10강. JSP 본격적으로 살펴보기-II 스크립트릿, 선언, 표현식 지시자 주석 Lecturer Kim Myoung-Ho
C 프로그래밍 C언어 (CSE2035) (Chap11. Derived types-enumerated, structure, and union) (1-1) Sungwook Kim Sogang University Seoul, Korea Tel:
Method & library.
JA A V W. 03.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
프로그래밍 개요
인터넷응용프로그래밍 JavaScript(Intro).
Linux/UNIX Programming
2018년 11월 05일 박성진 Web & Internet [08] 레이아웃 P1 2018년 11월 05일 박성진
Web & Internet [03] HTML5 다양한 태그
명지대학교 통합모바일앱 E-Book 이용안내
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
Linux/UNIX Programming
Lab 1 Guide: 교재 2장 DrawX ( 쪽)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
ASP.NET AJAX / AJAX Control Toolkit 응용 2008 컴퓨터공학실험( I )
웹디자인
자바 5.0 프로그래밍.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
문자열 컴퓨터시뮬레이션학과 2015년 봄학기 담당교수 : 이형원 E304호,
웹 연동 기술 Yang-Sae Moon Department of Computer Science
빌드 성공.
Fucntion 요약.
Linux/UNIX Programming
연구성과 등록.
제 15 강 문자와 코드 shcho.pe.kr.
Homework #12 (1/2) 프로그램을 작성하고, 프로그램과 실행 결과를 프린트하여 제출한다.
05. General Linear List – Homework
Flow Diagram IV While.
3장 JSP프로그래밍의 개요 이장에서 배울 내용 : JSP페이지의 기본적인 개요설명과 JSP페이지의 처리과정 그리고 웹 어플리케이션의 구조에 대해서 학습한다.
Homework #8 (실습 #7) [1/2] 다음을 수행하는 PHP 프로그램을 작성하여 프로그램과 결과물을 프린트하여 제출한다. sin(45º), cos(45º), tan(45º)를 출력하는 프로그램을 작성하시오. 피보나치 수를 구하는 함수 fib($n)을 작성하고,
JSP Programming with a Workbook
함수, 모듈.
Ruby 프로그래밍 2 loop, 수열 함수 정의 및 호출 반복과 재귀
9 브라우저 객체 모델.
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
JSP Programming with a Workbook
1장 C 언어의 개요 C 언어의 역사와 기원 C 언어의 특징 프로그램 과정 C 프로그램 구조 C 프로그램 예제.
아두이노 프로그래밍 2일차 – Part4 아날로그 키패드 활용하기 강사: 김영준 목원대학교 겸임교수
김선균 컴퓨터 프로그래밍 기초 - 12th : 문자열 - 김선균
대한축구협회 대한축구협회 2013년 전산등록 매뉴얼 2018년 심판보고서매뉴얼.
C++ Espresso 제15장 STL 알고리즘.
Linux/UNIX Programming
6 객체.
Chapter 11. 문서 인쇄 및 파일 형식.
20 XMLHttpRequest.
Presentation transcript:

Ruby Programming 8 Web Crawling 한국어 정보의 전산 처리 2017. 5. 24.

Web Crawling의 요소 기술 웹에 접속하여 웹문서 읽어오기 웹문서 분석 날짜 처리 반복/재귀 알고리즘 open-uri나 net/http 라이브러리 이용. 웹문서 분석 xml/html parser 라이브러리(예: nokogiri)를 이용할 수도 있으나 간단한 분석일 때는 scan 등의 함수로 정규표현을 검색하여 처리할 수도 있음. 날짜 처리 url이 날짜를 바탕으로 할 때는 Date 클래스로 날짜 처리. 반복/재귀 알고리즘 수많은 웹페이지를 방문할 때에는 iterative 또는 recursive 알고리즘을 사용해야 함.

조선일보 스포츠 기사 제목 읽어오기 조선일보 홈페이지 ‘메뉴 전체보기’를 클릭하여 ‘스포츠 - 전체’를 선택 날짜를 클릭 http://news.chosun.com/svc/list_in/se_list.html?catid=G1 날짜를 클릭 http://news.chosun.com/svc/list_in/list_title.html?catid=G1&indate=20170524 하루당 스포츠 웹페이지가 여러 페이지로 이루어져 있고 한 페이지당 20개의 기사 요약이 제시됨. 각 기사의 제목만 추출하고자 함. 조선일보 홈페이지 html 파일의 인코딩은 euc-kr이므로 iconv를 이용하여 출력 결과를 utf-8로 변환하여 출력

기사의 html 구조 html 소스 코드를 보면, 각 기사는 다음과 같은 구조로 되어 있음. 붉은색 부분만 추출하고자 함. <dl class="list_item"> <dt><a href="http://news.chosun.com/site/data/html_dir/2017/05/24/2017052400394.html">[줌인]김성근 감독 형식은 자진사퇴, 내용은 경질?</a></dt> <dd class="thumb"><a href="http://news.chosun.com/site/data/html_dir/2017/05/24/2017052400394.html"><img src="http://image.chosun.com/sitedata/thumbnail/201705/24/2017052400382_0_thumb.jpg" alt=""></a></dd> <dd class="desc"><a href="http://news.chosun.com/site/data/html_dir/2017/05/24/2017052400394.html">김성근 한화 이글스 감독이 자진사퇴했고, 한화 구단은 사의를 수용하며 이상군 투수코치를 감독대행에 임명했다.김 감독은 지난 21일 대전 삼성 라이온즈전을 마..</a></dd> <dd class="date_author"> <span class="date">2017.05.24 (수)</span> | <span class="author"> 스포츠조선=박재호 기자 </span> </dd> </dl>

Ruby script를 바깥쪽부터 작성함 사용자로부터 시작 날짜와 끝 날짜를 입력받아, 각 날짜의 조선일보 스포츠 웹페이지를 읽어옴. require 'date' require 'net/http' begin_date = Date.new(ARGV[0].to_i, ARGV[1].to_i, ARGV[2].to_i) end_date = Date.new(ARGV[3].to_i, ARGV[4].to_i, ARGV[5].to_i) Net::HTTP.start("news.chosun.com") do |http| #조선일보 홈페이지에 접속 begin_date.upto(end_date) do |date| #시작 날짜부터 끝 날짜까지 d = date.to_s.gsub("-","") #날짜를 문자열로: 20170523 url = "/svc/list_in/list_title.html?catid=G1&indate=#{d}" #해당 날짜의 스포츠 기사 웹 주소 e = find_end_page(http, url, 1) #해당 날짜의 스포츠 기사의 페이지 수 알아냄 (1..e).each do |i| #1페이지부터 끝 페이지까지 search(http, url+"&pn=#{i}") #search 함수 호출 end

find_end_page 함수 @end_pattern = %r|<li><a style="text-decoration:none;cursor:default" class="current">[0-9]+</a></li><li><a style="text-decoration:none;cursor:default">| #마지막 페이지의 특징을 정규표현으로 포착함. def find_end_page(http, url, n) #스포츠 기사가 몇 페이지까지 있는지 알아내는 함수 str = http.get(url+"&pn=#{n}").body #n번째 페이지를 읽어옴 if not str =~ @end_pattern #마지막 페이지가 아니면 find_end_page(http, url, n+1) #find_end_page 함수 재귀 호출 else #마지막 페이지이면 return n #n을 반환하고 함수 종료 end

search 함수 @pattern = %r|<dt><a href="http://news.chosun.com/site/data/html_dir/([0-9]{4}/[0-9]{2}/[0-9]{2})/[0-9]{13}\.html">(.*)</a></dt>| def search(http, url) puts url #url 출력 str = http.get(url).body #url의 웹 문서를 불러옴 str.scan(@pattern).each do |date, title| #웹 문서에서 정규표현(pattern)을 찾음. #괄호 친 두 부분을 date, title이라 지칭 print date, "\t", title, "\n" #date와 title 출력 end

위의 코드의 문제 해당 날짜의 스포츠 웹페이지가 몇 페이지까지 있는지 알아내는 함수(find_end_page)에서도 각 웹페이지의 문서를 읽어오고 각 웹문서를 읽어와서 제목을 추출하는 함수(search)에서도 각 웹페이지의 문서를 읽어오게 되어 있어서 같은 일을 2번 반복하는 꼴이 됨. 페이지 수만큼 반복하는 iterative algorithm을 적용하는 셈. 각 웹페이지 문서를 1번만 읽어오면서 과제를 수행하기 위해서는 recursive algorithm이 필요함. 날짜와 일련번호를 가지고 url을 만드는 일은 search 함수에게 맡기는 게 나음. (그러면 calling code가 더 깔끔해짐.)

recursive algorithm을 적용한 calling code Net::HTTP.start("news.chosun.com") do |http| begin_date.upto(end_date) do |date| search(http, date, 1) #첫째 페이지에 대해 search 함수 호출 end

search 함수 def search(http, date, n) d = date.to_s.gsub("-","") #날짜를 문자열로: 20170523 url = "/svc/list_in/list.html?catid=G1&indate=#{d}&pn=#{n}" puts url #url 출력 str = http.get(url).body str.scan(@pattern).each do |date, title| print date, "\t", title, "\n" #date와 title 출력 end search(http, date, n+1) if not str =~ @end_pattern #마지막 페이지가 아니면 n을 1 증가시켜 함수 재귀 호출

동아일보 동아일보 홈페이지, 스포츠, 최신기사, 날짜별로 들어가 보면, 전반적인 구조는 조선일보와 비슷함. http://news.donga.com/List/Sports/?ymd=20170524&m= 한 페이지에 20개의 기사씩 제시되고 url에 첫 기사의 일련번호(1,21,41,...)와 날짜가 포함됨. http://news.donga.com/List/Sports/?p=21&prod=news&ymd=20170524&m= 조선일보와 비슷하게 search 함수를 재귀호출하되 이 함수의 parameter에 일련번호도 포함시켜야 함.

동아일보용 calling 코드 @pattern = %r|<div class='articleList'><div class='rightList'><a href='http://news.donga.com/List/Sports/[0-9]/[0-9]{2}/([0-9]{8})/[0-9]+/[0-9]'><span class='tit'>(.+?)</span>| @end_pattern = %r|</a><strong>[0-9]+</strong><a href='\?p=none\&prod=news\&ymd=[0-9]{8}\&m=' class='right'>| Net::HTTP.start("news.donga.com") do |http| begin_date.upto(end_date) do |date| search(http, date, 1) #search 함수 호출 end

동아일보용 search 함수 def search(http, date, n) d = date.to_s.gsub("-","") #날짜를 문자열로: 20170524 url = "/List/Sports/?p=#{n}&prod=news&ymd=#{d}&m=" puts url #url 출력 str = http.get(url).body #url의 웹 문서를 불러옴 str.scan(@pattern).each do |date, title| print date, "\t", title, "\n" #date와 title 출력 end search(http, date, n+20) if not str =~ @end_pattern #마지막 페이지가 아니면 search 함수 재귀 호출