본문 바로가기

수학 & 코딩

URL 주소 크롤링(무한) 파이썬 코드 - 네이버를 시작으로

728x90
import requests
from bs4 import BeautifulSoup
from requests.exceptions import SSLError
from urllib.parse import urlparse, urljoin

def get_links(url):
    """
    주어진 URL에서 모든 링크를 추출한다.
    """
    # 페이지를 가져온다.
    try:
        response = requests.get(url, verify=True)

        # BeautifulSoup을 사용하여 HTML을 파싱한다.
        soup = BeautifulSoup(response.text, "html.parser")

        # 페이지의 모든 링크를 찾아서 리스트에 추가한다.
        links = []
        for link in soup.find_all('a'):
            href = link.get('href')
            if href is not None:
                absolute_link = urljoin(url, href)
                parsed_link = urlparse(absolute_link)
                #if parsed_link.scheme in ('http', 'https') and parsed_link.netloc not in seen_domains:
                if parsed_link.scheme in ('http', 'https'):
                    links.append(absolute_link)

        return links
    except SSLError:
        return []


def crawl(url):
    """
    주어진 URL에서 시작하여 재귀적으로 모든 링크를 추적한다.
    """
    # URL의 도메인을 추출한다.
    parsed_url = urlparse(url)
    seen_domains.add(parsed_url.netloc)

    # URL에서 모든 링크를 추출한다.
    links = get_links(url)

    # 링크를 따라가서 재귀적으로 처리한다.
    for link in links:
        if link not in seen_links:
            seen_links.add(link)
            print(link)
            crawl(link)


# 시작 URL을 정의한다.
start_url = "https://www.naver.com"

# 이미 방문한 도메인과 링크를 추적하는 세트를 초기화한다.
seen_domains = set()
seen_links = set()

# 크롤링을 시작한다.
crawl(start_url)


728x90