개발노트

고즐의 개발 및 서버 개발 노트

파이썬 크롤링 기초 실전 정리, requests BeautifulSoup로 데이터 수집하기

# 파이썬크롤링 # BeautifulSoup사용법 # requests크롤링 # 파이썬웹스크래핑 # 파이썬HTML파싱

Python 2025.12.17 6일 전 54 회 읽음


크롤링이 자동화에서 차지하는 위치

크롤링은 웹 페이지에서 데이터를 가져와 자동화 파이프라인의 입력으로 사용하는 단계입니다.


크롤링과 API의 차이

API는 공식적으로 제공되는 데이터 통로입니다.

크롤링은 HTML 페이지를 직접 분석해 데이터를 추출합니다.

API가 없을 때 크롤링이 대안이 됩니다.


외주 코드에서 크롤링이 등장하는 이유

모든 서비스가 API를 제공하지는 않습니다.

기존 웹 페이지에서 정보를 수집해야 하는 경우가 많습니다.

이때 requests와 BeautifulSoup 조합이 사용됩니다.


크롤링의 기본 흐름

요청으로 HTML을 가져옵니다.

HTML을 파싱해 구조를 분석합니다.

필요한 요소만 추출합니다.


이번 편에서 다룰 범위

정적 HTML 페이지 크롤링만 다룹니다.

자바스크립트 렌더링 페이지는 포함하지 않습니다.

실무에서 가장 많이 쓰는 기본 패턴만 정리합니다.


크롤링을 위한 기본 준비

크롤링은 라이브러리 준비와 HTML 구조 이해부터 시작합니다.


필수 라이브러리 구성

requests는 HTML을 가져오는 역할을 합니다.

BeautifulSoup은 HTML을 분석하고 탐색하는 역할을 합니다.

두 라이브러리는 항상 함께 사용됩니다.

pip install requests beautifulsoup4


기본 import 구조

requests와 BeautifulSoup을 각각 import합니다.

BeautifulSoup은 bs4 패키지에서 불러옵니다.

외주 코드에서도 이 형태가 거의 고정입니다.

import requests
from bs4 import BeautifulSoup


크롤링 대상 페이지 확인

브라우저 개발자 도구로 HTML 구조를 먼저 확인합니다.

태그와 클래스 구조를 파악하는 것이 핵심입니다.

이 과정을 생략하면 크롤링 성공률이 급격히 떨어집니다.


robots.txt 기본 인식

사이트의 robots.txt는 크롤링 허용 범위를 정의합니다.

무시하고 크롤링하면 문제가 될 수 있습니다.

실무에서는 반드시 확인하는 습관이 필요합니다.


requests로 HTML 가져오기

크롤링의 첫 단계는 웹 페이지 HTML을 정확히 가져오는 것입니다.


GET 요청 기본 패턴

requests.get으로 페이지 HTML을 요청합니다.

응답은 문자열 형태의 HTML입니다.

상태 코드 확인은 필수입니다.

response = requests.get("https://example.com")
html = response.text


User-Agent 헤더 지정

기본 요청은 차단될 수 있습니다.

브라우저처럼 보이도록 User-Agent를 지정합니다.

외주 크롤링 코드에서 거의 항상 포함됩니다.

headers = {
    "User-Agent": "Mozilla/5.0"
}

response = requests.get("https://example.com", headers=headers)


응답 실패 대응

403이나 404 응답이 나올 수 있습니다.

상태 코드에 따라 처리 로직을 분기해야 합니다.

자동화 안정성에 중요한 부분입니다.


HTML 확인 습관

크롤링이 안 될 때는 HTML을 먼저 출력해봅니다.

예상과 다른 구조인지 확인해야 합니다.

문제 원인을 가장 빠르게 찾는 방법입니다.


BeautifulSoup으로 HTML 파싱하기

BeautifulSoup은 HTML 구조를 트리 형태로 분석합니다.


BeautifulSoup 객체 생성

HTML 문자열을 BeautifulSoup 객체로 변환합니다.

파서로 html.parser를 가장 많이 사용합니다.

이 객체를 기준으로 모든 탐색이 이루어집니다.

soup = BeautifulSoup(html, "html.parser")


태그 하나 찾기

find는 조건에 맞는 첫 번째 태그를 찾습니다.

단일 요소 추출에 사용됩니다.

없을 경우 None을 반환합니다.

title = soup.find("title")
print(title.text)


여러 태그 찾기

find_all은 조건에 맞는 모든 태그를 리스트로 반환합니다.

목록 데이터 추출에 자주 사용됩니다.

for 반복문과 함께 사용합니다.

links = soup.find_all("a")

for link in links:
    print(link.text)


클래스와 속성으로 찾기

class나 id로 원하는 요소를 좁힐 수 있습니다.

실무 크롤링의 핵심 기술입니다.

HTML 구조 분석이 중요한 이유입니다.


데이터 추출 실전 패턴

필요한 데이터만 정확히 추출하는 것이 크롤링의 목적입니다.


텍스트 데이터 추출

태그의 text 속성으로 내부 텍스트를 가져옵니다.

공백과 줄바꿈이 포함될 수 있습니다.

후처리 과정이 필요한 경우가 많습니다.


속성 값 추출

링크 주소나 이미지 URL은 속성에 들어 있습니다.

get 메서드로 안전하게 접근합니다.

외주 크롤링에서 가장 많이 쓰이는 패턴입니다.

for link in links:
    href = link.get("href")
    print(href)


없는 요소에 대한 방어

HTML 구조 변경으로 요소가 없을 수 있습니다.

None 체크는 필수입니다.

자동화 스크립트 안정성에 직결됩니다.


리스트 형태로 데이터 수집

추출한 데이터를 리스트에 담아 관리합니다.

이후 파일 저장이나 API 전송으로 이어집니다.

앞선 편들과 자연스럽게 연결됩니다.


크롤링 시 반드시 알아야 할 주의사항

무분별한 크롤링은 기술 문제가 아니라 운영 문제로 이어질 수 있습니다.


요청 빈도 제한

짧은 시간에 많은 요청을 보내면 차단될 수 있습니다.

time.sleep으로 요청 간 간격을 둡니다.

실무에서는 매우 중요한 부분입니다.


사이트 정책 확인

이용 약관과 robots.txt를 확인해야 합니다.

금지된 크롤링은 법적 문제가 될 수 있습니다.

외주 작업 시 특히 주의가 필요합니다.


HTML 구조 변경 대비

웹 페이지 구조는 언제든 바뀔 수 있습니다.

크롤링 코드는 유지보수가 필요합니다.

에러 로그를 통해 빠르게 감지해야 합니다.


API 제공 여부 우선 확인

가능하다면 크롤링보다 API를 우선 사용합니다.

API가 안정성과 유지보수 측면에서 훨씬 유리합니다.

크롤링은 최후의 수단입니다.


다음 편 예고와 학습 흐름 정리

다음 편에서는 크롤링과 자동화를 안정화하는 예외 처리와 에러 관리 패턴을 다룹니다.


이번 편에서 반드시 이해해야 할 핵심

크롤링은 HTML 구조를 읽는 능력이 핵심입니다.

requests와 BeautifulSoup 조합이 기본입니다.

데이터 추출은 방어적으로 설계해야 합니다.


실무 자동화에서의 위치

크롤링은 데이터 수집 자동화의 출발점입니다.

파일 저장과 API 전송으로 자연스럽게 확장됩니다.

앞선 모든 편의 내용이 여기서 결합됩니다.


다음 편에서 다룰 내용

다음 편에서는 try except를 활용한 예외 처리를 다룹니다.

네트워크 오류와 파싱 오류 대응을 설명합니다.

자동화 스크립트를 실제 운영 가능한 수준으로 끌어올립니다.


추천 연습 방법

구조가 단순한 웹 페이지 하나를 골라 직접 크롤링해보세요.

HTML 구조가 바뀌었을 때 코드가 어떻게 깨지는지 확인해보는 것도 도움이 됩니다.

수집한 데이터를 파일로 저장하는 흐름까지 연결해보면 이해가 확실해집니다.

문의답변