끄적끄적

2025.07.02 데이터 크롤링 세션 1 본문

[스파르타]내일배움캠프 데이터 분석 트랙/Session

2025.07.02 데이터 크롤링 세션 1

kminx 2025. 7. 9. 16:46
튜터 김대영 튜터님
학습 목표 1. 웹의 동작 방식과 주요 구성 요소에 대해 이해합니다.
2. HTML과 CSS의 기본적인 구조 및 역할을 파악합니다.
3. 웹 개발자 도구의 핵심 기능을 활용하여 웹 페이지를 분석합니다.
4. requests 라이브러리의 기본적인 사용법을 익힙니다.

웹의 이해와 데이터 추출의 기본

 

1️⃣ 웹의 동작 원리 이해

 

📌 HTTP/HTTPS 프로토콜

HTTP (HyperText Transfer Protocol):

  • 웹 브라우저(Client)웹 서버(Server) 간에 데이터를 주고받는 데 사용되는 프로토콜.
  • 텍스트 기반의 통신 규약으로, 요청(Request)과 응답(Response) 형태로 이루어진다.

HTTPS (Hypertext Transfer Protocol Secure):

  • HTTP에 보안(SSL/TLS)이 강화된 버전.
  • 데이터 암호화를 통해 안전한 통신을 제공한다.
  • 특히 로그인 정보, 결제 정보 등 민감한 데이터를 다룰 때 필수적이다.

 

📌 클라이언트-서버 통신

  • 클라이언트: 웹 브라우저 (Chrome, Firefox 등), 안드로이드 앱, 아이폰 앱와 같이 웹 서버에 요청을 보내는 주체.
  • 서버: 웹 페이지, 이미지, 데이터 등을 저장하고 있다가 클라이언트의 요청응답하여 데이터를 전송하는 주체.

동작 과정:

  1. 클라이언트(브라우저)가 특정 웹사이트에 접속하기 위해 서버에 **요청(Request)**을 보냅니다.
  2. 서버는 해당 요청을 처리하고, 요청된 웹 페이지 데이터 등을 **응답(Response)**으로 클라이언트에 전송합니다.
  3. 클라이언트는 서버로부터 받은 데이터를 해석하여 사용자에게 웹 페이지를 보여줍니다.

 

 

2️⃣ HTML과 CSS 기본 구조 이해

 

📌 HTML (HyperText Markup Language)

  • 웹 페이지의 구조와 내용을 정의하는 마크업 언어
  • 다양한 태그(Tag)를 사용하여 텍스트, 이미지, 링크, 표 등을 표현한다.
    • <p></p> ⇒ 글씨 ⇒ ‘P’aragraph
    • <div></div> ⇒ 영역 ⇒ ‘Div’ider
  • 모든 웹 페이지는 기본적으로 HTML로 작성된다.

기본 구조:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>웹 페이지 제목</title>
</head>
<body>
    <h1>메인 제목</h1>
    <p>단락 내용</p>
    <a href="https://example.com">링크</a>
</body>
</html>
  • <!DOCTYPE html>: 문서 유형을 HTML5로 지정한다. (없어도 됨)
  • <html>: HTML 문서의 루트 요소(가장 기본)이다.
  • <head>: 웹 페이지에 대한 메타 정보 (제목, 문자 인코딩, 외부 파일 연결 등)를 포함한다. 사용자에게 직접 보이지 않는다.
  • <body>: 웹 페이지에 실제로 표시될 모든 콘텐츠 (텍스트, 이미지, 링크, 동영상 등)를 포함한다.

 

📌 CSS (Cascading Style Sheets)

  • HTML로 작성된 웹 페이지의 스타일(디자인)을 정의하는 언어
  • 글꼴, 색상, 레이아웃, 배경 등 시각적인 요소를 제어한다.
  • HTML 문서와 분리하여 웹 페이지의 유지보수와 일관성을 높이는 데 기여한다.

적용 예시 (인라인 스타일):

<p style="color: blue; font-size: 16px;">파란색 글씨</p>

 

적용 예시 (외부 스타일 시트):

  • HTML <head> 섹션에 CSS 파일을 연결한다.
<link rel="stylesheet" href="styles.css">

 

 

3️⃣ 웹 개발자 도구 활용법 (Chrome 기준)

웹 개발자 도구는 웹 페이지의 구조를 분석하고 디버깅하는 데 필수적인 도구이다.

 

📌 Elements 탭

  • 웹 페이지의 HTML 구조를 실시간으로 확인하고 수정할 수 있다.
  • 특정 요소에 마우스를 올리면 해당 요소의 CSS 스타일이 함께 표시된다.
  • 크롤링 시 데이터를 추출할 태그와 속성을 파악하는 데 가장 많이 사용된다.

 

📌 Network 탭

  • 웹 페이지가 로드될 때 서버와 주고받는 모든 네트워크 요청(Request) 및 응답(Response)을 모니터링한다.
  • 요청의 종류 (GET, POST 등), 상태 코드 (200 OK, 404 Not Found 등), 헤더(Headers), 응답 내용(Response) 등을 확인할 수 있다.
  • 특히 동적으로 로드되는 데이터(HTTP, AJAX 요청)를 파악하고 크롤링할 때 매우 중요하다.

활용 팁:

  1. Network 탭을 연 상태에서 웹 페이지를 새로고침하면 모든 요청이 기록된다.
  2. XHR 필터를 통해 AJAX 요청만 따로 볼 수 있다.
  3. 특정 요청을 클릭하여 상세 정보를 확인하고, Response 탭에서 서버가 보낸 원본 데이터를 볼 수 있다.

 

 

4️⃣ requests 라이브러리 기본 사용법

requests는 파이썬에서 HTTP 요청을 보내는 가장 인기 있고 강력한 라이브러리

 

📌 설치

pip install requests

 

📌 GET 요청 보내기

웹 페이지의 내용을 가져올 때 주로 사용한다.

import requests

# 웹 페이지 URL 정의
url = "<https://www.naver.com>"

# GET 요청 보내기
response = requests.get(url)

# 응답 상태 코드 확인 (200은 성공)
print(f"상태 코드: {response.status_code}")

# 응답 내용 (HTML 코드) 출력
# response.text는 응답 본문을 텍스트로 반환 (문자 인코딩 고려)
print(response.text[:500]) # 처음 500자만 출력

 

📌 응답 객체 활용

requests.get() 호출 결과로 반환되는 response 객체는 다양한 속성과 메서드를 제공한다.

  • response.status_code: HTTP 상태 코드 (예: 200, 404, 500)
  • response.text: 응답 본문을 유니코드 텍스트로 반환 (가장 흔하게 사용)
  • response.content: 응답 본문을 바이트(bytes) 형태로 반환 (이미지, 파일 등)
  • response.encoding: 응답의 문자 인코딩 정보
  • response.url: 요청된 URL
  • response.headers: 응답 헤더 정보 (딕셔너리 형태)

 

📌 요청 헤더 설정 (User-Agent)

일부 웹사이트는 봇 접근을 차단하기 위해 User-Agent를 확인합니다. 웹 크롤링 시 브라우저처럼 보이게 하려면 User-Agent를 설정하는 것이 좋다.

import requests

url = "<https://httpbin.org/headers>" # 요청 헤더를 확인할 수 있는 테스트 URL

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}

response = requests.get(url, headers=headers)
print(response.json()) # JSON 응답 확인

 

📌 쿼리 파라미터 추가

URL에 ?key=value&key2=value2 형태로 데이터를 전달하는 방식입니다. 검색어 전달 등에 사용된다.

import requests

url = "<https://search.naver.com/search.naver>"
params = {
    "query": "파이썬 크롤링",
    "where": "web"
}

response = requests.get(url, params=params)
print(f"요청 URL: {response.url}")
print(response.text[:500])
 

📌 POST 요청 보내기

폼 제출이나 데이터 전송 시 주로 사용된다.
import requests

url = "https://httpbin.org/post"
data = {
    "name": "홍길동",
    "email": "hong@example.com"
}

response = requests.post(url, data=data)
print(response.json()) # JSON 응답 확인