Crawling

[크롤링/05]효율적인 크롤링 하는 방법

박한결 2021. 3. 22. 15:35

Q. 효율적인 크롤링이란?

A. 크롤러를 운용하는 서버의 리소스를 효율적으로 활용하는 정도

 


웹 사이트의 변경 시점이나 변경 빈도 학습

  • 정기적으로 크롤링을 하면 대상 사이트의 경향을 알 수 있음 
  • 예 1> 매주 화요일에 자료가 업데이트 된다. 5시부터 10시까지는 접속이 지연된다. → 매주 화요일 10시 30분에 크롤링
  • 예 2> 매일 자료가 업데이트 된다고 공지가 올라와있다. 9시부터 20시까지는 트래픽이 높다. 8시 30분 또는 20시 30분에 크롤링을 하는 등 트래픽이 높은 시간을 피해서 크롤링
  • 예 3> 매주 수요일 9시마다 오류가 발생한다.  해당 요일, 시간을 피해서 크롤링 
  • 크롤링에 필요한 시간은 웹 사이트에 따라 다름
    • 웹 사이트 내부의 페이지가 같아도 응답 간격과 응답 속도의 차이가 존재
  • 크롤링 대상 웹 사이트가 늘어나고, 크롤러를 대규모로 운용하는 경우
    • 어느 시간대에 어느 정도로 웹 사이트 크롤링이 일어나는지 파악하기 힘들어짐
    • 통계로 생성
  • 웹 사이트별로 크롤링하는 데 걸리는 시간을 기록
    • 어떤 웹 사이트에 어느 정도의 시간이 필요한지 알 수 있음 
    • 같은 시간대에 동작하는 크롤러의 수를 균등하게 되도록 스케줄링하면 전체적인 리소스 비용을 줄일 수 있음
  • 이와 같은 통계 자료를 통해 자원을 효율적으로 활용할 수 있게 된다.
    • 지속적인 크롤링이 가능해짐

제거된 콘텐츠 판별

  • 콘텐츠에 명시적으로 기한이 적혀 있을 경우 종료 시점에 인덱스에서 제거
    • 적혀있는 기간을 믿을 수 없는 경우가 많다
  • 웹 사이트를 정기적으로 크롤링해서 콘텐츠를 발견할 수 없으면 제거된 것으로 판단하기
    • 대규모 크롤러는 신규 데이터만 크롤링해서 어떤 데이터가 제거 되었는지 알 수 없는 경우가 많음
  • 인덱스한 URL을 정기적으로 확인하고 특정 상태 코드를 응답하면 제거된 것으로 판단하기
    • 예> 404, 410
  • 목록 페이지에 해당 콘텐츠가 없으면 제거된 것으로 판단하기
    • 각각의 콘텐츠에 접근하는 시간이 오래 걸린다면 콘텐츠에 직접 접근하지 않는 방법을 고려

 

홈페이지가 JavaScript를 사용한다고 해서 무조건 Selenium을 사용하지 말기

  • 화면 이동 또는 입력 양식 전송을 자바스크립트로 처리하는 경우에는 이러한 동작을 크롤러에 유사하게 모방해 구현 가능
  • URL 규칙을 찾아서 대응 가능

 

크롤러를 위한 데이터

크롤러를 위한 메타 데이터를 제공해주는 경우가 있음

 


 

모바일 사이트

  • PC 전용 사이트는 자바스크립트를 활용한 풍부한 웹 사이트라도 모바일 전용 사이트는 일반적인 정적 웹 사이트를 사용하는 경우가 많음
    • 크롤링이 쉬움
  • PC 전용 사이트와 모바일 전용 사이트가 같은 정보를 제공한다고는 보장할 수 없기 때문에 실제 웹 사이트를 확인하고 판단해야 함

모바일 사이트의 종류

  1. PC 전용 사이트와는 다른 URL을 사용해 모바일 사이트를 제공하는 경우
  2. 사용자 에이전트를 확인하고, 이를 통해 PC 전용 사이트와 모바일 전용 사이트를 나누어 제공하는 경우
  3. PC 전용 사이트와 같은 콘텐츠를 CSS를 사용해 다른 형태로 출력하는 경우

크롤러로 쉽게 읽어들일 수 있는 경우는 1, 2의 패턴이고 3은 같은 HTML을 응답하며 CSS를 사용해 화면의 크기에 따라 레이아웃을 다르게 출력하는 것뿐이므로 차이가 없음

 

 

크롤링은 많이 한다고 좋은게 아니다

  • XML이나 JSON 형식으로 데이터 피드를 제공해주는 경우, 크롤링하지 말기
    • 사이트맵 XML
      • 웹 사이트 페이지 구조, 변경일, 우선도 등 정보가 나와있음
  • 크롤러를 만드는 것보다 효율적으로 데이터를 수집할 수 있음
  • 필요한 페이지만 크롤링하기
    • 페이징
    • 다양한 형태의 대응이 필요
    • 신규 콘텐츠 순서로 정렬하고 일정 수의 데이터만 추출
    • 신규 콘텐츠 순서로 정렬하고 이전에 수집했던 데이터가 발견될 경우 크롤링 중지
    • 무한 루프는 같은 URL 다시 방문하지 않도록 하면 간단히 해결 가능
  • 크롤링 제한하기
    • robots.txt
    • Disallow에 /가 아니라 아무것도 지정되어 있지 않다면 모든 것을 크롤링해도 됨
    • Disallow에 /가 입력되어 있는 경우 모든 페이지에 접근 금지
    • Disallow와 Allow의 작성 순위에 따른 우선 순위는 없음
    • 우선순위는 얼마나 구체적으로 경로를 지정했는지에 따라 달라짐
    • Disallow와 Allow 지정이 같은 경우에는 Allow가 더 높은 우선순위를 가짐
    • 자바 라이브러리 crawler-commons는 robots.txt를 분석해줌
    • robots.txt를 각 페이지를 세부적으로 설정할 수도 있지만 가독성이 떨어짐
      • 디렉터리 또는 확장자를 구분하는 일에 사용하는게 좋음
    • 페이지 별로 세부적으로 설정할 때는 HTML 내부에 robots meta 태그 지정

meta tag content 속성> 

developers.google.com/search/docs/advanced/robots/robots_meta_tag

 

로봇 메타 태그, data-nosnippet 및 X-Robots-Tag 사양  |  Google 검색 센터

이 문서에서는 페이지 및 텍스트 수준 설정을 사용하여 Google 검색결과에 나오는 콘텐츠를 제어하는 방법을 설명합니다. HTML 페이지나 HTTP 헤더에 메타 태그를 삽입하여 페이지 수준 설정을 지정

developers.google.com

* nofollow

- robots meta tag에 nofollw가 지정되어 있으면 페이지 내부의 링크 순회를 금지하는 것임. 해당 페이지의 어떠한 링크에도 접근하면 안됨

- nofollow가 특정 링크에 설정되어 있는 경우에는 nofollow가 지정되어 있지 않은 다른 링크는 순회해도 됨

 

* X-Robots-Tag

- meta tag를 작성할 수 없는 파일(PDF, 이미지 등)은 robots meta tag를 사용할 수 없음.

- 이러한 경우 X-Robots-Tag를 HTTP 응답 헤더에 포함해 리턴하면 됨

HTTP/1.1 200 OK
Server: nginx
Date: ~
X-Robots-Tag: none /*모든 크롤러 인덱스 및 링크 접근 금지*/

특정 크롤러만 대상으로 지정하는 경우

X-Robots-Tag: Googlebot: none
X-Robots-Tag: Sample Crawler: index, nofollow

병렬처리? 비동기처리?

 

보통 프로그램의 성능 향상을 위해서는 병렬처리를 한다. 하지만 파이썬은 GIL 때문에 오히려 병렬 처리를 했을 때 더 느려지는 경우도 있기때문에 주의해야한다.

 

병렬처리의 종류

  • Multi Thread: 여러개의 스레드
  • Multi Process: 여러개의 프로세스
  • Asynchronous I/O: 데이터 전송을 마치기 전에 기타 프로세스가 계속하도록 허가하는 입출력 처리의 한 형태
Bound Job Multi Thread Multi Process
CPU bound  스크레이핑   Recommend
I/O bound 웹 페이지 추출, 파일 등 읽고 쓰기 Recommend Recommend

CPU 바운드는 작업을 멀티 스레드로 사용했을 때 싱글 스레드를 사용했을 때보다 더 느려질 수도 있고, I/O 바운드는 시간 단축을 기대할 수 있다. CPU 바운드는 CPU 코어가 많은 경우에 멀티 프로세스를 사용하는 것이 성능 향상을 기대할 수 있다. 

 

비동기 I/O

 

파이썬 공식 문서: python.org/ko/3/library/asyncio.html

 

asyncio — 비동기 I/O — Python 3.9.2 문서

 

docs.python.org

asyncio 를 사용하면 비동기 I/O가 가능하다. asyncio는 async/await 구문을 사용하여 동시성 코드를 작성하는 라이브러리다. asyncio는 고성능 네트워크 및 웹 서버, 데이터베이스 연결 라이브러리, 분산 작업 큐 등을 제공하는 여러 파이썬 비동기 프레임워크의 기반으로 사용된다.