SlideShare a Scribd company logo
1 of 62
The beginner’s guide to
웹 크롤링
Web crawling
2015-10-23
Lucy Park
me@lucypark.kr
스크래핑
(Scraping)
어젯밤
자료를 열심히 만들다가 생긴 일
제 소개
• 박사과정 n년차
• 데이터마이닝 전공
• “Yak shaver”
– 대한민국 정치의 모든 것(http://pokr.kr),
KoNLPy(http://konlpy.org) 등을 만드는데 참여
• 현재는 졸업을 위해 칩거 중
3
목차
1. 초간단 손 스크래핑
2. 용어 정리: 크롤링? 스크래핑?
3. 파이썬 3분만에 시작하기 (초간단 문법)
4. 국회 회의록 스크래퍼 갖다 쓰기
5. 국회 회의록 스크래퍼 직접 만들어보기
참고자료
4
초간단 손 스크래핑! 3단계
1. Scrape하려는 웹페이지 목록 만들기
2. 웹페이지 전체 다운로드 받기
3. 웹페이지 parsing
5
초간단 손 스크래핑! 3단계
1. Scrape하려는 웹페이지 목록 만들기
(일단 네 개만)
http://movie.naver.com/movie/bi/mi/basic.nhn?code=121048
http://movie.naver.com/movie/bi/mi/basic.nhn?code=129049
http://movie.naver.com/movie/bi/mi/basic.nhn?code=118917
http://movie.naver.com/movie/bi/mi/basic.nhn?code=114278
6
초간단 손 스크래핑! 3단계
1. Scrape하려는 웹페이지 목록 만들기
2. 웹페이지 목록 전체 다운로드 받기
7
초간단 손 스크래핑! 3단계
1. Scrape하려는 웹페이지 목록 만들기
2. 웹페이지 전체 다운로드 받기
3. 웹페이지 parsing
찾음! 8
그런데 긁고 싶은 페이지가 1000개라면?
9
옵션 1:
대학원생을 시킨다*
* 이건 제가 대학원생이 아니었으면 못할 농담 10
옵션 2:
컴퓨터를 시킨다 낙찰!
11
목차
1. 초간단 손 스크래핑
2. 용어 정리: 크롤링? 스크래핑?
3. 파이썬 3분만에 시작하기 (초간단 문법)
4. 국회 회의록 스크래퍼 갖다 쓰기
5. 국회 회의록 스크래퍼 직접 만들어보기
참고자료
12
용어 정리
이미지 출처:
https://en.wikipedia.org/wiki/Internet#/media/File:Internet_map_102
4_-_transparent,_inverted.png
• 인터넷 (the Internet)
– 네트워크의 네트워크
– 여러 기기 간 연결된 물리적 구조 (IoT!)
13
용어 정리
• 웹 (the Web, www, World Wide Web)
– 인터넷 상에 존재하는 거대한 정보 공간
– 47.7억 개의 웹페이지낄 연결되어 있음
* http://www.worldwidewebsize.com/
14
용어 정리
• 웹페이지
– 웹 상의 문서
15
용어 정리
• URL
– Unique resource locator
– 특정 웹페이지로 연결해주는 주소
– 일명 “링크”
http://likms.assembly.go.kr/bill/jsp/BillDetail.jsp?bill_id=PRC_H1W5H1K0Z1M2G1Q0Q5I5T0O5H4O2H8
scheme host path query
* 더 자세한 내용은 위키피디아에
https://en.wikipedia.org/wiki/Uniform_Resource_Locator 16
용어 정리
• 웹브라우저
– 주소창에 URL을 입력하면 웹페이지를 서버에
요청하고 서버로부터 받은 HTML을 해석해서
화면에 띄워주는 프로그램
17
용어 정리
• HTML (1/3)
– Hypertext markup language
– 웹페이지를 작성하는데 사용되는 마크업 언어
– 태그로 HTML 요소(element)를 만든다
– 일반적인 태그 구조:
<태그명 속성명=“속성값” 다른속성명=“다른속성값”>텍스트</태그명>
18
용어 정리
• HTML (2/3)
– 예시 파일: example.html
<h1>제목</h1>
<p>문단 하나</p>
<p class=“special”>문단 둘</p>
<p class=“special”>문단 셋</p>
<a href=http://some.url.com/>링크</a>
<br>
<table id=“my-table” class=“table-condensed table-striped”>
<tr><td>표</td><td>하나</td></tr>
<tr><td>줄</td><td>둘</td></tr>
</table>
p 태그에 “special”이라는 값을 가진 class 속성이 추가된
HTML 요소 두 개
줄바꿈 태그
table 태그에 “my-table”이라는 값을 가진 id 속성과
table-condensed, table-striped의 두 가지 값을 가진
class 속성이 있는 HTML 요소
a 태그에 URL을 href 속성에 담고 있는 HTML 요소
19
용어 정리
• HTML (3/3)
• 예시 파일: example.html
텍스트 에디터*로 열어서 본
example.html
웹 브라우저로 열어서 본
example.html
* 메모장, Notepad++, Vim 등 텍스트 파일을 수정할 수 있는 프로그램.
화면 캡쳐에 있는 에디터는 Sublime Text 2 20
용어 정리
• HTTP
– Hypertext transfer protocol
– Hypertext로 작성된 웹문서를 주고 받는 통신
규약
응답
response
요청
request
내 컴퓨터
서버
21
(좀 더 엄밀한) 용어 정리
• 크롤링
거미가 (spider)
거미줄을 (hyperlink)
기어다니듯(crawling)
World Wide Web
webpage
hyperlink 22
(좀 더 엄밀한) 용어 정리
• 스크래핑
– 정해진 형태의 웹페이지에서 원하는 데이터를
추출하는 작업 (속어: “긁기”)
– 지금 우리가 하려는 것
암살,9.11,8.97 마션,8.73,8.41 인턴,9.04,8.98 리그레션,6.75,7.08
23
목차
1. 초간단 손 스크래핑
2. 용어 정리: 크롤링? 스크래핑?
3. 파이썬 3분만에 시작하기 (초간단 문법)
4. 국회 회의록 스크래퍼 갖다 쓰기
5. 국회 회의록 스크래퍼 직접 만들어보기
참고자료
24
패키지 설치
• R
• Python*
25
install.packages(‘package_name’)
pip install package_name
* 단, 파이썬 쉘 밖에서 실행
패키지 사용
• R
• Python
26
library(‘package_name’)
import package_name
열
• R*
• Python**
27
abc <- c(‘a’, ‘b’, ‘c’)
abc <- append(abc, ‘d’)
abc = [‘a’, ‘b’, ‘c’]
abc.append(‘d’)
* “vector”라 부름
** “list”라 부름
String concatenation
28
• R
• Python
paste(abc, collapse=‘ ‘)
‘ ‘.join(abc)
String substitution
• R
• Python
29
sub(‘b’, ‘n’, ‘beat’)
‘beat’.replace(‘b’, ‘n’)
루프 (1/2)
30
• R
• Python
for (i in 1:4) {
print(i)
}
for i in range(1,5):
print(i)
루프 (2/2)*
31
• R
• Python
a <- 1:3
s <- sapply(a, function(x) x^2)
print(sum(s))
a = range(1,4)
s = [i**2 for i in a]
print(sum(s))
* These two are not directly comparable. In R, apply is a very powerful function for looping. (Much frequently used than for loops.)
On the other hand, in Python, list comprehensions are frequently used.
함수
32
• R
• Python
jiggle <- function(x) {
return(x + 1)
}
def jiggle(x):
return x + 1
파일 출력
33
• R
• Python
write(‘text’, file=‘textfile.txt’)
f = open(‘textfile.txt’, ‘w’)
f.write(‘text’)
f.close()
목차
1. 초간단 손 스크래핑
2. 용어 정리: 크롤링? 스크래핑?
3. 파이썬 3분만에 시작하기 (초간단 문법)
4. 국회 회의록 스크래퍼 갖다 쓰기
5. 국회 회의록 스크래퍼 직접 만들어보기
참고자료
34
팀포퐁의 국회 회의록 스크래퍼
35
https://github.com/teampopong/crawlers/blob/master/meetings/crawl.py
3단계 간단 사용법
1. crawl.py 파일 다운로드 (또는 복사/붙이기)
2. 명령프롬프트에서 python crawl.py 로
스크립트 실행
36
3단계 간단 사용법
1. crawl.py 파일 다운로드 (또는 복사/붙이기)
2. 명령프롬프트에서 python crawl.py 로
스크립트 실행
3. 다운로드 받은 파일 확인
37
PDF 문서에서 텍스트 추출
• pdf2htmlEX
– PDF를 텍스트로 변환
– 다운로드 (윈도우)
38
PDF 문서에서 텍스트 추출
39
파싱은 이하 생략…
목차
1. 초간단 손 스크래핑
2. 용어 정리: 크롤링? 스크래핑?
3. 파이썬 3분만에 시작하기 (초간단 문법)
4. 국회 회의록 스크래퍼 갖다 쓰기
5. 국회 회의록 스크래퍼 직접 만들어보기
참고자료
41
좀 더 똑똑하고(?) 편한(?) 방법
42
http://pokr.kr/meeting/?date=2012-12-31
구조화가 잘 되어 있는 pokr.kr
데이터 스크래핑
43
http://pokr.kr/meeting/19309244267/dialog
페이지 요소 검사
44
좋은 도구.
이 포인터를 이용해서
웹페이지를 클릭하면
해당 HTML 요소를 찾아준다.
우리가 크롤링하고 싶은 곳
페이지 요소 검사
45
우리가 크롤링하고 싶은 곳
class 속성값이 “dialogue”인 div 안에
class 속성값이
“statement”, “issue”, “time” 등인 div가
여러 개 들어 있다!
(그 div 안의 div가 각각 발언, 안건, 시간 cell 하나)
페이지 요소 검사
46
발언
하나
부분
확대
발언자
발언내용
class 속성값이 “statement”인 div 안에
class 속성값이
“speaker”, “content” 등인 div가 여러 개 들어 있다!
파싱 (parsing)
• HTML 문서는 기본적으로 tree 형태이다.
• 방금 전에도:
47
1. class 속성값이 “dialogue”인 div 안에 class 속성값이 “statement”,
“issue”, “time” 등인 div가 여러 개 들어 있다
2. class 속성값이 “statement”인 div 안에 class 속성값이 “speaker”,
“content” 등인 div가 여러 개 들어 있다!
파싱 (parsing)
• HTML 문서는 기본적으로 tree 형태이다.
• 방금 전에도:
48
<div>
class:dialogue
<div>
class:statement
<div>
class:issue
<div>
class:time
<div>
class:statement
<div>
class:speaker
<div>
class:content
…
…
root
XPath 소개
• HTML (또는 XML)을 파싱할때 사용하는 문법
49
root.xpath(‘.//div’)
root 밑에서 모든 div를 찾아라
XPath 소개
• HTML (또는 XML)을 파싱할때 사용하는 문법
50
root.xpath(‘.//div[@class=“dialogue”]’)
root 밑에서 class 속성값이 “dialogue”인 모든 div를 찾아라
XPath 소개
• HTML (또는 XML)을 파싱할때 사용하는 문법
51
root.xpath(‘.//div[@class=“dialogue”]/div’)
root 밑에서 class 속성값이 “dialogue”인 모든 div를 찾고
그 바로 하위에 있는 모든 div를 찾아라
참고:
• 슬래시 한 번 (/): 바로 하위의
• 슬래시 두 번 (//): 모든 하위의
XPath 소개
• HTML (또는 XML)을 파싱할때 사용하는 문법
52
root.xpath(‘.//div[@class=“dialogue”]/div[@class=“statement”]’)
root 밑에서 class 속성값이 “dialogue”인 모든 div를 찾고
그 바로 하위에서 class 속성값이 “statement”인 모든 div를 찾아라
참고:
• 슬래시 한 번 (/): 바로 하위의
• 슬래시 두 번 (//): 모든 하위의
XPath + Python
53
# statements라는 변수에 xpath 넣기
statements = root.xpath(‘.//div[@class=“dialogue”]/div[@class=“statement”]’)
XPath + Python
54
# statements라는 변수에 xpath 넣기
statements = root.xpath(‘.//div[@class=“dialogue”]/div[@class=“statement”]’)
# 각각의 statement에서 speaker, content 정보 추출하기
for statement in statements:
speaker = statement.xpath(‘./div[@class=“speaker”]/div[@class=“person-name”]/text()’)[0]
content = ‘ ‘.join(statement.xpath(‘./div[@class=“content glossary”]/text()’))
XPath + Python
55
# statements라는 변수에 xpath 넣기
statements = root.xpath(‘.//div[@class=“dialogue”]/div[@class=“statement”]’)
# 각각의 statement에서 speaker, content 정보 추출하고 newline 제거 후 rows라는 list에 넣기
rows = []
for statement in statements:
speaker = statement.xpath(‘./div[@class=“speaker”]/div[@class=“person-name”]/text()’)[0]
content = ‘ ‘.join(statement.xpath(‘./div[@class=“content glossary”]/text()’))
content = content.replace(‘n’, ‘ ‘).strip()
rows.append([speaker, content])
XPath + Python
56
# statements라는 변수에 xpath 넣기
statements = root.xpath(‘.//div[@class=“dialogue”]/div[@class=“statement”]’)
# 각각의 statement에서 speaker, content 정보 추출하고 newline 제거 후 rows라는 list에 넣기
rows = []
for statement in statements:
speaker = statement.xpath(‘./div[@class=“speaker”]/div[@class=“person-name”]/text()’)[0]
content = ‘ ‘.join(statement.xpath(‘./div[@class=“content glossary”]/text()’))
content = content.replace(‘n’, ‘ ‘).strip()
rows.append([speaker, content])
# 파일에 저장
f = open(‘statements.txt’, ‘w’)
f.write(‘n’.join(‘t’.join(row) for row in rows))
f.close()
XPath + Python
57
# statements라는 변수에 xpath 넣기
statements = root.xpath(‘.//div[@class=“dialogue”]/div[@class=“statement”]’)
# 각각의 statement에서 speaker, content 정보 추출하고 newline 제거 후 rows라는 list에 넣기
rows = []
for statement in statements:
speaker = statement.xpath(‘./div[@class=“speaker”]/div[@class=“person-name”]/text()’)[0]
content = ‘ ‘.join(statement.xpath(‘./div[@class=“content glossary”]/text()’))
content = content.replace(‘n’, ‘ ‘).strip()
rows.append([speaker, content])
# 파일에 저장
f = open(‘statements.txt’, ‘w’)
f.write(‘n’.join(‘t’.join(row) for row in rows))
f.close()
결과물 확인
58
전체 파싱 코드:
https://gist.github.com/e9t/556fed5ae4d9bda6f1d8#file-parse-py
이제 끝났습니다!
• 어, 근데 한가지가 빠졌네요.
• URL 목록은 어떻게 받을 수 있을까요?
• 숙제입니다…+_+
59
60
참고자료: 스크래퍼
• 박은정, Scraping from the Web
• 강철, 30분만에 따라하는 동시성 스크래퍼,
PyCon Korea, 2014.
61
참고자료: 파이썬
• 박은정, Introduction to Python (on Windows)
• 김태훈, 140분의 파이썬
• 질의 응답: 파이썬 코리아
https://www.facebook.com/groups/pythonkorea/
62

More Related Content

What's hot

Little Big Data #1. 바닥부터 시작하는 데이터 인프라
Little Big Data #1. 바닥부터 시작하는 데이터 인프라Little Big Data #1. 바닥부터 시작하는 데이터 인프라
Little Big Data #1. 바닥부터 시작하는 데이터 인프라Seongyun Byeon
 
Neo4j GraphTalk Helsinki - Introduction and Graph Use Cases
Neo4j GraphTalk Helsinki - Introduction and Graph Use CasesNeo4j GraphTalk Helsinki - Introduction and Graph Use Cases
Neo4j GraphTalk Helsinki - Introduction and Graph Use CasesNeo4j
 
플레이오토 ECS 사용사례
플레이오토 ECS 사용사례플레이오토 ECS 사용사례
플레이오토 ECS 사용사례JaeSeong Lee
 
[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기NAVER D2
 
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기AWSKRUG - AWS한국사용자모임
 
Data Engineering 101
Data Engineering 101Data Engineering 101
Data Engineering 101DaeMyung Kang
 
개발자를 위한 (블로그) 글쓰기 intro
개발자를 위한 (블로그) 글쓰기 intro개발자를 위한 (블로그) 글쓰기 intro
개발자를 위한 (블로그) 글쓰기 introSeongyun Byeon
 
지식그래프 개념과 활용방안 (Knowledge Graph - Introduction and Use Cases)
지식그래프 개념과 활용방안 (Knowledge Graph - Introduction and Use Cases)지식그래프 개념과 활용방안 (Knowledge Graph - Introduction and Use Cases)
지식그래프 개념과 활용방안 (Knowledge Graph - Introduction and Use Cases)Myungjin Lee
 
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축Juhong Park
 
파이썬을 활용한 챗봇 서비스 개발 3일차
파이썬을 활용한 챗봇 서비스 개발 3일차파이썬을 활용한 챗봇 서비스 개발 3일차
파이썬을 활용한 챗봇 서비스 개발 3일차Taekyung Han
 
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)Hyojun Jeon
 
제 17회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [중고책나라] : 실시간 데이터를 이용한 Elasticsearch 클러스터 최적화
제 17회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [중고책나라] : 실시간 데이터를 이용한 Elasticsearch 클러스터 최적화제 17회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [중고책나라] : 실시간 데이터를 이용한 Elasticsearch 클러스터 최적화
제 17회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [중고책나라] : 실시간 데이터를 이용한 Elasticsearch 클러스터 최적화BOAZ Bigdata
 
Apache Zeppelin으로 데이터 분석하기
Apache Zeppelin으로 데이터 분석하기Apache Zeppelin으로 데이터 분석하기
Apache Zeppelin으로 데이터 분석하기SangWoo Kim
 
대용량 로그분석 Bigquery로 간단히 사용하기 (20170215 T아카데미)
대용량 로그분석 Bigquery로 간단히 사용하기 (20170215 T아카데미)대용량 로그분석 Bigquery로 간단히 사용하기 (20170215 T아카데미)
대용량 로그분석 Bigquery로 간단히 사용하기 (20170215 T아카데미)Jaikwang Lee
 
한국어 문서 추출요약 AI 경진대회- 좌충우돌 후기
한국어 문서 추출요약 AI 경진대회- 좌충우돌 후기한국어 문서 추출요약 AI 경진대회- 좌충우돌 후기
한국어 문서 추출요약 AI 경진대회- 좌충우돌 후기Hangil Kim
 
Elastic Search (엘라스틱서치) 입문
Elastic Search (엘라스틱서치) 입문Elastic Search (엘라스틱서치) 입문
Elastic Search (엘라스틱서치) 입문SeungHyun Eom
 
Python을 활용한 챗봇 서비스 개발 1일차
Python을 활용한 챗봇 서비스 개발 1일차Python을 활용한 챗봇 서비스 개발 1일차
Python을 활용한 챗봇 서비스 개발 1일차Taekyung Han
 
프로젝트 기획서 발표 - 웹크롤링 (한양대 오픈소스동아리)
프로젝트 기획서 발표 - 웹크롤링 (한양대 오픈소스동아리)프로젝트 기획서 발표 - 웹크롤링 (한양대 오픈소스동아리)
프로젝트 기획서 발표 - 웹크롤링 (한양대 오픈소스동아리)Osori Hanyang
 

What's hot (20)

Little Big Data #1. 바닥부터 시작하는 데이터 인프라
Little Big Data #1. 바닥부터 시작하는 데이터 인프라Little Big Data #1. 바닥부터 시작하는 데이터 인프라
Little Big Data #1. 바닥부터 시작하는 데이터 인프라
 
Neo4j GraphTalk Helsinki - Introduction and Graph Use Cases
Neo4j GraphTalk Helsinki - Introduction and Graph Use CasesNeo4j GraphTalk Helsinki - Introduction and Graph Use Cases
Neo4j GraphTalk Helsinki - Introduction and Graph Use Cases
 
플레이오토 ECS 사용사례
플레이오토 ECS 사용사례플레이오토 ECS 사용사례
플레이오토 ECS 사용사례
 
[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기
 
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
 
Data Engineering 101
Data Engineering 101Data Engineering 101
Data Engineering 101
 
개발자를 위한 (블로그) 글쓰기 intro
개발자를 위한 (블로그) 글쓰기 intro개발자를 위한 (블로그) 글쓰기 intro
개발자를 위한 (블로그) 글쓰기 intro
 
지식그래프 개념과 활용방안 (Knowledge Graph - Introduction and Use Cases)
지식그래프 개념과 활용방안 (Knowledge Graph - Introduction and Use Cases)지식그래프 개념과 활용방안 (Knowledge Graph - Introduction and Use Cases)
지식그래프 개념과 활용방안 (Knowledge Graph - Introduction and Use Cases)
 
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축
 
파이썬을 활용한 챗봇 서비스 개발 3일차
파이썬을 활용한 챗봇 서비스 개발 3일차파이썬을 활용한 챗봇 서비스 개발 3일차
파이썬을 활용한 챗봇 서비스 개발 3일차
 
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유 (2부)
 
제 17회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [중고책나라] : 실시간 데이터를 이용한 Elasticsearch 클러스터 최적화
제 17회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [중고책나라] : 실시간 데이터를 이용한 Elasticsearch 클러스터 최적화제 17회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [중고책나라] : 실시간 데이터를 이용한 Elasticsearch 클러스터 최적화
제 17회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [중고책나라] : 실시간 데이터를 이용한 Elasticsearch 클러스터 최적화
 
Apache Zeppelin으로 데이터 분석하기
Apache Zeppelin으로 데이터 분석하기Apache Zeppelin으로 데이터 분석하기
Apache Zeppelin으로 데이터 분석하기
 
대용량 로그분석 Bigquery로 간단히 사용하기 (20170215 T아카데미)
대용량 로그분석 Bigquery로 간단히 사용하기 (20170215 T아카데미)대용량 로그분석 Bigquery로 간단히 사용하기 (20170215 T아카데미)
대용량 로그분석 Bigquery로 간단히 사용하기 (20170215 T아카데미)
 
한국어 문서 추출요약 AI 경진대회- 좌충우돌 후기
한국어 문서 추출요약 AI 경진대회- 좌충우돌 후기한국어 문서 추출요약 AI 경진대회- 좌충우돌 후기
한국어 문서 추출요약 AI 경진대회- 좌충우돌 후기
 
Elastic Search (엘라스틱서치) 입문
Elastic Search (엘라스틱서치) 입문Elastic Search (엘라스틱서치) 입문
Elastic Search (엘라스틱서치) 입문
 
Web mining
Web miningWeb mining
Web mining
 
Python을 활용한 챗봇 서비스 개발 1일차
Python을 활용한 챗봇 서비스 개발 1일차Python을 활용한 챗봇 서비스 개발 1일차
Python을 활용한 챗봇 서비스 개발 1일차
 
프로젝트 기획서 발표 - 웹크롤링 (한양대 오픈소스동아리)
프로젝트 기획서 발표 - 웹크롤링 (한양대 오픈소스동아리)프로젝트 기획서 발표 - 웹크롤링 (한양대 오픈소스동아리)
프로젝트 기획서 발표 - 웹크롤링 (한양대 오픈소스동아리)
 
Web Crawler
Web CrawlerWeb Crawler
Web Crawler
 

Viewers also liked

Selenium을 이용한 동적 사이트 크롤러 만들기
Selenium을 이용한 동적 사이트 크롤러 만들기Selenium을 이용한 동적 사이트 크롤러 만들기
Selenium을 이용한 동적 사이트 크롤러 만들기Gyuhyeon Jeon
 
141118 최창원 웹크롤러제작
141118 최창원 웹크롤러제작141118 최창원 웹크롤러제작
141118 최창원 웹크롤러제작Changwon Choe
 
한국어와 NLTK, Gensim의 만남
한국어와 NLTK, Gensim의 만남한국어와 NLTK, Gensim의 만남
한국어와 NLTK, Gensim의 만남Eunjeong (Lucy) Park
 
[Week2] 데이터 스크래핑
[Week2] 데이터 스크래핑[Week2] 데이터 스크래핑
[Week2] 데이터 스크래핑neuroassociates
 
6장 지능형 웹 크롤링
6장 지능형 웹 크롤링6장 지능형 웹 크롤링
6장 지능형 웹 크롤링Chanil Kim
 
웹크롤러 조사
웹크롤러 조사웹크롤러 조사
웹크롤러 조사rupert kim
 
Web Crawler 고군분투기
Web Crawler 고군분투기Web Crawler 고군분투기
Web Crawler 고군분투기richellin
 
[PyConKR 2014] 30분만에 따라하는 동시성 스크래퍼
[PyConKR 2014] 30분만에 따라하는 동시성 스크래퍼[PyConKR 2014] 30분만에 따라하는 동시성 스크래퍼
[PyConKR 2014] 30분만에 따라하는 동시성 스크래퍼Cheol Kang
 
Node.js를 활용한 웹 크롤링(Crawling)
Node.js를 활용한 웹 크롤링(Crawling)Node.js를 활용한 웹 크롤링(Crawling)
Node.js를 활용한 웹 크롤링(Crawling)Jeong-gyu Kim
 
[Ppt발표팁]효과적인 슬라이드 발표를 위한 10가지 팁
[Ppt발표팁]효과적인 슬라이드 발표를 위한 10가지 팁[Ppt발표팁]효과적인 슬라이드 발표를 위한 10가지 팁
[Ppt발표팁]효과적인 슬라이드 발표를 위한 10가지 팁에디티지(Editage Korea)
 

Viewers also liked (10)

Selenium을 이용한 동적 사이트 크롤러 만들기
Selenium을 이용한 동적 사이트 크롤러 만들기Selenium을 이용한 동적 사이트 크롤러 만들기
Selenium을 이용한 동적 사이트 크롤러 만들기
 
141118 최창원 웹크롤러제작
141118 최창원 웹크롤러제작141118 최창원 웹크롤러제작
141118 최창원 웹크롤러제작
 
한국어와 NLTK, Gensim의 만남
한국어와 NLTK, Gensim의 만남한국어와 NLTK, Gensim의 만남
한국어와 NLTK, Gensim의 만남
 
[Week2] 데이터 스크래핑
[Week2] 데이터 스크래핑[Week2] 데이터 스크래핑
[Week2] 데이터 스크래핑
 
6장 지능형 웹 크롤링
6장 지능형 웹 크롤링6장 지능형 웹 크롤링
6장 지능형 웹 크롤링
 
웹크롤러 조사
웹크롤러 조사웹크롤러 조사
웹크롤러 조사
 
Web Crawler 고군분투기
Web Crawler 고군분투기Web Crawler 고군분투기
Web Crawler 고군분투기
 
[PyConKR 2014] 30분만에 따라하는 동시성 스크래퍼
[PyConKR 2014] 30분만에 따라하는 동시성 스크래퍼[PyConKR 2014] 30분만에 따라하는 동시성 스크래퍼
[PyConKR 2014] 30분만에 따라하는 동시성 스크래퍼
 
Node.js를 활용한 웹 크롤링(Crawling)
Node.js를 활용한 웹 크롤링(Crawling)Node.js를 활용한 웹 크롤링(Crawling)
Node.js를 활용한 웹 크롤링(Crawling)
 
[Ppt발표팁]효과적인 슬라이드 발표를 위한 10가지 팁
[Ppt발표팁]효과적인 슬라이드 발표를 위한 10가지 팁[Ppt발표팁]효과적인 슬라이드 발표를 위한 10가지 팁
[Ppt발표팁]효과적인 슬라이드 발표를 위한 10가지 팁
 

Similar to The beginner’s guide to 웹 크롤링 (스크래핑)

Hyperledger farbric build your first network install and analysis
Hyperledger farbric   build your first network install and analysisHyperledger farbric   build your first network install and analysis
Hyperledger farbric build your first network install and analysis병준 김
 
HTTP 완벽가이드- 19장 배포시스템
HTTP 완벽가이드- 19장 배포시스템HTTP 완벽가이드- 19장 배포시스템
HTTP 완벽가이드- 19장 배포시스템박 민규
 
데이터 분석 1 - 소개
데이터 분석 1 - 소개데이터 분석 1 - 소개
데이터 분석 1 - 소개Jaewook Byun
 
Hyperledger Explorer.pptx
Hyperledger Explorer.pptxHyperledger Explorer.pptx
Hyperledger Explorer.pptxwonyong hwang
 
UNIX 시스템 2014-2018년 기말시험 기출문제
UNIX 시스템 2014-2018년 기말시험 기출문제UNIX 시스템 2014-2018년 기말시험 기출문제
UNIX 시스템 2014-2018년 기말시험 기출문제Lee Sang-Ho
 
Let'Swift 2023 Swift Macro, 어디다 쓰죠?
Let'Swift 2023 Swift Macro, 어디다 쓰죠?Let'Swift 2023 Swift Macro, 어디다 쓰죠?
Let'Swift 2023 Swift Macro, 어디다 쓰죠?williciousk
 
XE3 a부터 z까지(1) xe3 구조와 간단한 페이지 만들기
XE3 a부터 z까지(1) xe3 구조와 간단한 페이지 만들기XE3 a부터 z까지(1) xe3 구조와 간단한 페이지 만들기
XE3 a부터 z까지(1) xe3 구조와 간단한 페이지 만들기승훈 오
 
Python 생태계의 이해
Python 생태계의 이해Python 생태계의 이해
Python 생태계의 이해용 최
 
리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리Seungyong Lee
 
Endnote를 활용한 학술논문 검색법 기초x8
Endnote를 활용한 학술논문 검색법 기초x8Endnote를 활용한 학술논문 검색법 기초x8
Endnote를 활용한 학술논문 검색법 기초x8Hana Kim
 
XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기
XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기
XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기XpressEngine
 
200725 AWS 클라우드 컴퓨팅으로 배우는 생물정보학 - 덕성여대 강연
200725 AWS 클라우드 컴퓨팅으로 배우는 생물정보학 - 덕성여대 강연200725 AWS 클라우드 컴퓨팅으로 배우는 생물정보학 - 덕성여대 강연
200725 AWS 클라우드 컴퓨팅으로 배우는 생물정보학 - 덕성여대 강연Joohyun Han
 
리얼리눅스 제 1 회 세미나: "리눅스, 제대로 알고 코딩하자!"
리얼리눅스 제 1 회 세미나: "리눅스, 제대로 알고 코딩하자!"리얼리눅스 제 1 회 세미나: "리눅스, 제대로 알고 코딩하자!"
리얼리눅스 제 1 회 세미나: "리눅스, 제대로 알고 코딩하자!"리얼리눅스
 
Red Hat OpenStack 17 저자직강+스터디그룹_5주차
Red Hat OpenStack 17 저자직강+스터디그룹_5주차Red Hat OpenStack 17 저자직강+스터디그룹_5주차
Red Hat OpenStack 17 저자직강+스터디그룹_5주차Nalee Jang
 
제로부터시작하는 Git 두번째 이야기
제로부터시작하는 Git 두번째 이야기제로부터시작하는 Git 두번째 이야기
제로부터시작하는 Git 두번째 이야기Mario Cho
 
Python Korea 2014년 6월 세미나 - Windows 환경에서 Python 개발환경 세팅하기
Python Korea 2014년 6월 세미나 - Windows 환경에서 Python 개발환경 세팅하기Python Korea 2014년 6월 세미나 - Windows 환경에서 Python 개발환경 세팅하기
Python Korea 2014년 6월 세미나 - Windows 환경에서 Python 개발환경 세팅하기Joongi Kim
 
도커 없이 컨테이너 만들기 2편
도커 없이 컨테이너 만들기 2편도커 없이 컨테이너 만들기 2편
도커 없이 컨테이너 만들기 2편Sam Kim
 
IoT with Raspberry Pi + Node JS - Chapter 1
IoT with Raspberry Pi + Node JS - Chapter 1IoT with Raspberry Pi + Node JS - Chapter 1
IoT with Raspberry Pi + Node JS - Chapter 1Park Jonggun
 

Similar to The beginner’s guide to 웹 크롤링 (스크래핑) (20)

Hyperledger farbric build your first network install and analysis
Hyperledger farbric   build your first network install and analysisHyperledger farbric   build your first network install and analysis
Hyperledger farbric build your first network install and analysis
 
HTTP 완벽가이드- 19장 배포시스템
HTTP 완벽가이드- 19장 배포시스템HTTP 완벽가이드- 19장 배포시스템
HTTP 완벽가이드- 19장 배포시스템
 
데이터 분석 1 - 소개
데이터 분석 1 - 소개데이터 분석 1 - 소개
데이터 분석 1 - 소개
 
JetsonTX2 Python
 JetsonTX2 Python  JetsonTX2 Python
JetsonTX2 Python
 
Hyperledger Explorer.pptx
Hyperledger Explorer.pptxHyperledger Explorer.pptx
Hyperledger Explorer.pptx
 
UNIX 시스템 2014-2018년 기말시험 기출문제
UNIX 시스템 2014-2018년 기말시험 기출문제UNIX 시스템 2014-2018년 기말시험 기출문제
UNIX 시스템 2014-2018년 기말시험 기출문제
 
Let'Swift 2023 Swift Macro, 어디다 쓰죠?
Let'Swift 2023 Swift Macro, 어디다 쓰죠?Let'Swift 2023 Swift Macro, 어디다 쓰죠?
Let'Swift 2023 Swift Macro, 어디다 쓰죠?
 
XE3 a부터 z까지(1) xe3 구조와 간단한 페이지 만들기
XE3 a부터 z까지(1) xe3 구조와 간단한 페이지 만들기XE3 a부터 z까지(1) xe3 구조와 간단한 페이지 만들기
XE3 a부터 z까지(1) xe3 구조와 간단한 페이지 만들기
 
Python 생태계의 이해
Python 생태계의 이해Python 생태계의 이해
Python 생태계의 이해
 
리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리
 
Endnote를 활용한 학술논문 검색법 기초x8
Endnote를 활용한 학술논문 검색법 기초x8Endnote를 활용한 학술논문 검색법 기초x8
Endnote를 활용한 학술논문 검색법 기초x8
 
XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기
XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기
XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기
 
200725 AWS 클라우드 컴퓨팅으로 배우는 생물정보학 - 덕성여대 강연
200725 AWS 클라우드 컴퓨팅으로 배우는 생물정보학 - 덕성여대 강연200725 AWS 클라우드 컴퓨팅으로 배우는 생물정보학 - 덕성여대 강연
200725 AWS 클라우드 컴퓨팅으로 배우는 생물정보학 - 덕성여대 강연
 
리얼리눅스 제 1 회 세미나: "리눅스, 제대로 알고 코딩하자!"
리얼리눅스 제 1 회 세미나: "리눅스, 제대로 알고 코딩하자!"리얼리눅스 제 1 회 세미나: "리눅스, 제대로 알고 코딩하자!"
리얼리눅스 제 1 회 세미나: "리눅스, 제대로 알고 코딩하자!"
 
Red Hat OpenStack 17 저자직강+스터디그룹_5주차
Red Hat OpenStack 17 저자직강+스터디그룹_5주차Red Hat OpenStack 17 저자직강+스터디그룹_5주차
Red Hat OpenStack 17 저자직강+스터디그룹_5주차
 
제로부터시작하는 Git 두번째 이야기
제로부터시작하는 Git 두번째 이야기제로부터시작하는 Git 두번째 이야기
제로부터시작하는 Git 두번째 이야기
 
Python Korea 2014년 6월 세미나 - Windows 환경에서 Python 개발환경 세팅하기
Python Korea 2014년 6월 세미나 - Windows 환경에서 Python 개발환경 세팅하기Python Korea 2014년 6월 세미나 - Windows 환경에서 Python 개발환경 세팅하기
Python Korea 2014년 6월 세미나 - Windows 환경에서 Python 개발환경 세팅하기
 
도커 없이 컨테이너 만들기 2편
도커 없이 컨테이너 만들기 2편도커 없이 컨테이너 만들기 2편
도커 없이 컨테이너 만들기 2편
 
Linux tutorial
Linux tutorialLinux tutorial
Linux tutorial
 
IoT with Raspberry Pi + Node JS - Chapter 1
IoT with Raspberry Pi + Node JS - Chapter 1IoT with Raspberry Pi + Node JS - Chapter 1
IoT with Raspberry Pi + Node JS - Chapter 1
 

The beginner’s guide to 웹 크롤링 (스크래핑)

  • 1. The beginner’s guide to 웹 크롤링 Web crawling 2015-10-23 Lucy Park me@lucypark.kr 스크래핑 (Scraping)
  • 3. 제 소개 • 박사과정 n년차 • 데이터마이닝 전공 • “Yak shaver” – 대한민국 정치의 모든 것(http://pokr.kr), KoNLPy(http://konlpy.org) 등을 만드는데 참여 • 현재는 졸업을 위해 칩거 중 3
  • 4. 목차 1. 초간단 손 스크래핑 2. 용어 정리: 크롤링? 스크래핑? 3. 파이썬 3분만에 시작하기 (초간단 문법) 4. 국회 회의록 스크래퍼 갖다 쓰기 5. 국회 회의록 스크래퍼 직접 만들어보기 참고자료 4
  • 5. 초간단 손 스크래핑! 3단계 1. Scrape하려는 웹페이지 목록 만들기 2. 웹페이지 전체 다운로드 받기 3. 웹페이지 parsing 5
  • 6. 초간단 손 스크래핑! 3단계 1. Scrape하려는 웹페이지 목록 만들기 (일단 네 개만) http://movie.naver.com/movie/bi/mi/basic.nhn?code=121048 http://movie.naver.com/movie/bi/mi/basic.nhn?code=129049 http://movie.naver.com/movie/bi/mi/basic.nhn?code=118917 http://movie.naver.com/movie/bi/mi/basic.nhn?code=114278 6
  • 7. 초간단 손 스크래핑! 3단계 1. Scrape하려는 웹페이지 목록 만들기 2. 웹페이지 목록 전체 다운로드 받기 7
  • 8. 초간단 손 스크래핑! 3단계 1. Scrape하려는 웹페이지 목록 만들기 2. 웹페이지 전체 다운로드 받기 3. 웹페이지 parsing 찾음! 8
  • 9. 그런데 긁고 싶은 페이지가 1000개라면? 9
  • 10. 옵션 1: 대학원생을 시킨다* * 이건 제가 대학원생이 아니었으면 못할 농담 10
  • 12. 목차 1. 초간단 손 스크래핑 2. 용어 정리: 크롤링? 스크래핑? 3. 파이썬 3분만에 시작하기 (초간단 문법) 4. 국회 회의록 스크래퍼 갖다 쓰기 5. 국회 회의록 스크래퍼 직접 만들어보기 참고자료 12
  • 13. 용어 정리 이미지 출처: https://en.wikipedia.org/wiki/Internet#/media/File:Internet_map_102 4_-_transparent,_inverted.png • 인터넷 (the Internet) – 네트워크의 네트워크 – 여러 기기 간 연결된 물리적 구조 (IoT!) 13
  • 14. 용어 정리 • 웹 (the Web, www, World Wide Web) – 인터넷 상에 존재하는 거대한 정보 공간 – 47.7억 개의 웹페이지낄 연결되어 있음 * http://www.worldwidewebsize.com/ 14
  • 15. 용어 정리 • 웹페이지 – 웹 상의 문서 15
  • 16. 용어 정리 • URL – Unique resource locator – 특정 웹페이지로 연결해주는 주소 – 일명 “링크” http://likms.assembly.go.kr/bill/jsp/BillDetail.jsp?bill_id=PRC_H1W5H1K0Z1M2G1Q0Q5I5T0O5H4O2H8 scheme host path query * 더 자세한 내용은 위키피디아에 https://en.wikipedia.org/wiki/Uniform_Resource_Locator 16
  • 17. 용어 정리 • 웹브라우저 – 주소창에 URL을 입력하면 웹페이지를 서버에 요청하고 서버로부터 받은 HTML을 해석해서 화면에 띄워주는 프로그램 17
  • 18. 용어 정리 • HTML (1/3) – Hypertext markup language – 웹페이지를 작성하는데 사용되는 마크업 언어 – 태그로 HTML 요소(element)를 만든다 – 일반적인 태그 구조: <태그명 속성명=“속성값” 다른속성명=“다른속성값”>텍스트</태그명> 18
  • 19. 용어 정리 • HTML (2/3) – 예시 파일: example.html <h1>제목</h1> <p>문단 하나</p> <p class=“special”>문단 둘</p> <p class=“special”>문단 셋</p> <a href=http://some.url.com/>링크</a> <br> <table id=“my-table” class=“table-condensed table-striped”> <tr><td>표</td><td>하나</td></tr> <tr><td>줄</td><td>둘</td></tr> </table> p 태그에 “special”이라는 값을 가진 class 속성이 추가된 HTML 요소 두 개 줄바꿈 태그 table 태그에 “my-table”이라는 값을 가진 id 속성과 table-condensed, table-striped의 두 가지 값을 가진 class 속성이 있는 HTML 요소 a 태그에 URL을 href 속성에 담고 있는 HTML 요소 19
  • 20. 용어 정리 • HTML (3/3) • 예시 파일: example.html 텍스트 에디터*로 열어서 본 example.html 웹 브라우저로 열어서 본 example.html * 메모장, Notepad++, Vim 등 텍스트 파일을 수정할 수 있는 프로그램. 화면 캡쳐에 있는 에디터는 Sublime Text 2 20
  • 21. 용어 정리 • HTTP – Hypertext transfer protocol – Hypertext로 작성된 웹문서를 주고 받는 통신 규약 응답 response 요청 request 내 컴퓨터 서버 21
  • 22. (좀 더 엄밀한) 용어 정리 • 크롤링 거미가 (spider) 거미줄을 (hyperlink) 기어다니듯(crawling) World Wide Web webpage hyperlink 22
  • 23. (좀 더 엄밀한) 용어 정리 • 스크래핑 – 정해진 형태의 웹페이지에서 원하는 데이터를 추출하는 작업 (속어: “긁기”) – 지금 우리가 하려는 것 암살,9.11,8.97 마션,8.73,8.41 인턴,9.04,8.98 리그레션,6.75,7.08 23
  • 24. 목차 1. 초간단 손 스크래핑 2. 용어 정리: 크롤링? 스크래핑? 3. 파이썬 3분만에 시작하기 (초간단 문법) 4. 국회 회의록 스크래퍼 갖다 쓰기 5. 국회 회의록 스크래퍼 직접 만들어보기 참고자료 24
  • 25. 패키지 설치 • R • Python* 25 install.packages(‘package_name’) pip install package_name * 단, 파이썬 쉘 밖에서 실행
  • 26. 패키지 사용 • R • Python 26 library(‘package_name’) import package_name
  • 27. 열 • R* • Python** 27 abc <- c(‘a’, ‘b’, ‘c’) abc <- append(abc, ‘d’) abc = [‘a’, ‘b’, ‘c’] abc.append(‘d’) * “vector”라 부름 ** “list”라 부름
  • 28. String concatenation 28 • R • Python paste(abc, collapse=‘ ‘) ‘ ‘.join(abc)
  • 29. String substitution • R • Python 29 sub(‘b’, ‘n’, ‘beat’) ‘beat’.replace(‘b’, ‘n’)
  • 30. 루프 (1/2) 30 • R • Python for (i in 1:4) { print(i) } for i in range(1,5): print(i)
  • 31. 루프 (2/2)* 31 • R • Python a <- 1:3 s <- sapply(a, function(x) x^2) print(sum(s)) a = range(1,4) s = [i**2 for i in a] print(sum(s)) * These two are not directly comparable. In R, apply is a very powerful function for looping. (Much frequently used than for loops.) On the other hand, in Python, list comprehensions are frequently used.
  • 32. 함수 32 • R • Python jiggle <- function(x) { return(x + 1) } def jiggle(x): return x + 1
  • 33. 파일 출력 33 • R • Python write(‘text’, file=‘textfile.txt’) f = open(‘textfile.txt’, ‘w’) f.write(‘text’) f.close()
  • 34. 목차 1. 초간단 손 스크래핑 2. 용어 정리: 크롤링? 스크래핑? 3. 파이썬 3분만에 시작하기 (초간단 문법) 4. 국회 회의록 스크래퍼 갖다 쓰기 5. 국회 회의록 스크래퍼 직접 만들어보기 참고자료 34
  • 35. 팀포퐁의 국회 회의록 스크래퍼 35 https://github.com/teampopong/crawlers/blob/master/meetings/crawl.py
  • 36. 3단계 간단 사용법 1. crawl.py 파일 다운로드 (또는 복사/붙이기) 2. 명령프롬프트에서 python crawl.py 로 스크립트 실행 36
  • 37. 3단계 간단 사용법 1. crawl.py 파일 다운로드 (또는 복사/붙이기) 2. 명령프롬프트에서 python crawl.py 로 스크립트 실행 3. 다운로드 받은 파일 확인 37
  • 38. PDF 문서에서 텍스트 추출 • pdf2htmlEX – PDF를 텍스트로 변환 – 다운로드 (윈도우) 38
  • 41. 목차 1. 초간단 손 스크래핑 2. 용어 정리: 크롤링? 스크래핑? 3. 파이썬 3분만에 시작하기 (초간단 문법) 4. 국회 회의록 스크래퍼 갖다 쓰기 5. 국회 회의록 스크래퍼 직접 만들어보기 참고자료 41
  • 42. 좀 더 똑똑하고(?) 편한(?) 방법 42 http://pokr.kr/meeting/?date=2012-12-31
  • 43. 구조화가 잘 되어 있는 pokr.kr 데이터 스크래핑 43 http://pokr.kr/meeting/19309244267/dialog
  • 44. 페이지 요소 검사 44 좋은 도구. 이 포인터를 이용해서 웹페이지를 클릭하면 해당 HTML 요소를 찾아준다. 우리가 크롤링하고 싶은 곳
  • 45. 페이지 요소 검사 45 우리가 크롤링하고 싶은 곳 class 속성값이 “dialogue”인 div 안에 class 속성값이 “statement”, “issue”, “time” 등인 div가 여러 개 들어 있다! (그 div 안의 div가 각각 발언, 안건, 시간 cell 하나)
  • 46. 페이지 요소 검사 46 발언 하나 부분 확대 발언자 발언내용 class 속성값이 “statement”인 div 안에 class 속성값이 “speaker”, “content” 등인 div가 여러 개 들어 있다!
  • 47. 파싱 (parsing) • HTML 문서는 기본적으로 tree 형태이다. • 방금 전에도: 47 1. class 속성값이 “dialogue”인 div 안에 class 속성값이 “statement”, “issue”, “time” 등인 div가 여러 개 들어 있다 2. class 속성값이 “statement”인 div 안에 class 속성값이 “speaker”, “content” 등인 div가 여러 개 들어 있다!
  • 48. 파싱 (parsing) • HTML 문서는 기본적으로 tree 형태이다. • 방금 전에도: 48 <div> class:dialogue <div> class:statement <div> class:issue <div> class:time <div> class:statement <div> class:speaker <div> class:content … … root
  • 49. XPath 소개 • HTML (또는 XML)을 파싱할때 사용하는 문법 49 root.xpath(‘.//div’) root 밑에서 모든 div를 찾아라
  • 50. XPath 소개 • HTML (또는 XML)을 파싱할때 사용하는 문법 50 root.xpath(‘.//div[@class=“dialogue”]’) root 밑에서 class 속성값이 “dialogue”인 모든 div를 찾아라
  • 51. XPath 소개 • HTML (또는 XML)을 파싱할때 사용하는 문법 51 root.xpath(‘.//div[@class=“dialogue”]/div’) root 밑에서 class 속성값이 “dialogue”인 모든 div를 찾고 그 바로 하위에 있는 모든 div를 찾아라 참고: • 슬래시 한 번 (/): 바로 하위의 • 슬래시 두 번 (//): 모든 하위의
  • 52. XPath 소개 • HTML (또는 XML)을 파싱할때 사용하는 문법 52 root.xpath(‘.//div[@class=“dialogue”]/div[@class=“statement”]’) root 밑에서 class 속성값이 “dialogue”인 모든 div를 찾고 그 바로 하위에서 class 속성값이 “statement”인 모든 div를 찾아라 참고: • 슬래시 한 번 (/): 바로 하위의 • 슬래시 두 번 (//): 모든 하위의
  • 53. XPath + Python 53 # statements라는 변수에 xpath 넣기 statements = root.xpath(‘.//div[@class=“dialogue”]/div[@class=“statement”]’)
  • 54. XPath + Python 54 # statements라는 변수에 xpath 넣기 statements = root.xpath(‘.//div[@class=“dialogue”]/div[@class=“statement”]’) # 각각의 statement에서 speaker, content 정보 추출하기 for statement in statements: speaker = statement.xpath(‘./div[@class=“speaker”]/div[@class=“person-name”]/text()’)[0] content = ‘ ‘.join(statement.xpath(‘./div[@class=“content glossary”]/text()’))
  • 55. XPath + Python 55 # statements라는 변수에 xpath 넣기 statements = root.xpath(‘.//div[@class=“dialogue”]/div[@class=“statement”]’) # 각각의 statement에서 speaker, content 정보 추출하고 newline 제거 후 rows라는 list에 넣기 rows = [] for statement in statements: speaker = statement.xpath(‘./div[@class=“speaker”]/div[@class=“person-name”]/text()’)[0] content = ‘ ‘.join(statement.xpath(‘./div[@class=“content glossary”]/text()’)) content = content.replace(‘n’, ‘ ‘).strip() rows.append([speaker, content])
  • 56. XPath + Python 56 # statements라는 변수에 xpath 넣기 statements = root.xpath(‘.//div[@class=“dialogue”]/div[@class=“statement”]’) # 각각의 statement에서 speaker, content 정보 추출하고 newline 제거 후 rows라는 list에 넣기 rows = [] for statement in statements: speaker = statement.xpath(‘./div[@class=“speaker”]/div[@class=“person-name”]/text()’)[0] content = ‘ ‘.join(statement.xpath(‘./div[@class=“content glossary”]/text()’)) content = content.replace(‘n’, ‘ ‘).strip() rows.append([speaker, content]) # 파일에 저장 f = open(‘statements.txt’, ‘w’) f.write(‘n’.join(‘t’.join(row) for row in rows)) f.close()
  • 57. XPath + Python 57 # statements라는 변수에 xpath 넣기 statements = root.xpath(‘.//div[@class=“dialogue”]/div[@class=“statement”]’) # 각각의 statement에서 speaker, content 정보 추출하고 newline 제거 후 rows라는 list에 넣기 rows = [] for statement in statements: speaker = statement.xpath(‘./div[@class=“speaker”]/div[@class=“person-name”]/text()’)[0] content = ‘ ‘.join(statement.xpath(‘./div[@class=“content glossary”]/text()’)) content = content.replace(‘n’, ‘ ‘).strip() rows.append([speaker, content]) # 파일에 저장 f = open(‘statements.txt’, ‘w’) f.write(‘n’.join(‘t’.join(row) for row in rows)) f.close()
  • 58. 결과물 확인 58 전체 파싱 코드: https://gist.github.com/e9t/556fed5ae4d9bda6f1d8#file-parse-py
  • 59. 이제 끝났습니다! • 어, 근데 한가지가 빠졌네요. • URL 목록은 어떻게 받을 수 있을까요? • 숙제입니다…+_+ 59
  • 60. 60
  • 61. 참고자료: 스크래퍼 • 박은정, Scraping from the Web • 강철, 30분만에 따라하는 동시성 스크래퍼, PyCon Korea, 2014. 61
  • 62. 참고자료: 파이썬 • 박은정, Introduction to Python (on Windows) • 김태훈, 140분의 파이썬 • 질의 응답: 파이썬 코리아 https://www.facebook.com/groups/pythonkorea/ 62