[데이터분석] 데이터 크롤링

2024. 8. 14. 00:16데이터 사이언스

Crawling

  • 자동으로 웹페이지 데이터를 수집하는 행위
  • 너무 많은 크롤링은 서버에 과도한 부하를 주게 되어서 IP가 차단되는 상황이 발생할 수 있음

Robots.txt와 사용자 에이전트(user agent)

  1. Robots.txt
    • 웹 사이트 및 웹 페이지를 수집하는 로봇들의 무단 접근을 방지하기 위해 만들어진 로봇 배제 표준/국제 권고안 → 법적인 통제력은 없으나 서로 간 예의
    • 일부 스팸 봇이나 악성 목적을 지닌 가짜 클라이언트 로봇은 웹 사이트에 진짜 클라이언트처럼 접근
    • 무단으로 웹 사이트 정보를 긁어가거나, 웹 서버에 부하를 줌
    • ⇒ 이런 로봇들의 무분별한 접근을 통제하기 위해 마련
  2. User agent
    • 웹 서버에 요청을 보내도 요청을 거부 당하는 경우 발생 → 무단 봇으로 짐작하고 웹 서버에서 접근을 막는 것
    • 우리가 스팸 봇이 아니라 사람이라는 것을 브라우저에게 알려줘야 함
    • ⇒ 이때 브라우저에게 전달하는 것이 사용자 에이전트 정보
  • [주의할 점]
    • 서버에 과도한 부하를 주지 않는다.
    • 가져온 정보를 사용할 때(특히 상업적으로) 저작권과 데이터베이스권에 위배되지 않는지 주의한다.
  • (예시 캡처) 사이트 URL/robots.txt


크롤러

정적 웹페이지 VS 동적 웹페이지

  1. 정적 웹페이지
    • 웹 서버에 이미 저장된 기본 html 전송하고
    • 데이터 자체의 변화 없는 한 고정 데이터 전달한다.
    • Ex) 홈페이지 회사 소개
  2. 동적 웹페이지
    • 요청 정보 처리 후 제작된 html 페이지 전송하고
    • 사용자가 요청하는 상황 등에 따라 다른 데이터 전달한다.
    • Ex) 뉴스 댓글, 상품 검색(특정 키워드를 입력하면, 그에 맞는 상품 페이지)

BeautifulSoup VS Selenium

  • BeautifulSoup은 페이지 자체를 가져오다보니 막아둔 경우가 많음
  • 따라서, Selenium을 쓰는 경우가 많을 것
특징 BeautifulSoup Selenium
기능 HTML 및 XML 파싱 브라우저 자동화 및 동적 웹 페이지와 상호 작용
적용 대상 정적 웹 페이지 동적 웹 페이지
JavaScript 처리 불가 가능
속도 빠름 느림
의존성 requests 라이브러리 사용(별도의 브라우저 불필요) 브라우저 및 브라우저 드라이버 필요(예) ChromeDriver
설치 간단 (pip 설치) 복잡 (브라우저 드라이버 설치 필요)
사용 용이성 쉬움 상대적으로 어려움
브라우저 렌더링 없음 있음( 실제 브라우저 렌더링)
사용자 상호작용 불가 가능( 클릭, 폼 제출 등 사용자 행동 시뮬레이션)

정규표현식

  • 정규표현식을 이용해 정교하게 원하는 데이터를 추출 / 삭제 / 변환 가능
    • 데이터 중 특히 문자열 데이터를 정교하게 수행 가능
  • (https://regexr.com/)


Dot, 반복

  • Dot
    • . (Dot) = 문자 하나 (숫자, 특수문자 포함)
    • ? : 앞 문자가 0번 또는 1번 표시되는 패턴
    • * : 앞 문자가 0번 또는 그 이상 반복되는 패턴
    • + : 앞 문자가 1번 또는 그 이상 반복되는 패턴
    • {n} : 앞 문자가 n번 반복되는 패턴
    • {m, n} : 앞 문자가 m번 반복되는 패턴부터 n번 반복되는 패턴까지 가져올 수 있음

괄호와 하이픈

  • [] 괄호 : 안에 들어가는 문자가 들어 있는 패턴 → ex) [abc] a, b, c 중 하나가 들어 있는 패턴을 의미
  • 하이픈(-): 이용하면 알파벳 전체를 나타낼 수 있음 → ex) [a-c] a, b, c 중 하나가 들어 있는 패턴을 의미
  • () 괄호: 괄호 안에 있는 단어 자체를 반환함 → ex) (abc) abc가 들어 있는 패턴을 의미

정규표현식 라이브러리 함수 사용법

  • Match : 문자열 처음부터 정규식과 매칭되는 패턴을 찾아서 리턴
  • Search : 문자열 전체를 검색해서 정규식과 매칭되는 패턴을 찾아서 리턴
  • FindAll : 정규표현식과 매칭되는 모든 문자열을 리스트 객체로 리턴
  • Split : 찾은 정규표현식 패턴 문자열을 기준으로 문자열을 분리
  • Sub : 찾은 정규표현식 패턴 문자열을 다른 문자열로 변경

 

  • 추출해야하는 정규표현식이 대부분 정해져 있는(한정되어있는) 경우가 많음
    • (ex) 전화번호, 생년월일, 정수만 가져오는 경우