본문 바로가기

알쓸코잡

꼬리에 꼬리를 무는 웹 스크래핑/크롤링 이야기

꼬리에 꼬리를 무는 웹 스크래핑/크롤링 이야기


웹 스크래핑 vs 크롤링 차이점은 뭐지?

  • 웹에서 데이터를 수집하는 기술로, 비슷한 개념이지만 목적과 수행 방식에서 차이가 있음
  • 크롤링은 웹페이지 간의 링크를 자동으로 탐색하는 과정
  • 스크래핑은 웹 페이지에서 특정 데이터를 추출하는 과정

웹 페이지 간의 링크를 따라 자동으로 탐색한다는 게 뭔가?

  • 웹크롤러(또는 스파이더)가 웹 페이지에 있는 하이퍼링크를 사용해 페이지를 이동하면서 데이터를 수집하는 과정
  • 수집된 웹 페이지들은 검색 엔진의 인덱싱 과정을 거쳐 검색 결과를 볼 수 있음

 

웹 페이지에 있는 하이퍼링크는

<a href="https://example.com">허곰의 코딩블로그</a>

검색 엔진의 인덱싱 과정

수집한 웹 페이지 데이터를 분석 -> 저장 -> 정렬해서 사용자에게 적절한 검색 결과를 제공할 수 있는 구조로 만드는 과정

크게 4가지 단계

  1. 웹 크롤링
  2. 데이터 처리 : 콘텐츠와 메타데이터 추출
  3. 색인 생성(index)
  4. 랭킹

사용자의 검색어와 색인을 비교하여 가장 관련성이 높은 웹 페이지 찾아냄

다양한 요소를 고려해서 웹페이지 순위 결정(페이지 인기도, 사용자 경험)

 

예시

사용자가 "허곰의 코딩블로그" 검색어를 입력한 경우,

1. 웹 크롤링

  • 크롤러가 인터넷 상의 웹 페이지를 방문하여 "허곰의 코딩블로그"와 관련된 콘텐츠와 링크 수집
  • 이때, 허곰의 코딩블로그와 관련된 페이지들을 찾아 콘텐츠와 링크 정보를 수집

2. 데이터 처리

  • 수집 데이터에서 "허곰의 코딩블로그"와 관련된 콘텐츠와 메타 데이터 추출
  • 블로그 제목, 작성자, 포스트 내용등의 정보 포함

3. 색인 생성

  • "허곰의 코딩블로그"와 관련된 웹페이지 정보를 포함하는 색인 생성

4. 랭킹

  • 사용자가 "허곰의 코딩블로그"라는 검색어를 입력하면, 색인에서 가장 관련성이 높은 웹 페이지를 제공
  • 이때, 다양한 요소를 고려해 순위를 결정

웹 스크래핑/크롤링에서 HTTP 헤더 역할?

  • HTTP 헤더를 사용하면 캐싱, 압축, 조건부 요청, 데이터 전송 범위 요청, 사전 연결 설정 등 기능 구현 가능

HTTP vs HTTPS 차이점

  • HTTP는 평문 프로토콜, HTTPS는 SSL/TLS를 사용해 암호화 통신 프로토콜
  • HTTPS는 기밀성, 무결성, 인증성 보장

HTTP 헤더를 왜 사용해야함?

  • 웹 페이지 로딩 시간 줄이고 서버 부하 감소 시킬 수 있음

HTTP 헤더

HTTP 헤더는 클라이언트와 서버 간 메타데이터 교환하는 데 사용되며, 여러 가지 최적화와 성능 향상을 도모할 수 있음

예시

1. 캐싱

  • 'Cache-Control' 헤더를 사용해 캐싱 동작 제어
  • 브라우저가 이전에 다운로드한 리소스 재사용하게 하여, 페이지 로딩 시간 줄임 + 서버 부하 감소
import requests

url = "https://example.com"
headers = {
    "Cache-Control": "public, max-age=3600"
}
response = requests.get(url, headers=headers)
print(response.text)

2. 압축

  • "Content-Encoding" 헤더를 사용해 서버 -> 클라이언트로 전송되는 데이터 압축 방식 지정 가능
  • 전송 시간 줄이고 네트워크 대역폭 사용량 최적화 가능
import requests

url = "https://example.com"
headers = {
    "Accept-Encoding": "gzip"
}
response = requests.get(url, headers=headers)
print(response.text)

3. 조건 부 요청

  • "If-Modified-Since" 및 "If-None-Match" 헤더를 사용하여 조건부 요청 구현 가능
  • 이를 통해 리소스 변경되지 않은 경우, 304 Not Modified 응답받아 새로운 데이터 다운로드 X, 이전 리소스 재사용 O
import requests

url = "https://example.com"
headers = {
    "If-Modified-Since": "Thurs, 27 April 2023 19:28:00 GMT"
}
response = requests.get(url, headers=headers)

if response.status_code == 304:
    print("Not Modified")
else:
    print(response.text)

4. CORS 관련 헤더

  • Access-Control-Allow-Origin
    • 어떤 출처(origin)들이 리소스에 접근할 수 있는지 지정
    • 특정 도메인 지정 가능
  • Access-Control-Allow-Methods
    • 리소스에 대해 허용되는 HTTP 메서드
    • ex. GET, POST, PUT, DELETE)
  • Access-Control-Allow-Headers
    • 허용되는 요청 헤더 지정
    • ex) Content-Type, Authorization

CORS가 뭔데?

  • 는 아래 인파님 블로그 참고하자.. 넘사벽이다
 

🌐 악명 높은 CORS 개념 & 해결법 - 정리 끝판왕 👏

악명 높은 CORS 에러 메세지 웹 개발을 하다보면 반드시 마주치는 멍멍 같은 에러가 바로 CORS 이다. 웹 개발의 신입 신고식이라고 할 정도로, CORS는 누구나 한 번 정도는 겪게 된다고 해도 과언이

inpa.tistory.com