ko
English
Español
中國人
Tiếng Việt
Deutsch
Українська
Português
Français
भारतीय
Türkçe
Italiano
Gaeilge
اردو
Indonesia
Polski 웹 크롤러는 가격 모니터링, 뉴스 집계, 경쟁사 분석, 검색 엔진 인덱싱 및 웹사이트에서 구조화된 데이터를 수집해야 하는 기타 작업에 사용됩니다. 이 가이드는 프로젝트 계획 및 기술 선택부터 환경 설정 및 데이터 저장에 이르기까지 웹 크롤러를 처음부터 구축하는 방법을 단계별로 안내합니다. 이 가이드는 나중에 더 복잡하고 대규모 프로젝트로 확장할 수 있는 기반을 제공합니다.
웹 페이지를 자동으로 방문하여 정보를 수집하는 프로그램입니다. 사이트에 HTTP 호출을 전송하고 각 페이지의 HTML을 검색한 다음 해당 HTML을 처리하여 필요한 데이터를 추출하는 방식으로 작동합니다. 그런 다음 내부 링크를 따라 미리 정의된 제한 또는 중지 조건에 도달할 때까지 프로세스를 반복합니다. 이 프로세스는 웹 스크래핑과 동일하지 않습니다. 자세한 비교는 다음을 참조하세요 웹 스크래핑과 웹 크롤링.
이러한 도구는 다음과 같은 용도로 널리 사용됩니다:
이러한 시나리오에서는 자체 웹 크롤러를 구축하는 것이 더 나은 접근 방식인 경우가 많습니다. 프로그램을 정확한 요구 사항에 맞게 조정하고 요청 빈도를 제어하며 수집할 정보 조각과 방법을 정의할 수 있기 때문입니다.
코딩을 시작하기 전에 프로젝트의 핵심 매개변수를 정의하여 일반적인 문제를 방지하고 안정적인 작동을 보장하세요.
잘 계획된 도구는 안정적으로 작동하고 리소스를 효율적으로 사용하며 고품질의 결과를 제공합니다.
Python, Java, PHP 등 여러 프로그래밍 언어로 웹 크롤러를 구축할 수 있습니다. Python은 간단한 구문과 HTTP 요청 및 HTML 구문 분석을 위한 풍부한 라이브러리 에코시스템(예: 요청, BeautifulSoup, lxml)이 돋보입니다. Java는 대규모 및 엔터프라이즈 프로젝트를 위한 확실한 선택입니다. PHP는 웹 개발에서 더 일반적이며 독립형 크롤러에는 덜 편리합니다.
우선 기본 기능을 빠르게 구현하고 테스트할 수 있어 일반적으로 최적의 선택인 Python으로 웹 크롤러를 구축하는 방법을 고려해 보겠습니다.
먼저 파이썬을 설치하려면 공식 웹사이트. 그런 다음 사용할 핵심 라이브러리인 HTTP 요청 전송을 위한 요청과 HTML 구문 분석을 위한 BeautifulSoup을 설치합니다:
pip install requests beautifulsoup4
또한 처음부터 프로젝트 구조를 정리하는 것이 좋습니다. 주요 로직, 구성 및 유틸리티를 위한 별도의 파일을 만드는 것이 좋습니다. 이렇게 하면 향후 유지 관리 및 확장이 훨씬 쉬워집니다.
기본 스크립트는 요청 보내기, HTML 처리, 링크 따라가기의 세 가지 주요 부분으로 구성될 수 있습니다.
from bs4 import BeautifulSoup
import time
import random
# Configuration
url = "https://quotes.toscrape.com/" # Replace this with your target site
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"
}
timeout = 5 # server response timeout
max_retries = 3 # maximum number of retries on errors
# You can add your proxy here if needed
proxies = {
"http": "http://username:password@proxyserver:port",
"https": "https://username:password@proxyserver:port"
}
# Function to check access via robots.txt
def can_crawl(base_url, path="/"):
try:
robots_url = base_url.rstrip("/") + "/robots.txt"
r = requests.get(robots_url, headers=headers, timeout=timeout)
if r.status_code == 200 and f"Disallow: {path}" in r.text:
print(f"Service {path} forbidden for scraping robots.txt")
return False
except requests.RequestException:
# If robots.txt is unavailable, continue
pass
return True
# Main logic
if can_crawl(url):
for attempt in range(max_retries):
try:
response = requests.get(url, headers=headers, timeout=timeout, proxies=proxies)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'lxml')
# Collect links
links = [a['href'] for a in soup.find_all('a', href=True)] # You can change selector here
print("Found links:", links)
# Delay between requests to simulate more realistic behavior
time.sleep(random.uniform(3, 7)) # better than a fixed 5-second delay
break # if everything succeeds, exit the retry loop
except requests.RequestException as e:
print(f"Request error (attempt {attempt+1}): {e}")
wait = 2 ** attempt
print(f"Waiting {wait} seconds before retry...")
time.sleep(wait)
else:
print("The crawler cannot process this resource due to robots.txt rules")
이 스크립트는 요청 만들기, HTML 구문 분석, 링크 수집 등 기본적인 워크플로우를 보여줍니다.
여러 페이지로 구성된 사이트의 경우 모든 페이지를 통과하는 루프가 필요합니다. 예시:
for page in range(1, 6):
url = f"https://google.com/page/{page}"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
# data processing
책임 있는 크롤링에는 사이트의 robots.txt 파일을 확인하고 해당 규칙을 따르는 것이 포함됩니다. 또한 서버에 과부하가 걸리지 않도록 요청 사이에 지연을 도입해야 합니다. time.sleep() 함수를 사용하면 페이지 가져오기 사이에 일시 정지를 추가할 수 있습니다.
import time
from bs4 import BeautifulSoup
for page in range(1, 6):
url = f"https://google.com/page/{page}"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
# data processing
time.sleep(5) # delay in seconds
수집된 세부 정보를 CSV 또는 JSON과 같은 편리한 형식으로 저장할 수 있습니다. 예를 들어 링크 목록을 저장할 수 있습니다:
import json
data = {"links": links}
with open("links.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=4)
이 단계를 수행하면 고급 작업을 위해 확장할 수 있는 기본 웹 크롤러가 완성됩니다. 코드를 확장하거나, 프록시 지원을 통합하거나, 많은 수의 페이지를 처리하거나, 복잡한 데이터 수집 시나리오를 위해 스크랩과 같은 더 강력한 프레임워크로 이동할 수 있습니다.
댓글: 0