본문 바로가기
오픈소스를 위한 기초 상식

Requests로 배우는 Python 웹 크롤링 기초와 실습

by 지나가는 프로도 2025. 1. 31.

Requests란 무엇인가?

 

웹 크롤링은 웹 페이지에서 데이터를 수집하는 중요한 기술입니다. Python의 Requests 라이브러리는 웹과의 통신을 간단하고 효율적으로 처리할 수 있도록 돕는 도구입니다. 이 글에서는 Requests 라이브러리가 무엇인지, 어떻게 사용하는지, 그리고 네이버 뉴스 헤드라인을 실습으로 크롤링하는 방법을 단계적으로 설명하겠습니다.


Requests는 Python에서 HTTP 요청을 간편하게 처리할 수 있도록 설계된 라이브러리입니다. Requests를 사용하면 웹 서버와 통신하여 HTML, JSON, 이미지 등 다양한 데이터를 가져오거나 서버에 데이터를 보낼 수 있습니다. 특히 Requests는 간결하고 직관적인 문법을 제공하여 초보자도 쉽게 사용할 수 있습니다.

Requests의 주요 특징

  • 간단한 사용법: URL에 요청을 보내고 응답을 처리하는 작업을 손쉽게 수행할 수 있습니다.
  • 다양한 HTTP 메서드 지원: GET, POST, PUT, DELETE 등 주요 HTTP 메서드를 지원합니다.
  • 자동 인코딩: UTF-8 등 다양한 문자 인코딩을 자동으로 처리합니다.
  • 쿠키와 세션 관리: 쿠키를 사용하거나 세션을 유지할 수 있습니다.

Requests 설치

Requests는 Python 표준 라이브러리가 아니므로 설치가 필요합니다. 설치는 pip 명령어를 통해 간단히 수행할 수 있습니다:

pip install requests

 

Requests의 기본 사용법

Requests를 사용하여 웹 페이지에서 데이터를 가져오는 기본 예제를 살펴보겠습니다. 여기서는 HTTP GET 요청을 통해 웹 페이지의 HTML 코드를 가져오는 방법을 보여줍니다.

예제: HTTP GET 요청

import requests

url = 'https://example.com'  # 요청을 보낼 URL
response = requests.get(url)

# HTTP 응답 코드 확인
print(response.status_code)  # 200이면 성공

# 응답 내용 출력
print(response.text)  # HTML 소스 출력

주요 메서드 설명

  1. requests.get(url): GET 요청을 보내 데이터를 가져옵니다.
  2. response.status_code: HTTP 응답 상태 코드를 반환합니다.
  3. response.text: 서버에서 반환된 응답 데이터를 텍스트(HTML)로 출력합니다.

 

실습: Requests를 사용한 네이버 뉴스 헤드라인 크롤링

 

3.1 목표 설정

네이버 뉴스 메인 페이지에서 최신 헤드라인 뉴스 제목을 가져와 출력하는 프로그램을 작성해 보겠습니다. HTML 구조를 분석하여 원하는 데이터를 추출합니다.

3.2 HTML 분석

개발자 도구(F12)를 사용해 네이버 뉴스 메인의 HTML 구조를 확인합니다. 헤드라인 뉴스는 <div> 또는 <ul> 태그로 구성된 특정 섹션에 포함되어 있으며, 각 뉴스 제목은 <a> 태그 안에 텍스트로 저장되어 있습니다.

3.3 코드 구현

아래는 Requests를 사용해 네이버 뉴스 헤드라인을 가져오는 코드입니다:

import requests
from bs4 import BeautifulSoup

# 네이버 메인 페이지 URL
url = 'https://www.naver.com'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}

# HTTP GET 요청
response = requests.get(url, headers=headers)

# 요청이 성공했는지 확인
if response.status_code == 200:
    soup = BeautifulSoup(response.text, 'html.parser')

    # 헤드라인 뉴스 섹션 선택 (HTML 구조에 따라 클래스 이름 변경 필요)
    news_section = soup.find('div', class_='MediaNewsView-module__news_desc___a55yg')
    headlines = news_section.find_all('a')

    # 헤드라인 뉴스 출력
    for i, headline in enumerate(headlines, 1):
        print(f"{i}위: {headline.text.strip()}")
else:
    print(f"HTTP 요청 실패: {response.status_code}")

3.4 코드 설명

  1. HTTP 요청:
    • requests.get() 메서드를 사용해 네이버 메인 페이지에 GET 요청을 보냅니다.
    • headers에서 User-Agent를 설정해 웹 서버가 크롤링 요청을 차단하지 않도록 합니다.
  2. HTML 파싱:
    • BeautifulSoup를 사용해 HTML 코드를 파싱합니다.
    • 특정 섹션(MediaNewsView-module__news_desc___a55yg)에서 뉴스 제목을 포함하는 <a> 태그를 찾습니다.
  3. 데이터 출력:
    • 각 뉴스 제목의 텍스트를 추출하고 순서대로 출력합니다.

3.5 실행 결과

코드를 실행하면 다음과 같이 네이버 뉴스 헤드라인이 출력됩니다:

1위: "정부, 전세 사기 특별법 발표"
2위: "날씨 급변, 대설 경보 발령"
3위: "경제 회복세, 주가 상승 지속"
...

4. Requests 사용 시 주의사항

  1. HTTP 상태 코드 확인:
    • 요청이 성공했는지(200 OK) 확인 후 응답 데이터를 처리합니다.
  2. User-Agent 설정:
    • 기본 User-Agent를 사용하면 일부 웹 서버에서 요청이 차단될 수 있으므로 브라우저 User-Agent를 설정합니다.
  3. robots.txt 준수:
    • 크롤링 대상 웹사이트의 robots.txt 파일을 확인해 허용된 범위 내에서 데이터를 수집합니다.
  4. HTML 구조 변경 대비:
    • 웹사이트의 HTML 구조가 변경될 경우 크롤링 코드가 작동하지 않을 수 있으므로, 정기적으로 점검해야 합니다.

결론

Requests 라이브러리는 HTTP 요청을 간단히 처리할 수 있는 강력한 도구입니다. 본 글에서는 Requests의 기본 개념과 사용법, 그리고 네이버 뉴스 헤드라인 크롤링 실습을 통해 실용적인 예제를 살펴보았습니다. Requests를 활용해 다양한 웹 데이터 수집 작업에 도전해 보세요!