Akashic Records

학습사이트 http://books.toscrape.com BFS 크롤링 본문

Web Crawling for Beginners

학습사이트 http://books.toscrape.com BFS 크롤링

Andrew's Akashic Records 2024. 4. 24. 13:43
728x90

위는 파이썬 웹 크롤러 프로그램의 개념적 다이어그램을 나타낸 이미지입니다. 이 이미지는 컴퓨터 화면에 코드가 표시되고, 웹 서버와의 데이터 요청 및 응답을 상징하는 화살표가 흐름을 보여주는 모습을 단순하고 교육적인 스타일로 표현하고 있습니다. 컴퓨터는 'Web Crawler'로, 웹 서버는 'Website'로 레이블이 붙어 있습니다.

 

http://books.toscrape.com/ 사이트를 너비 우선 탐색(BFS) 방식으로 크롤링하는 파이썬 스크립트를 제공하겠습니다. 이 스크립트는 각 페이지를 방문하고, 각 책의 정보(제목, 가격, 재고 상태)를 추출하며, 모든 페이지를 방문할 때까지 'Next' 버튼을 통해 다음 페이지로 넘어갑니다.

 

필요한 라이브러리 설치

pip install beautifulsoup4 requests

 

너비 우선 탐색(BFS) 웹 크롤러 코드

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
from collections import deque

def get_books_from_page(soup):
    """ 페이지에서 책들의 정보를 추출하는 함수 """
    books = []
    for book in soup.find_all('article', class_='product_pod'):
        title = book.find('h3').find('a')['title']
        price = book.find('p', class_='price_color').text
        stock = book.find('p', class_='instock availability').text.strip()
        books.append({'title': title, 'price': price, 'stock': stock})
    return books

def bfs_crawl(start_url, max_depth=3):
    """ 너비 우선 탐색을 사용하여 사이트 전체를 크롤링 """
    queue = deque([(start_url, 0)])  # URL과 현재 깊이를 저장합니다.
    visited = set()
    all_books = []

    while queue:
        current_url, depth = queue.popleft()
        if depth > max_depth:
            break
        if current_url in visited:
            continue
        
        visited.add(current_url)

        response = requests.get(current_url)
        soup = BeautifulSoup(response.text, 'html.parser')
        all_books.extend(get_books_from_page(soup))

        # 다음 페이지 링크 찾기
        next_button = soup.find('li', class_='next')
        if next_button:
            next_url = next_button.find('a')['href']
            next_page_url = urljoin(current_url, next_url)
            queue.append((next_page_url, depth+1))

    return all_books

# 시작 URL
start_url = 'http://books.toscrape.com/'
books = bfs_crawl(start_url, max_depth=3)

# 결과 출력
for book in books:
    print(book)

 

실행결과

코드 설명

  1. 함수 get_books_from_page:
    • BeautifulSoup 객체를 받아 해당 페이지에서 책의 정보를 추출합니다.
    • 책의 제목, 가격, 재고 상태를 딕셔너리로 저장하고, 모든 책 정보를 리스트로 반환합니다.
  2. 함수 bfs_crawl:
    • 시작 URL에서부터 크롤링을 시작하여, 너비 우선 탐색 방식으로 모든 페이지를 방문합니다.
    • 각 페이지마다 get_books_from_page 함수를 호출하여 책 정보를 수집합니다.
    • 페이지의 'Next' 버튼을 찾아 다음 페이지 URL을 큐에 추가합니다.

이 스크립트는 http://books.toscrape.com/ 사이트의 모든 페이지를 방문하며 책의 정보를 수집합니다. BFS를 사용함으로써, 사이트의 모든 책 정보를 체계적으로 방문하고 추출할 수 있습니다.

728x90
Comments