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

62
The beginner’s guide to 웹 웹웹웹 Web crawling 2015-10-23 Lucy Park [email protected] 스스스스 (Scraping)

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

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

The beginner’s guide to웹 크롤링Web crawling

2015-10-23

Lucy [email protected]

스크래핑(Scraping)

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

어젯밤자료를 열심히 만들다가 생긴 일

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

3

제 소개• 박사과정 n 년차• 데이터마이닝 전공• “Yak shaver”– 대한민국 정치의 모든 것 (http://pokr.kr), KoNLPy(

http://konlpy.org) 등을 만드는데 참여• 현재는 졸업을 위해 칩거 중

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

4

목차1. 초간단 손 스크래핑2. 용어 정리 : 크롤링 ? 스크래핑 ?

3. 파이썬 3 분만에 시작하기 ( 초간단 문법 )

4. 국회 회의록 스크래퍼 갖다 쓰기5. 국회 회의록 스크래퍼 직접 만들어보기

참고자료

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

5

초간단 손 스크래핑 ! 3 단계1. Scrape 하려는 웹페이지 목록 만들기2. 웹페이지 전체 다운로드 받기3. 웹페이지 parsing

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

6

초간단 손 스크래핑 ! 3 단계1. Scrape 하려는 웹페이지 목록 만들기

( 일단 네 개만 )

http://movie.naver.com/movie/bi/mi/basic.nhn?code=121048http://movie.naver.com/movie/bi/mi/basic.nhn?code=129049http://movie.naver.com/movie/bi/mi/basic.nhn?code=118917http://movie.naver.com/movie/bi/mi/basic.nhn?code=114278

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

7

초간단 손 스크래핑 ! 3 단계1. Scrape 하려는 웹페이지 목록 만들기2. 웹페이지 목록 전체 다운로드 받기

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

8

초간단 손 스크래핑 ! 3 단계1. Scrape 하려는 웹페이지 목록 만들기2. 웹페이지 전체 다운로드 받기3. 웹페이지 parsing

찾음 !

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

9

그런데 긁고 싶은 페이지가 1000 개라면 ?

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

10

옵션 1:대학원생을 시킨다 *

* 이건 제가 대학원생이 아니었으면 못할 농담

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

11

옵션 2:컴퓨터를 시킨다 낙찰 !

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

12

목차1. 초간단 손 스크래핑2. 용어 정리 : 크롤링 ? 스크래핑 ?

3. 파이썬 3 분만에 시작하기 ( 초간단 문법 )

4. 국회 회의록 스크래퍼 갖다 쓰기5. 국회 회의록 스크래퍼 직접 만들어보기

참고자료

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

13

용어 정리

이미지 출처 : https://en.wikipedia.org/wiki/Internet#/media/File:Internet_map_1024_-_transparent,_inverted.png

• 인터넷 (the Internet)–네트워크의 네트워크–여러 기기 간 연결된 물리적 구조 (IoT!)

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

14

용어 정리• 웹 (the Web, www, World Wide Web)–인터넷 상에 존재하는 거대한 정보 공간– 47.7 억 개의 웹페이지낄 연결되어 있음

* http://www.worldwidewebsize.com/

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

15

용어 정리• 웹페이지–웹 상의 문서

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

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

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

17

용어 정리• 웹브라우저–주소창에 URL 을 입력하면 웹페이지를 서버에 요청하고 서버로부터 받은 HTML 을 해석해서 화면에 띄워주는 프로그램

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

18

용어 정리• HTML (1/3)– Hypertext markup language–웹페이지를 작성하는데 사용되는 마크업 언어–태그로 HTML 요소 (element) 를 만든다–일반적인 태그 구조 :

< 태그명 속성명 =“ 속성값” 다른속성명 =“ 다른속성값” > 텍스트 </ 태그명 >

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

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 요소

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

20

용어 정리• HTML (3/3)• 예시 파일 : example.html

텍스트 에디터 * 로 열어서 본example.html

웹 브라우저로 열어서 본 example.html

* 메모장 , Notepad++, Vim 등 텍스트 파일을 수정할 수 있는 프로그램 . 화면 캡쳐에 있는 에디터는 Sublime Text 2

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

21

용어 정리• HTTP– Hypertext transfer protocol– Hypertext 로 작성된 웹문서를 주고 받는 통신 규약

응답response

요청request

내 컴퓨터 서버

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

22

( 좀 더 엄밀한 ) 용어 정리• 크롤링 거미가 (spider) 거미줄을 (hyperlink) 기어다니듯 (crawling)

World Wide Web

webpagehyperlink

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

23

( 좀 더 엄밀한 ) 용어 정리• 스크래핑–정해진 형태의 웹페이지에서 원하는 데이터를 추출하는 작업 ( 속어 : “ 긁기” )–지금 우리가 하려는 것

암살 ,9.11,8.97 마션 ,8.73,8.41 인턴 ,9.04,8.98 리그레션 ,6.75,7.08

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

24

목차1. 초간단 손 스크래핑2. 용어 정리 : 크롤링 ? 스크래핑 ?

3. 파이썬 3 분만에 시작하기 ( 초간단 문법 )

4. 국회 회의록 스크래퍼 갖다 쓰기5. 국회 회의록 스크래퍼 직접 만들어보기

참고자료

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

25

패키지 설치• R

• Python*

install.packages(‘package_name’)

pip install package_name

* 단 , 파이썬 쉘 밖에서 실행

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

26

패키지 사용• R

• Python

library(‘package_name’)

import package_name

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

27

열• R*

• Python**

abc <- c(‘a’, ‘b’, ‘c’)abc <- append(abc, ‘d’)

abc = [‘a’, ‘b’, ‘c’]abc.append(‘d’)

* “vector” 라 부름** “list” 라 부름

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

28

String concatenation

• R

• Python

paste(abc, collapse=‘ ‘)

‘ ‘.join(abc)

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

29

String substitution

• R

• Python

sub(‘b’, ‘n’, ‘beat’)

‘beat’.replace(‘b’, ‘n’)

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

30

루프 (1/2)

• R

• Python

for (i in 1:4) { print(i)}

for i in range(1,5): print(i)

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

31

루프 (2/2)*

• R

• Python

a <- 1:3s <- 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.

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

32

함수• R

• Python

jiggle <- function(x) { return(x + 1)}

def jiggle(x): return x + 1

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

33

파일 출력• R

• Python

write(‘text’, file=‘textfile.txt’)

f = open(‘textfile.txt’, ‘w’)f.write(‘text’)f.close()

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

34

목차1. 초간단 손 스크래핑2. 용어 정리 : 크롤링 ? 스크래핑 ?

3. 파이썬 3 분만에 시작하기 ( 초간단 문법 )

4. 국회 회의록 스크래퍼 갖다 쓰기5. 국회 회의록 스크래퍼 직접 만들어보기

참고자료

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

35

팀포퐁의 국회 회의록 스크래퍼

https://github.com/teampopong/crawlers/blob/master/meetings/crawl.py

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

36

3 단계 간단 사용법1. crawl.py 파일 다운로드 ( 또는 복사 / 붙이기 )2. 명령프롬프트에서 python crawl.py 로 스크립트 실행

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

37

3 단계 간단 사용법1. crawl.py 파일 다운로드 ( 또는 복사 / 붙이기 )2. 명령프롬프트에서 python crawl.py 로 스크립트 실행3. 다운로드 받은 파일 확인

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

38

PDF 문서에서 텍스트 추출• pdf2htmlEX– PDF 를 텍스트로 변환–다운로드 ( 윈도우 )

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

39

PDF 문서에서 텍스트 추출

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

파싱은 이하 생략…

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

41

목차1. 초간단 손 스크래핑2. 용어 정리 : 크롤링 ? 스크래핑 ?

3. 파이썬 3 분만에 시작하기 ( 초간단 문법 )

4. 국회 회의록 스크래퍼 갖다 쓰기5. 국회 회의록 스크래퍼 직접 만들어보기

참고자료

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

42

좀 더 똑똑하고 (?) 편한 (?) 방법

http://pokr.kr/meeting/?date=2012-12-31

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

43

구조화가 잘 되어 있는 pokr.kr 데이터 스크래핑

http://pokr.kr/meeting/19309244267/dialog

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

44

페이지 요소 검사 좋은 도구 .이 포인터를 이용해서 웹페이지를 클릭하면 해당 HTML 요소를 찾아준다 .

우리가 크롤링하고 싶은 곳

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

45

페이지 요소 검사

우리가 크롤링하고 싶은 곳

class 속성값이 “ dialogue” 인 div 안에class 속성값이 “statement”, “issue”, “time” 등인 div 가 여러 개 들어 있다 !

( 그 div 안의 div 가 각각 발언 , 안건 , 시간 cell 하나 )

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

46

페이지 요소 검사

발언 하나 부분확대

발언자

발언내용

class 속성값이 “ statement” 인 div 안에class 속성값이 “speaker”, “content” 등인 div 가 여러 개 들어 있다 !

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

47

파싱 (parsing)

• HTML 문서는 기본적으로 tree 형태이다 .• 방금 전에도 :

1. class 속성값이 “ dialogue” 인 div 안에 class 속성값이 “ statement”, “issue”, “time” 등인 div 가 여러 개 들어 있다2. class 속성값이 “ statement” 인 div 안에 class 속성값이 “ speaker”, “content” 등인 div 가 여러 개 들어 있다 !

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

48

파싱 (parsing)

• HTML 문서는 기본적으로 tree 형태이다 .• 방금 전에도 :

<div>class:dialogue

<div>class:statement

<div>class:issue

<div>class:time

<div>class:statement

<div>class:speaker

<div>class:content

…root

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

49

XPath 소개• HTML ( 또는 XML) 을 파싱할때 사용하는 문법

root.xpath(‘.//div’)

root 밑에서 모든 div 를 찾아라

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

50

XPath 소개• HTML ( 또는 XML) 을 파싱할때 사용하는 문법root.xpath(‘.//div[@class=“dialogue”]’)

root 밑에서 class 속성값이 “ dialogue” 인 모든 div 를 찾아라

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

51

XPath 소개• HTML ( 또는 XML) 을 파싱할때 사용하는 문법root.xpath(‘.//div[@class=“dialogue”]/div’)

root 밑에서 class 속성값이 “ dialogue” 인 모든 div 를 찾고그 바로 하위에 있는 모든 div 를 찾아라

참고 : • 슬래시 한 번 (/): 바로 하위의• 슬래시 두 번 (//): 모든 하위의

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

52

XPath 소개• HTML ( 또는 XML) 을 파싱할때 사용하는 문법root.xpath(‘.//div[@class=“dialogue”]/div[@class=“statement”]’)

root 밑에서 class 속성값이 “ dialogue” 인 모든 div 를 찾고그 바로 하위에서 class 속성값이 “ statement” 인 모든 div 를 찾아라

참고 : • 슬래시 한 번 (/): 바로 하위의• 슬래시 두 번 (//): 모든 하위의

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

53

XPath + Python# statements 라는 변수에 xpath 넣기statements = root.xpath(‘.//div[@class=“dialogue”]/div[@class=“statement”]’)

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

54

XPath + Python# 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()’))

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

55

XPath + Python# 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])

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

56

XPath + Python# 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()

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

57

XPath + Python# 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()

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

59

이제 끝났습니다 !

• 어 , 근데 한가지가 빠졌네요 .• URL 목록은 어떻게 받을 수 있을까요 ?

• 숙제입니다… +_+

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

60

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

61

참고자료 : 스크래퍼• 박은정 , Scraping from the Web• 강철 , 30분만에 따라하는 동시성 스크래퍼,

PyCon Korea, 2014.

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

62

참고자료 : 파이썬• 박은정 , Introduction to Python (on Windows)• 김태훈 , 140분의 파이썬

• 질의 응답 : 파이썬 코리아 https://www.facebook.com/groups/pythonkorea/