Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

Beomi
August 19, 2017

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

GDG Campus SummerParty (2017)의 세션 발표자료입니다.

Beomi

August 19, 2017
Tweet

More Decks by Beomi

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  8. 사용하는 도구
    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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  14. requests
    의 User-Agent

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  18. HTTP Header

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

    View Slide

  19. 크롬을 넣으면 보통 잘 동작한다
    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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  25. CSRF 검증이 들어간 경우
    ex)
    클O

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  31. 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

    View Slide

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

    View Slide

  33. 너무 빨리(
    많이)
    요청했더니...
    ex)
    조O

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  46. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  56. 이미지 출처
    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

    View Slide