Akashic Records

URL 깊이 우선 탐색(DFS) 웹 크롤러 본문

Web Crawling for Beginners

URL 깊이 우선 탐색(DFS) 웹 크롤러

Andrew's Akashic Records 2024. 4. 24. 10:55
728x90

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

 

깊이 우선 탐색(DFS) 알고리즘을 사용하여 웹 페이지를 크롤링하는 파이썬 코드를 설계하겠습니다. DFS 알고리즘은 각 링크를 따라 최대한 깊이 들어가면서 크롤링을 진행하며, 스택이나 재귀 함수를 사용하여 구현할 수 있습니다. 여기서는 재귀 함수를 사용하여 구현하겠습니다.

 

필요한 라이브러리 설치

pip install beautifulsoup4 requests

 

깊이 우선 탐색(DFS) 웹 크롤러 코드

import requests
from urllib.parse import urljoin, urlparse
from bs4 import BeautifulSoup

def is_valid_url(base_url, url):
    """ 동일 도메인 내의 URL인지 검사하고, 유효한 링크인지 확인합니다. """
    parsed_base = urlparse(base_url)
    parsed_url = urlparse(url)
    if parsed_base.netloc != parsed_url.netloc:
        return False
    if not parsed_url.scheme.startswith('http'):
        return False
    return True

def get_links(url):
    """ 주어진 URL 페이지에서 모든 링크를 추출합니다. """
    try:
        response = requests.get(url)
        soup = BeautifulSoup(response.text, 'html.parser')
        links = set()
        for link in soup.find_all('a', href=True):
            full_url = urljoin(url, link['href'])
            if is_valid_url(url, full_url):
                links.add(full_url)
        return links
    except requests.exceptions.RequestException:
        return set()

def dfs_crawl(url, visited, max_depth, current_depth=0):
    """ 깊이 우선 탐색(DFS)을 사용하여 웹 크롤링을 실행합니다. """
    if current_depth > max_depth:
        return
    if url in visited:
        return
    visited.add(url)
    print(f"Visiting: {url} at depth {current_depth}")

    links = get_links(url)
    for link in links:
        dfs_crawl(link, visited, max_depth, current_depth + 1)

def start_crawling(start_url, max_depth=3):
    visited = set()
    dfs_crawl(start_url, visited, max_depth)
    print("Crawling finished.")

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

 

코드 설명

  1. 함수 is_valid_url: 주어진 URL이 시작 URL과 같은 도메인을 가지는지, 그리고 httphttps 프로토콜을 사용하는지 확인합니다.
  2. 함수 get_links: BeautifulSoup을 사용하여 페이지에서 모든 <a> 태그의 href 속성을 읽고, 절대 URL로 변환한 후, 유효한 URL만 반환합니다.
  3. 함수 dfs_crawl: 깊이 우선 탐색 로직을 사용하여 웹 크롤링을 수행합니다. 재귀 호출을 통해 각 링크를 따라 최대 깊이(max_depth)까지 탐색합니다.
  4. 함수 start_crawling: 크롤링을 시작하기 위해 visited 집합과 dfs_crawl 함수를 초기화하고 호출합니다.

DFS 크롤러는 특히 깊은 링크 구조를 가진 사이트에서 유용합니다. 그러나 너무 깊은 재귀는 스택 오버플로를 일으킬 수 있으므로, max_depth 값을 적절히 설정하는 것이 중요합니다. 또한, 실제 사용 시에는 더 많은 오류 처리와 로봇 배제 표준(robots.txt) 준수를 고려해야 합니다.

728x90
Comments