본문 바로가기

Study Information Technology

레시피 스크래퍼 만들기 다양한 웹사이트에서 요리 레시피 자동 수집 및 정리하기

728x90
반응형

레시피 스크래퍼 만들기: 다양한 웹사이트에서 요리 레시피 자동 수집 및 정리하기

Overview

레시피 스크래퍼는 인터넷에 있는 여러 요리 레시피를 자동으로 수집하고 정리하는 프로그램입니다. 이러한 스크래퍼는 요리 애호가들에게 매우 유용할 수 있으며, 특정 레시피를 빠르게 찾아볼 수 있도록 도와줍니다. 이 글에서는 레시피 스크래퍼를 만드는 과정과 관련된 기술, 구현 예시, 에러 처리 방법 등을 자세히 설명하겠습니다.

1. 웹 스크래핑의 기초 이해하기

웹 스크래핑(Web Scraping)은 웹사이트의 데이터를 자동으로 수집하는 기술입니다. 이를 위해 보통 HTML 문서를 파싱하고, 필요한 정보를 추출합니다. 웹 스크래핑을 위해 주로 사용하는 라이브러리에는 BeautifulSoupScrapy가 있습니다.

예시: BeautifulSoup을 사용한 간단한 스크래핑

import requests
from bs4 import BeautifulSoup

# 요청할 URL
url = 'https://www.example.com/recipes'

# 웹 페이지 요청
response = requests.get(url)

# HTML 파싱
soup = BeautifulSoup(response.text, 'html.parser')

# 레시피 제목 추출
recipes = soup.find_all('h2', class_='recipe-title')
for recipe in recipes:
print(recipe.get_text())

2. 필요한 라이브러리 설치

레시피 스크래퍼를 만들기 위해 다음과 같은 라이브러리를 설치해야 합니다:

  • requests: 웹 페이지에 HTTP 요청을 보내는 데 사용됩니다.
  • BeautifulSoup: HTML 파싱을 위한 라이브러리입니다.
  • pandas: 수집한 데이터를 정리하고 저장하는 데 유용합니다.

설치는 다음과 같은 명령어로 할 수 있습니다.

pip install requests beautifulsoup4 pandas

3. 스크래퍼의 구조 설계

레시피 스크래퍼는 다음과 같은 구조로 설계할 수 있습니다:

  • 데이터 수집: 웹사이트에서 데이터를 수집합니다.
  • 데이터 파싱: 수집한 데이터를 원하는 형식으로 파싱합니다.
  • 데이터 저장: 정리된 데이터를 파일이나 데이터베이스에 저장합니다.

예시: 스크래퍼 클래스 구조

class RecipeScraper:
def __init__(self, url):
self.url = url
self.recipes = []

def fetch_data(self):
response = requests.get(self.url)
soup = BeautifulSoup(response.text, 'html.parser')
return soup

def parse_recipes(self, soup):
recipes = soup.find_all('div', class_='recipe')
for recipe in recipes:
title = recipe.find('h2').get_text()
ingredients = recipe.find('ul', class_='ingredients').get_text()
self.recipes.append({'title': title, 'ingredients': ingredients})

def save_to_csv(self, filename='recipes.csv'):
import pandas as pd
df = pd.DataFrame(self.recipes)
df.to_csv(filename, index=False)

4. 에러 처리 및 예외 처리

웹 스크래핑에서는 다양한 에러가 발생할 수 있습니다. 다음은 자주 발생하는 에러와 그에 대한 해결책입니다.

  • HTTPError: 서버가 요청을 거부하는 경우 발생합니다.

  • 해결책: 요청할 URL이 유효한지 확인하고, 서버 상태를 체크합니다.

  • TimeoutError: 요청이 일정 시간 안에 완료되지 않으면 발생합니다.

  • 해결책: requests.get 호출 시 timeout 매개변수를 추가하여 최대 대기 시간을 설정합니다.

  • AttributeError: HTML 구조가 변경된 경우 발생합니다.

  • 해결책: 데이터 파싱 코드를 점검하고, HTML 구조에 맞게 수정합니다.

예시: 에러 처리 추가

def fetch_data(self):
try:
response = requests.get(self.url, timeout=10)
response.raise_for_status()  # HTTPError 발생 시 예외 처리
soup = BeautifulSoup(response.text, 'html.parser')
return soup
except requests.exceptions.HTTPError as http_err:
print(f'HTTP error occurred: {http_err}')
except requests.exceptions.Timeout:
print('The request timed out')
except Exception as err:
print(f'An error occurred: {err}')

5. 스크래퍼 실행 및 데이터 활용

이제 모든 코드가 준비되었으므로, 스크래퍼를 실행하여 데이터를 수집해보겠습니다. 이 데이터를 CSV 파일로 저장한 후, Excel이나 Google Sheets를 사용해 정리할 수 있습니다.

예시: 스크래퍼 실행

if __name__ == '__main__':
url = 'https://www.example.com/recipes'
scraper = RecipeScraper(url)
soup = scraper.fetch_data()
scraper.parse_recipes(soup)
scraper.save_to_csv()
print("레시피 수집 완료!")

6. 추가 고려사항

  • 웹사이트의 로봇 배제 표준 확인: 스크래핑하기 전에 해당 웹사이트의 robots.txt 파일을 확인하여 스크래핑이 허용되는지 확인해야 합니다.
  • 지속적인 업데이트: 웹사이트의 구조가 변경될 수 있으므로, 정기적으로 스크래퍼 코드를 점검하고 수정하는 것이 중요합니다.
  • IP 차단 방지: 너무 잦은 요청은 IP 차단을 초래할 수 있습니다. 이를 방지하기 위해 요청 간의 대기 시간을 설정하는 것이 좋습니다.

참고문서

728x90
반응형