Q. 효율적인 크롤링이란?
A. 크롤러를 운용하는 서버의 리소스를 효율적으로 활용하는 정도
웹 사이트의 변경 시점이나 변경 빈도 학습
- 정기적으로 크롤링을 하면 대상 사이트의 경향을 알 수 있음
- 예 1> 매주 화요일에 자료가 업데이트 된다. 5시부터 10시까지는 접속이 지연된다. → 매주 화요일 10시 30분에 크롤링
- 예 2> 매일 자료가 업데이트 된다고 공지가 올라와있다. 9시부터 20시까지는 트래픽이 높다. → 8시 30분 또는 20시 30분에 크롤링을 하는 등 트래픽이 높은 시간을 피해서 크롤링
- 예 3> 매주 수요일 9시마다 오류가 발생한다. → 해당 요일, 시간을 피해서 크롤링
- 크롤링에 필요한 시간은 웹 사이트에 따라 다름
- 웹 사이트 내부의 페이지가 같아도 응답 간격과 응답 속도의 차이가 존재
- 크롤링 대상 웹 사이트가 늘어나고, 크롤러를 대규모로 운용하는 경우
- 어느 시간대에 어느 정도로 웹 사이트 크롤링이 일어나는지 파악하기 힘들어짐
- 통계로 생성
- 웹 사이트별로 크롤링하는 데 걸리는 시간을 기록
- 어떤 웹 사이트에 어느 정도의 시간이 필요한지 알 수 있음
- 같은 시간대에 동작하는 크롤러의 수를 균등하게 되도록 스케줄링하면 전체적인 리소스 비용을 줄일 수 있음
- 이와 같은 통계 자료를 통해 자원을 효율적으로 활용할 수 있게 된다.
- 지속적인 크롤링이 가능해짐
제거된 콘텐츠 판별
- 콘텐츠에 명시적으로 기한이 적혀 있을 경우 종료 시점에 인덱스에서 제거
- 적혀있는 기간을 믿을 수 없는 경우가 많다
- 웹 사이트를 정기적으로 크롤링해서 콘텐츠를 발견할 수 없으면 제거된 것으로 판단하기
- 대규모 크롤러는 신규 데이터만 크롤링해서 어떤 데이터가 제거 되었는지 알 수 없는 경우가 많음
- 인덱스한 URL을 정기적으로 확인하고 특정 상태 코드를 응답하면 제거된 것으로 판단하기
- 예> 404, 410
- 목록 페이지에 해당 콘텐츠가 없으면 제거된 것으로 판단하기
- 각각의 콘텐츠에 접근하는 시간이 오래 걸린다면 콘텐츠에 직접 접근하지 않는 방법을 고려
홈페이지가 JavaScript를 사용한다고 해서 무조건 Selenium을 사용하지 말기
- 화면 이동 또는 입력 양식 전송을 자바스크립트로 처리하는 경우에는 이러한 동작을 크롤러에 유사하게 모방해 구현 가능
- URL 규칙을 찾아서 대응 가능
크롤러를 위한 데이터
크롤러를 위한 메타 데이터를 제공해주는 경우가 있음
모바일 사이트
- PC 전용 사이트는 자바스크립트를 활용한 풍부한 웹 사이트라도 모바일 전용 사이트는 일반적인 정적 웹 사이트를 사용하는 경우가 많음
- 크롤링이 쉬움
- PC 전용 사이트와 모바일 전용 사이트가 같은 정보를 제공한다고는 보장할 수 없기 때문에 실제 웹 사이트를 확인하고 판단해야 함
모바일 사이트의 종류
- PC 전용 사이트와는 다른 URL을 사용해 모바일 사이트를 제공하는 경우
- 사용자 에이전트를 확인하고, 이를 통해 PC 전용 사이트와 모바일 전용 사이트를 나누어 제공하는 경우
- PC 전용 사이트와 같은 콘텐츠를 CSS를 사용해 다른 형태로 출력하는 경우
크롤러로 쉽게 읽어들일 수 있는 경우는 1, 2의 패턴이고 3은 같은 HTML을 응답하며 CSS를 사용해 화면의 크기에 따라 레이아웃을 다르게 출력하는 것뿐이므로 차이가 없음
크롤링은 많이 한다고 좋은게 아니다
- XML이나 JSON 형식으로 데이터 피드를 제공해주는 경우, 크롤링하지 말기
- 사이트맵 XML
- 웹 사이트 페이지 구조, 변경일, 우선도 등 정보가 나와있음
- 사이트맵 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
* 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가 가능하다. asyncio는 async/await 구문을 사용하여 동시성 코드를 작성하는 라이브러리다. asyncio는 고성능 네트워크 및 웹 서버, 데이터베이스 연결 라이브러리, 분산 작업 큐 등을 제공하는 여러 파이썬 비동기 프레임워크의 기반으로 사용된다.
'Crawling' 카테고리의 다른 글
[크롤링/07] 알고 있으면 유용한 조각 지식-01 (0) | 2021.03.23 |
---|---|
[크롤링/06] 인증이 필요한 페이지 (0) | 2021.03.22 |
[크롤링/04] HTTP 기본 총 정리 (0) | 2021.03.22 |
[크롤링/03] 라이브러리/프레임워크 (0) | 2021.03.22 |
[크롤링/02] 크롤링을 잘 하는 방법 (0) | 2021.03.22 |