GDG DevFest
Python/MySQL을 활용한 대용량 데이터 수집
최 종 원
Data Engineer
github.com/lastone9182
notes.jongwony.com
Intro
­ Jongwon Choi
“학습이 되지 않은 인공지능은 갓난아기나 다름없다.”
환경에 따라 성장한 사람의 성격이 다르고
좋은 요리는 좋은 재료가 만들어내듯
데이터의 양과 질에 따라 분석 결과가 달라질 수 있습니다.
문화가 진화하기 위해서는 “실패하는” 행동은 사라지고
“성공적인”행동들이 모방된다는 것이 전부입니다.
게임이론: 상호작용을 통한 진화
데이터가 있어야
분석을 하고
학습을 하지
MNIST 데이터는
어떻게 만들어졌나?
데이터는 하늘에서 떨어진 것이 아닙니다.
이런 데이터들이 모여
이렇게 압축된 데이터를
웹에서 가져옵니다
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/
contrib/learn/python/learn/datasets/mnist.py
예제는 실제로 정제되고 압축된 데이터를 대상으로 합니다.
어떻게 수집할 것인가
파일, 이미지, 음성 등의 데이터를
API, 웹페이지 등을 통해서
데이터 셋으로 얻는 형태와 방법은 매우 다양합니다
하나의 프로그램으로 모든 상황을 해결해 주진 않습니다.
적어도 투자한 비용 및 시간의 효율을 생각하면 말이죠…
블로그/게시판 크롤링
How To
•주의사항
•설계
•Selenium Headless
•수집을 위한 데이터베이스 사용법
•AWS로 병렬 수집하기
•Appendix
주의사항
크롤링에 정답은 없습니다만…
크롤링의 합법성
창과 방패는 상대를 모르는 쪽이 지기 마련입니다
타이밍(sleep)이 가장 중요합니다
서버가 로그분석하는 것이 빠를까요
우리가 코딩을 끝내는 것이 빠를까요
설계
탁상공론을 시작해 봅시다
설계 시 고려할 점
•에러캐치
•단순하게
•복잡하게
에러캐치
•Critical
•Unknown
•이 외에는 발견될 때마다 잡아줍니다
단순하게
닭 잡는 데 소 잡는 칼을 쓸 필요는 없습니다
Basic Step(page)
Request
Query
Basic Step(depth)
Request
Query
Each row
복잡하게
병렬수집은 돈이 많이 듭니다
Key Point
Query
Each row
(?)
Hadoop을 사용하거나 Queue를 사용하는 등
여러가지 병렬 수집 방법이 있지만
데이터베이스 성질로 접근해 보았습니다.
Quiz!
Atomicity Consistency
Isolation Durability
Atomicity Consistency
Isolation Durability
모두 중요하지만…
데이터 무결성
데이터를 정확하게 가져왔는지
가져온 데이터에 중복은 없는지
이제 구현을 해봅시다
Selenium
The Automates browsers
웹 테스트 목적 → 웹 자동화 도구
Example
Chrome headless
•Chrome 웹 드라이버를 사용
•headless 옵션 GUI 환경이 아
니어도 실행 가능
•800x600 가상 모니터를 만들
고(Xvfb) 같은 작업을 합니다
Ajax 요청도 가능합니다
병렬 수집
언제 다 수집하나…
데이터베이스 Lock
데이터베이스를 공유 자료구조로
Isolation Level
•READ UNCOMMITTED
•READ COMMITTED
•REPEATABLE READ - MySQL default
•SERIALIZABLE - 병렬 수집에 사용
STATUS column
NULL pending OK
Key Point
URL STATUS
url 1 OK
url 2 OK
url 3 pending
url 4 pending

url 5 pending
url 6
url 7
url 8
… …
Query
Each row
컬럼 수와 에러 발생율은 비례합니다
SELECT FOR UPDATE
트랜잭션 종료 시까지 다른 세션은 SELECT 불가
잘못 사용하면 독이 됩니다
EXAMPLE
Amazon Web Services
20개의 인스턴스와 하나의 데이터베이스
IAM EC2 RDS
Boto3
클라우드를 한낱 리모컨으로
Basic Step
•IAM을 통해 아마존 서비스를 프로그래밍으로 다루는 권한을
부여
•Python Boto3 라이브러리로 제어
•GitHub README를 참조하세요
•https://github.com/lastone9182/gdg-devfest-
crawl-171021
Crontab만 자동화가 아닙니다
•부팅 시 실행되는 스크립트 rc.local, 서비스 systemd
•중앙 인스턴스 1개가 나머지 인스턴스를 알아서 제어하는 마
법
•IP가 부팅 시마다 바뀌는 건 덤!
Instance Control
Central Auxiliaryon/off
Appendix
시간이 남을 것 같아서 TIP을 준비해 봤습니다.
Web Element 선택
⌘(Ctrl) + ⇧(Shift) + C + (Click)
→ Copy Selector, Xpath
수집하면서 분석하려 하지 마세
요
데이터의 추출은 최소화
페이지 전체를 저장 후 파싱
중복, GroupBy, Join…
가공된 데이터가 아닌데
데이터베이스에서 조인하신다구요?
Pandas!
SELECT 쿼리로 전부 가져온 다음
가공해서 새 테이블로 저장하는 것을 추천합니다
스키마를 건드리는 순간 쿼리문, 머리, 코딩이 복잡해집니다…
전처리가 중요합니다.
데이터를 잘 가져오는 지 꾸준히 확인해 보세요
버그 예방의 지름길
라이브러리에 함정코드가?
Tesseract OCR
https://github.com/madmaze/pytesseract/pytesseract.py
텔레그램 봇, 슬랙 봇
데이터 수집 알림의 혁명
Summary
RequestList
URL STATUS
URL HTML
크롤링에 정답은 없습니다
데이터 분석은
이제 시작입니다
새로운 기술이 쏟아져도
결국 기초 위에서 이루어진 것들입니다.
감사합니다.
Reference
•게임이론: 신뢰의 진화
•Tensorflow github
•Web Scraping with Python
•Innodb transaction isolation levels
•Boto3 docs
•사용된 Icon
Source
•https://github.com/lastone9182/gdg-devfest-
crawl-171021

Python MySQL을 활용한 대용량 데이터 수집