python mysql을 활용한 대용량 데이터 수집

61
GDG DevFest Python/MySQL을 활용한 대용량 데이터 수집

Upload: jongwon

Post on 22-Jan-2018

273 views

Category:

Engineering


1 download

TRANSCRIPT

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

GDG�DevFestPython/MySQL을�활용한�대용량�데이터�수집

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

최�종�원Data�Engineer�

github.com/lastone9182�

notes.jongwony.com

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

Intro

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

­�Jongwon�Choi

“학습이�되지�않은�인공지능은�갓난아기나�다름없다.”�

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

환경에�따라�성장한�사람의�성격이�다르고�좋은�요리는�좋은�재료가�만들어내듯�

데이터의�양과�질에�따라�분석�결과가�달라질�수�있습니다.

문화가�진화하기�위해서는�“실패하는”�행동은�사라지고�“성공적인”행동들이�모방된다는�것이�전부입니다.

게임이론:�상호작용을�통한�진화

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

데이터가�있어야�분석을�하고�학습을�하지

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

MNIST�데이터는�어떻게�만들어졌나?

데이터는 하늘에서 떨어진 것이 아닙니다.

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

이런�데이터들이�모여

이렇게�압축된�데이터를�

웹에서�가져옵니다

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/learn/python/learn/datasets/mnist.py

예제는 실제로 정제되고 압축된 데이터를 대상으로 합니다.

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

어떻게�수집할�것인가

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

파일,�이미지,�음성�등의�데이터를�API,�웹페이지�등을�통해서�

데이터�셋으로�얻는�형태와�방법은�매우�다양합니다하나의�프로그램으로�모든�상황을�해결해�주진�않습니다.

적어도�투자한�비용�및�시간의�효율을�생각하면�말이죠…

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

블로그/게시판�크롤링

Page 12: Python MySQL을 활용한 대용량 데이터 수집
Page 13: Python MySQL을 활용한 대용량 데이터 수집

How�To

•주의사항�

•설계�

•Selenium�Headless�

•수집을�위한�데이터베이스�사용법�

•AWS로�병렬�수집하기�

•Appendix

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

주의사항크롤링에�정답은�없습니다만…

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

크롤링의�합법성창과�방패는�상대를�모르는�쪽이�지기�마련입니다

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

타이밍(sleep)이�가장�중요합니다

서버가�로그분석하는�것이�빠를까요�우리가�코딩을�끝내는�것이�빠를까요

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

설계탁상공론을�시작해�봅시다

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

설계�시�고려할�점

•에러캐치�

•단순하게�

•복잡하게

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

에러캐치

•Critical�

•Unknown�

•이�외에는�발견될�때마다�잡아줍니다

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

단순하게닭�잡는�데�소�잡는�칼을�쓸�필요는�없습니다

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

Basic�Step(page)

Request

Query

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

Basic�Step(depth)

Request

Query

Each row

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

복잡하게병렬수집은�돈이�많이�듭니다

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

Key�Point

Query

Each row(?)

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

Hadoop을�사용하거나�Queue를�사용하는�등�여러가지�병렬�수집�방법이�있지만

데이터베이스�성질로�접근해�보았습니다.

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

Quiz!

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

Atomicity�Consistency�Isolation�Durability

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

Atomicity�Consistency�Isolation�Durability

모두�중요하지만…

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

데이터�무결성데이터를�정확하게�가져왔는지�가져온�데이터에�중복은�없는지

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

이제�구현을�해봅시다

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

SeleniumThe�Automates�browsers

웹�테스트�목적�→�웹�자동화�도구

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

Example

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

Chrome�headless

•Chrome�웹�드라이버를�사용�

•headless�옵션�GUI�환경이�아니어도�실행�가능�

•800x600�가상�모니터를�만들고(Xvfb)�같은�작업을�합니다

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

Ajax�요청도�가능합니다

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

병렬�수집언제�다�수집하나…

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

데이터베이스�Lock데이터베이스를�공유�자료구조로

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

Isolation�Level

•READ�UNCOMMITTED�

•READ�COMMITTED�

•REPEATABLE�READ�-�MySQL�default�

•SERIALIZABLE�-�병렬�수집에�사용

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

STATUS�columnNULL�pending�OK

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

Key�Point

URL STATUSurl 1 OKurl 2 OKurl 3 pendingurl 4 pendingurl 5 pendingurl 6url 7url 8… …

Query

Each row

컬럼�수와�에러�발생율은�비례합니다

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

SELECT�FOR�UPDATE트랜잭션�종료�시까지�다른�세션은�SELECT�불가

잘못�사용하면�독이�됩니다

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

EXAMPLE

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

Amazon�Web�Services20개의�인스턴스와�하나의�데이터베이스�

IAM�EC2�RDS

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

Boto3클라우드를�한낱�리모컨으로

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

Basic�Step

•IAM을�통해�아마존�서비스를�프로그래밍으로�다루는�권한을�부여�

•Python�Boto3�라이브러리로�제어�

•GitHub�README를�참조하세요�

•https://github.com/lastone9182/gdg-devfest-crawl-171021

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

Crontab만�자동화가�아닙니다

•부팅�시�실행되는�스크립트�rc.local,�서비스�systemd�

•중앙�인스턴스�1개가�나머지�인스턴스를�알아서�제어하는�마법�

•IP가�부팅�시마다�바뀌는�건�덤!

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

Instance�Control

Central Auxiliaryon/off

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

Appendix시간이�남을�것�같아서�TIP을�준비해�봤습니다.

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

Web�Element�선택⌘(Ctrl)�+�⇧(Shift) + C + (Click)

→ Copy Selector, Xpath

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

수집하면서�분석하려�하지�마세요

데이터의�추출은�최소화�페이지�전체를�저장�후�파싱

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

중복,�GroupBy,�Join…�가공된�데이터가�아닌데�

데이터베이스에서�조인하신다구요?

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

Pandas!

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

SELECT�쿼리로�전부�가져온�다음�가공해서�새�테이블로�저장하는�것을�추천합니다

스키마를�건드리는�순간�쿼리문,�머리,�코딩이�복잡해집니다…

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

전처리가�중요합니다.데이터를�잘�가져오는�지�꾸준히�확인해�보세요

버그�예방의�지름길

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

라이브러리에�함정코드가?

Tesseract�OCR�https://github.com/madmaze/pytesseract/pytesseract.py

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

텔레그램�봇,�슬랙�봇데이터�수집�알림의�혁명

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

Summary

RequestList

URL STATUS

URL HTML

크롤링에�정답은�없습니다

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

데이터�분석은�이제�시작입니다

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

새로운�기술이�쏟아져도�결국�기초�위에서�이루어진�것들입니다.

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

감사합니다.

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

Reference

•게임이론:�신뢰의�진화�

•Tensorflow�github�

•Web�Scraping�with�Python�

•Innodb�transaction�isolation�levels�

•Boto3�docs�

•사용된�Icon