SlideShare a Scribd company logo
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

More Related Content

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

(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례Jeongsang Baek
 
스타트업사례로 본 로그 데이터분석 : Tajo on AWS
스타트업사례로 본 로그 데이터분석 : Tajo on AWS스타트업사례로 본 로그 데이터분석 : Tajo on AWS
스타트업사례로 본 로그 데이터분석 : Tajo on AWSGruter
 
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020 AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020 AWSKRUG - AWS한국사용자모임
 
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020Jinwoong Kim
 
NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신
NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신
NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신Sungwoo Choo
 
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신NAVER D2
 
Elastic Search Performance Optimization - Deview 2014
Elastic Search Performance Optimization - Deview 2014Elastic Search Performance Optimization - Deview 2014
Elastic Search Performance Optimization - Deview 2014Gruter
 
[PYCON Korea 2018] Python Application Server for Recommender System
[PYCON Korea 2018] Python Application Server for Recommender System [PYCON Korea 2018] Python Application Server for Recommender System
[PYCON Korea 2018] Python Application Server for Recommender System Kwangseob Kim
 
[PYCON Korea 2018] Python Application Server for Recommender System
[PYCON Korea 2018] Python Application Server for Recommender System [PYCON Korea 2018] Python Application Server for Recommender System
[PYCON Korea 2018] Python Application Server for Recommender System Kwangseob Kim
 
Realtime Big data Anaytics and Exampes of Daum (2013)
Realtime Big data Anaytics and Exampes of Daum (2013)Realtime Big data Anaytics and Exampes of Daum (2013)
Realtime Big data Anaytics and Exampes of Daum (2013)Channy Yun
 
Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기Inho Kwon
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용중선 곽
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)Dong Chan Shin
 
성공적인 게임 런칭을 위한 비밀의 레시피 #3
성공적인 게임 런칭을 위한 비밀의 레시피 #3성공적인 게임 런칭을 위한 비밀의 레시피 #3
성공적인 게임 런칭을 위한 비밀의 레시피 #3Amazon Web Services Korea
 
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트Dae Kim
 
게임 랭킹 ( Game Leader Board )
게임 랭킹 ( Game Leader Board )게임 랭킹 ( Game Leader Board )
게임 랭킹 ( Game Leader Board )ssuserda2e71
 
레가시 프로젝트의 빌드 자동화
레가시 프로젝트의 빌드 자동화레가시 프로젝트의 빌드 자동화
레가시 프로젝트의 빌드 자동화Jaehoon Choi
 
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기Miyu Park
 

Similar to Python MySQL을 활용한 대용량 데이터 수집 (20)

(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
 
7. html5 api
7. html5 api7. html5 api
7. html5 api
 
스타트업사례로 본 로그 데이터분석 : Tajo on AWS
스타트업사례로 본 로그 데이터분석 : Tajo on AWS스타트업사례로 본 로그 데이터분석 : Tajo on AWS
스타트업사례로 본 로그 데이터분석 : Tajo on AWS
 
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020 AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020
 
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020
 
NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신
NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신
NAVER 오픈세미나 대구 (2014.08.01) - 오픈소스 라이브러리를 활용한 네이티브 어플리케이션의 데이터 저장과 통신
 
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
 
Elastic Search Performance Optimization - Deview 2014
Elastic Search Performance Optimization - Deview 2014Elastic Search Performance Optimization - Deview 2014
Elastic Search Performance Optimization - Deview 2014
 
[PYCON Korea 2018] Python Application Server for Recommender System
[PYCON Korea 2018] Python Application Server for Recommender System [PYCON Korea 2018] Python Application Server for Recommender System
[PYCON Korea 2018] Python Application Server for Recommender System
 
[PYCON Korea 2018] Python Application Server for Recommender System
[PYCON Korea 2018] Python Application Server for Recommender System [PYCON Korea 2018] Python Application Server for Recommender System
[PYCON Korea 2018] Python Application Server for Recommender System
 
Realtime Big data Anaytics and Exampes of Daum (2013)
Realtime Big data Anaytics and Exampes of Daum (2013)Realtime Big data Anaytics and Exampes of Daum (2013)
Realtime Big data Anaytics and Exampes of Daum (2013)
 
Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
 
성공적인 게임 런칭을 위한 비밀의 레시피 #3
성공적인 게임 런칭을 위한 비밀의 레시피 #3성공적인 게임 런칭을 위한 비밀의 레시피 #3
성공적인 게임 런칭을 위한 비밀의 레시피 #3
 
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
 
게임 랭킹 ( Game Leader Board )
게임 랭킹 ( Game Leader Board )게임 랭킹 ( Game Leader Board )
게임 랭킹 ( Game Leader Board )
 
레가시 프로젝트의 빌드 자동화
레가시 프로젝트의 빌드 자동화레가시 프로젝트의 빌드 자동화
레가시 프로젝트의 빌드 자동화
 
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
 
Html5
Html5 Html5
Html5
 

More from Jongwon

Graduation Report
Graduation ReportGraduation Report
Graduation ReportJongwon
 
Oracle RDS Data pump
Oracle RDS Data pumpOracle RDS Data pump
Oracle RDS Data pumpJongwon
 
Oracle B*tree
Oracle B*treeOracle B*tree
Oracle B*treeJongwon
 
Oracle Index
Oracle IndexOracle Index
Oracle IndexJongwon
 
Oracle Optimizer presentation
Oracle Optimizer presentationOracle Optimizer presentation
Oracle Optimizer presentationJongwon
 
Docker presentation
Docker presentationDocker presentation
Docker presentationJongwon
 
Network programming report
Network programming reportNetwork programming report
Network programming reportJongwon
 

More from Jongwon (7)

Graduation Report
Graduation ReportGraduation Report
Graduation Report
 
Oracle RDS Data pump
Oracle RDS Data pumpOracle RDS Data pump
Oracle RDS Data pump
 
Oracle B*tree
Oracle B*treeOracle B*tree
Oracle B*tree
 
Oracle Index
Oracle IndexOracle Index
Oracle Index
 
Oracle Optimizer presentation
Oracle Optimizer presentationOracle Optimizer presentation
Oracle Optimizer presentation
 
Docker presentation
Docker presentationDocker presentation
Docker presentation
 
Network programming report
Network programming reportNetwork programming report
Network programming report
 

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