PostgreSQL

4강: 웹 크롤링 데이터 저장

알세지 2024. 5. 29. 12:19

4강: 웹 크롤링 데이터 저장

목차

  1. 웹 크롤링 기본 개념 및 사용법
  2. Python으로 웹 크롤러 작성하기
  3. 크롤링한 데이터 PostgreSQL에 저장하기
  4. 오류 처리 및 예외 상황 다루기

1. 웹 크롤링 기본 개념 및 사용법

웹 크롤링은 웹 페이지의 데이터를 자동으로 추출하는 기술입니다. 이를 통해 웹 사이트에서 필요한 정보를 수집할 수 있습니다.

웹 크롤링의 활용 사례

  • 뉴스 기사 수집
  • 상품 정보 수집
  • 데이터 분석을 위한 자료 수집

웹 크롤링 도구

  • requests: 웹 페이지 요청을 위해 사용
  • BeautifulSoup: HTML 파싱을 위해 사용

2. Python으로 웹 크롤러 작성하기

웹 크롤러를 작성하여 웹 페이지의 데이터를 추출합니다.

필요한 패키지 설치

pip install requests beautifulsoup4

웹 크롤러 작성

아래 코드는 예시로서 특정 웹 페이지의 제목을 크롤링합니다.

import requests
from bs4 import BeautifulSoup

# 웹 페이지 요청
url = "http://example.com"
response = requests.get(url)

# 응답 확인
if response.status_code == 200:
    # HTML 파싱
    soup = BeautifulSoup(response.text, "html.parser")
    # 페이지 제목 추출
    title = soup.title.string
    print(f"Page title: {title}")
else:
    print(f"Failed to retrieve the page. Status code: {response.status_code}")

3. 크롤링한 데이터 PostgreSQL에 저장하기

크롤링한 데이터를 PostgreSQL 데이터베이스에 저장합니다.

데이터베이스 테이블 생성

먼저 데이터를 저장할 테이블을 생성합니다.

CREATE TABLE web_data (
    id SERIAL PRIMARY KEY,
    title VARCHAR(255),
    url VARCHAR(255),
    retrieved_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

데이터 삽입 코드 작성

크롤링한 데이터를 데이터베이스에 삽입하는 코드를 작성합니다.

import psycopg2

# PostgreSQL 연결 설정
conn = psycopg2.connect(
    host="localhost",
    database="mydatabase",
    user="yourusername",
    password="yourpassword"
)

cur = conn.cursor()

# 데이터 삽입 함수
def insert_web_data(title, url):
    cur.execute(
        "INSERT INTO web_data (title, url) VALUES (%s, %s)",
        (title, url)
    )
    conn.commit()

# 웹 크롤러 코드
url = "http://example.com"
response = requests.get(url)
if response.status_code == 200:
    soup = BeautifulSoup(response.text, "html.parser")
    title = soup.title.string
    insert_web_data(title, url)
    print("Data inserted successfully")
else:
    print(f"Failed to retrieve the page. Status code: {response.status_code}")

# 연결 닫기
cur.close()
conn.close()

4. 오류 처리 및 예외 상황 다루기

웹 크롤링 및 데이터베이스 작업 중 발생할 수 있는 오류를 처리하고, 예외 상황을 다룹니다.

요청 오류 처리

웹 페이지 요청 중 발생할 수 있는 오류를 처리합니다.

try:
    response = requests.get(url)
    response.raise_for_status()  # HTTP 오류 발생 시 예외 발생
except requests.exceptions.HTTPError as http_err:
    print(f"HTTP error occurred: {http_err}")
except Exception as err:
    print(f"Other error occurred: {err}")

데이터베이스 오류 처리

데이터베이스 작업 중 발생할 수 있는 오류를 처리합니다.

try:
    # 데이터베이스 작업
    insert_web_data(title, url)
except psycopg2.Error as db_err:
    print(f"Database error occurred: {db_err}")

흔하게 발생하는 오류 및 해결 방법

  • 오류: requests.exceptions.ConnectionError: Failed to establish a new connection
    • 해결 방법: URL이 올바른지 확인하고, 인터넷 연결 상태를 점검하세요.
  • 오류: psycopg2.IntegrityError: duplicate key value violates unique constraint
    • 해결 방법: 데이터 삽입 전에 중복된 데이터가 있는지 확인하세요.

마무리

웹 크롤링을 통해 데이터를 수집하고, PostgreSQL에 저장하는 방법을 학습했습니다. 다음 강의에서는 FastAPI를 통해 수집한 데이터를 웹에 게시하는 방법을 학습하겠습니다.