Slide 1

Slide 1 text

GDG Campus Summer Party 쓸데많은 웹 크롤러 만들기 with Python 이준범 ( [email protected] ) GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 1

Slide 2

Slide 2 text

발표자 소개 이준범 ( [email protected] ) DjangoGirls Seoul Organizer < 나만의 웹 크롤러> 블로그 연재 < 파이썬을 활용한 실전 웹크롤링 CAMP> 패스트캠퍼스 강의 Python + Django = <3 파이썬쓰세요 두번쓰세요 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 2

Slide 3

Slide 3 text

웹 크롤링? GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 3

Slide 4

Slide 4 text

인터넷 & 웹에 있는 유용한 정보를 가져오고 사용하기 쉬운 형태로 가공하자 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 4

Slide 5

Slide 5 text

오늘 다루는 내용 가장 기초적인 것 X 크롤링하기 좀더 까다로운 사례 O 코드 나열 X , 사례 + 해결법 O CS101 아니라 CS201 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 5

Slide 6

Slide 6 text

그래도 기본적인 내용은 알고갑시다 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 6

Slide 7

Slide 7 text

HTTP ? HTML ? JSON ? API ? GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 7

Slide 8

Slide 8 text

사용하는 도구 python v3.6 (CPython 을 사용합니다.) requests v2.18 HTTP Request beautifulsoup v4.6 HTML to Python Object lxml v3.8 HTML(XML) Parser selenium v3.5 Browser Control pip 로 설치하면 됩니다 pip install requests bs4 lxml selenium # 한번에 전부 설치하기 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 8

Slide 9

Slide 9 text

크롤링을 막는 사례들 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 9

Slide 10

Slide 10 text

사례 1 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 10

Slide 11

Slide 11 text

User-Agent 체크를 하는 경우 ex) 온OO 믹스 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 11

Slide 12

Slide 12 text

User-Agent ? GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 12

Slide 13

Slide 13 text

HTTP 요청을 보낸 대상이 어떤 클라이언트( 브라우저) 인지 확인 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 13

Slide 14

Slide 14 text

requests 의 User-Agent 는 python-requests/2.18.3 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 14

Slide 15

Slide 15 text

브라우저가 아니네? GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 15

Slide 16

Slide 16 text

너 차단 # 망했어요 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 16

Slide 17

Slide 17 text

해결법 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 17

Slide 18

Slide 18 text

HTTP Header 에 모던 브라우저의 User-Agent 값 넣기 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 18

Slide 19

Slide 19 text

크롬을 넣으면 보통 잘 동작한다 import requests s = requests.Session() s.headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) '\ 'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36' } 만약 내가 쓰는 브라우저의 속성을 알고싶다면: 구글에 My User Agent 검색 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 19

Slide 20

Slide 20 text

사례 2 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 20

Slide 21

Slide 21 text

( 로그인 등에서) hidden input eld 가 있는 경우 ex) 온OO 믹스 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 21

Slide 22

Slide 22 text

어떤 값이 서버가 진짜 원하는 것인지 알아야함 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 22

Slide 23

Slide 23 text

온OO 믹스 로그인 Form proc returnUrl email pw ... 어떤게 진짜? GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 23

Slide 24

Slide 24 text

사례 3 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 24

Slide 25

Slide 25 text

CSRF 검증이 들어간 경우 ex) 클O 앙 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 25

Slide 26

Slide 26 text

똑똑.. 쿠키에 있는 토큰이랑 input 에 있는 토큰 주세요 그런거 없는데요... GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 26

Slide 27

Slide 27 text

응 너 차단 ^^ # 망했어요(2) GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 27

Slide 28

Slide 28 text

GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 28

Slide 29

Slide 29 text

해결법 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 29

Slide 30

Slide 30 text

한 Requests Cycle 안이라면 세션을 유지하고 HTML 에서 토큰을 뽑아내면 되겠다 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 30

Slide 31

Slide 31 text

CSRF 토큰이 있는 페이지에서 토큰 추출 & 세션유지 with requests.Session() as s: first_page = s.get('https://www.clien.net/service') html = first_page.text soup = bs(html, 'lxml') csrf = soup.find('input', {'name': '_csrf'}) LOGIN_INFO = { 'userId': 'myidid', 'userPassword': 'mypassword123' '_csrf': csrf['value'] } login_req = s.post( 'https://www.clien.net/service/login', data=LOGIN_INFO ) GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 31

Slide 32

Slide 32 text

사례 4 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 32

Slide 33

Slide 33 text

너무 빨리( 많이) 요청했더니... ex) 조O 라 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 33

Slide 34

Slide 34 text

응 못 긁어가~ GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 34

Slide 35

Slide 35 text

사실 사람이 1 초에 많이 넘겨봤자 두개~ 세개 페이지 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 35

Slide 36

Slide 36 text

해결법 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 36

Slide 37

Slide 37 text

조금 쉬어갑시다 time.sleep(3) GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 37

Slide 38

Slide 38 text

근데 들킬수도 있어요 ( 너무 똑같이 쉬어서) GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 38

Slide 39

Slide 39 text

랜덤하게 쉬어줍시다 time.sleep(3 + random.random() * 3) 3 ~ 6 초 안에서 랜덤하게 쉬어줍니다 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 39

Slide 40

Slide 40 text

사례 5 이것이 혼모노다.. GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 40

Slide 41

Slide 41 text

요즘 인기 많은 SPA ...까지는 아니더라도 JS 로 동적 DOM 변경이 일어나는 경우 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 41

Slide 42

Slide 42 text

requests 로 가져오면 딱 한줄 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 42

Slide 43

Slide 43 text

서버가 말했읍니다. " 안알랴줌" GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 43

Slide 44

Slide 44 text

결국은 클라이언트 렌더링이 필요 크롬은( 뚠뚠) 오늘도( 뚠뚠) 열심히 일을 하네( 뚠뚠) GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 44

Slide 45

Slide 45 text

Selenium ! 브라우저를 코드로 조작할수 있어요 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 45

Slide 46

Slide 46 text

Selenium 써보기 from selenium import webdriver driver = webdriver.Chrome('/Users/ 사용자이름/Downloads/chromedriver') driver.implicitly_wait(3) driver.get('https://naver.com') # requests 의 .text( 소스보기) 와 다르게 브라우저의 Elements 탭과 동일한 DOM html = driver.text 브라우저에 렌더링된 DOM 구조와 동일 ( 화면에 나타나지 않는 것 ( 렌더링 되지 않은것) 은 가져올 수 없음) GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 46

Slide 47

Slide 47 text

하지만 이걸로도 못하는게 있어요 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 47

Slide 48

Slide 48 text

Captcha GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 48

Slide 49

Slide 49 text

캡챠 뚫는 API 를 사용하거나 캡챠가 뜨면 사람이 클릭하도록 돌리거나 Sikuli같은 이미지 인식을 돌리거나 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 49

Slide 50

Slide 50 text

진짜 사람도 25% 나 걸린다는 Recaptcha 가게 표지판좀 그만좀 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 50

Slide 51

Slide 51 text

ㅠㅠ GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 51

Slide 52

Slide 52 text

일정 수준 이상으로 빡세게 돌리거나 상업적 용도가 있다면 일단 서버 운영자나 개발자에게 물어봅시다 GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 52

Slide 53

Slide 53 text

서버 개발자도 사람이니까요. GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 53

Slide 54

Slide 54 text

QnA GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 54

Slide 55

Slide 55 text

들어주셔서 감사합니다. GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 55

Slide 56

Slide 56 text

이미지 출처 18p, 23p 너 차단: http://blackhole-kun.tistory.com/2004 22p 탐험가맛 쿠키: http://bbs.ruliweb.com/best/board/300064/read/25114064 35p 랜덤게임: https://play.google.com/store/apps/details? id=com.rectworks.randomgame 39p 안알랴줌: 다음 Storyball GDG Campus SummerParty: 쓸데많은 웹 크롤러 만들기 with Python 56