Byeonguk Kim

안녕하세요. 29살의 조금은 늦은 나이로 새롭게 개발자로 시작하는 신입 개발자입니다. 포트폴리오 [https://deaguowl.github.io]

파이썬 21. 정적크롤링(request,beautifulsoup4)

25 Apr 2019 » Python

2019.04.25 정적크롤링(request,beautifulsoup4)

# 질문에 답하기

  1. 정적 크롤링
  2. request
  3. beautifulSoup

크롤링 : 웹 페이지에 있는 자료를 자동으로 수집하는 프로그램

  • robots.txt : 검색엔진에게 어디까지 검색을 허용할 것이냐?
  • 선행지식 : HTML에 대한 이해 CSS Selection을 만드는 방법
  • 정적페이지 크롤링(페이지 소스보기에서 보여질 때)
    • request와 beautifulsoup4를 이용해서 크롤링 및 해석한다.
  • 동적페이지 크롤링(실시간으로 데이터가 바뀔 때)
    • selenum혹은 ajax, josn을 이용하여 크롤링 및 해석한다.
  • 정적페이지 동적페이지 확인 방법
    • 본인이 크롤링 할려는 데이터가 페이지소스보기 했을 때 있는지 확인한다.
    • 검사 및 셋팅(f1)에 들어가서 DEBUGGER의 disable javascript를 한후 새로고침을 해본다.
      • 데이터가 나오지 않으면 javascript를 통해 데이터를 받아온다.

disablejavascript

  • 오른쪽 하단에 위치

브라우저가 혹은 크롤러가 어떤식으로 서버에 접근해서 데이터를 가져오는가?

  1. 주소를 입력하면 해당 서버로 접근한다.(url 필수)
  2. 웹서버 프로그램이 해당 주소에 맞는 내용을 전달한다.(by source code)
    1. request라는 모듈을 이용한다.
    2. request(urllib의 wrapper 클래스)
  3. 웹 브라우저는 받은 소스코드를 해석해서 화면에 보여준다.
    1. 크롤러는 받은 내용을 해석해서 내가 원하는 데이터를 뽑아낸다.
      1. BeautifulSoup 모듈 이용
      2. 해석해서 : html 코드의 해석, CSS Selecter 만드는 방법
    2. 웹브라우저와 크롤러의 차이

정적 크롤링 필요 모듈 설치

  1. requests : 웹페이지에 접근해서 데이터를 가져온다.
    1. pip3 install requests
    2. requests는 aiax로 받아온 데이터를 실시간으로 반영할 수 없다.
      1. 페이지소스코드 보기까지 가능하다.
      2. 내가 원하는 자료를 계속 못 받아온다고 하면 aiax로 구성되서 그런가보다 하고 알아야 한다.
      3. 해결방안으로 selenium : 웹 브라우저를 원격 조작하는 방식의 크롤러이다.
      4. 크롤링 모듈 : request, selenium, scrapy등 상황에 맞는 크롤링 모듈 정리
  2. BeautifulSoup4 : 가져온 데이터를 HTML로 해석한다.
    1. pip3 install BeautifulSoup4
  3. 사용하기
import requests
from bs4 import BeautifulSoup

크롤러의 이용

웹 브라우저를 그대로 따라하기 때문에

  1. 명절표 예매
  2. 콘서트 티켓 예매 등을 할 수 있다.
  3. 빠른 정보 취득
  4. 정보 취득 및 삽입

크롤러자체는 불법이 아니나, 내가 크롤러로 무료로 취득한 정보를 바탕으로 돈을 벌면 불법이다.

만약에 자바스크립트와 같은 것을 통해서 지속적으로 업데이트 되는 웹사이트라면

  • selenum보다는 request가 훨씬 빠르다.
  • selenum : 웹 브라우저 자체를 컨트롤해서 크롤링
    • 요소를 선택해서 사용자의 동작을 흉내낸다. : 클릭, 키보드 입력
    • 선택자 xpath, css
    • xpath : //*[@id=”main_content”]/div[2]/div/dl/dt[2]/a
    • css : #main_content > div.list_body.newsflash_body > div > dl > dt:nth-child(2) > a