Advertisement

More Related Content

Slideshows for you(20)

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

Advertisement
Advertisement

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

  1. The beginner’s guide to 웹 크롤링 Web crawling 2015-10-23 Lucy Park me@lucypark.kr 스크래핑 (Scraping)
  2. 어젯밤 자료를 열심히 만들다가 생긴 일
  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
  11. 옵션 2: 컴퓨터를 시킨다 낙찰! 11
  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
  39. PDF 문서에서 텍스트 추출 39
  40. 파싱은 이하 생략…
  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
Advertisement