본문 바로가기
DataAnalysis

스크랩핑과 크롤링

by Head of the Laboratory 2024. 4. 16.

웹 스크래핑 (Web Scraping)
웹 스크래핑은 웹 사이트의 HTML 코드에서 데이터를 추출하는 과정을 의미합니다. 이것은 보통 웹 페이지의 특정 부분에서 정보를 수집하는 작업입니다. 예를 들어, 특정 웹 페이지에서 제품 가격, 뉴스 기사, 블로그 게시물 등을 수집하고 해당 정보를 데이터베이스에 저장하거나 분석에 사용할 수 있습니다. BeautifulSoup과 같은 라이브러리를 사용하여 특정 HTML 요소를 선택하고 데이터를 추출하는 것이 일반적입니다.

웹 크롤링 (Web Crawling)
웹 크롤링은 자동화된 방식으로 웹을 탐색하고 정보를 수집하는 프로세스를 의미합니다. 크롤러 또는 스파이더라고도 불리는 프로그램이 시작 URL에서 출발하여 하이퍼링크를 따라 웹 사이트를 탐색하고 웹 페이지의 내용을 수집합니다. 이를 통해 인덱싱된 정보를 검색 엔진에 제공하거나 특정 웹 사이트의 내용을 분석하는 등의 작업을 수행할 수 있습니다.

차이점

목적

웹 스크래핑 : 특정 웹 페이지에서 데이터를 추출하는 데 중점을 둡니다.

웹 크롤링 : 여러 웹 페이지를 자동으로 탐색하여 정보를 수집하는 데 중점을 둡니다.

범위

웹 스크래핑 : 보통 한 번에 하나의 웹 페이지에서 데이터를 추출합니다.

웹 크롤링 : 여러 웹 페이지를 순회하고 탐색하여 데이터를 수집합니다.

활용 

웹 스크래핑 : 보통 특정 데이터를 수집하고 분석하는 데 사용됩니다. 

웹 크롤링 : 검색 엔진 인덱싱, 웹 사이트의 구조 및 링크 분석, 특정 웹 페이지의 변경 사항을 모니터링하는 등의 다양한 목적으로 사용됩니다.

따라서 웹 스크래핑은 작은 규모의 데이터 수집 및 분석에 사용되는 반면, 웹 크롤링은 대규모의 웹 사이트를 탐색하고 인덱싱하여 정보를 수집하는 데 사용됩니다.

 

pip install gensim nltk konlpy

import requests
from bs4 import BeautifulSoup

url = "https://www.aitimes.com/news/articleView.html?idxno=139086"

# 페이지 내용 가져오기
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

# 뉴스 내용이 포함된 article 요소 찾기
article = soup.find("article", {"id": "article-view-content-div"})

# article 요소가 존재하면 그 안의 모든 텍스트를 가져옴
if article:
    news_content = article.get_text()
    print(news_content)
else:
    print("뉴스 내용을 찾을 수 없습니다.")

 

코드 예시(웹 크롤링)

from bs4 import BeautifulSoup
import requests

# 웹페이지 URL을 설정
url = 'https://www.aitimes.com/'

# 웹페이지로부터 HTML을 가져옴
# requests.get 함수를 사용하여 웹 서버에 요청하고 응답을 받음
response = requests.get(url)
html = response.text

# BeautifulSoup 객체를 생성하여 HTML 코드를 파싱
# 이 객체를 사용하여 HTML 내의 데이터를 쉽게 찾고 조작
soup = BeautifulSoup(html, 'html.parser')

# HTML에서 각 기사 정보를 포함하고 있는 요소를 선택
# '#skin-200 .item' CSS 선택자를 사용하여 특정 부분의 HTML을 찾아냄
articles = soup.select('#skin-200 .item')

# 추출된 기사 정보를 출력
# 각 기사의 순위, 제목, 링크를 찾아서 출력
for article in articles:
    number = article.find('em', class_='number').get_text(strip=True)  # 기사 순위를 추출
    title = article.find('span', class_='auto-titles').get_text(strip=True)  # 기사 제목을 추출
    link = article.find('a')['href']  # 기사의 링크를 추출
    # 기사 순위, 제목, 링크를 포맷에 맞게 출력
    print(f"{number}: {title} (Link: {link})")

 

주의사항

서버 부하 최소화: 너무 빠른 속도로 많은 요청을 보내지 마세요. 서버에 과부하를 주어 웹사이트의 정상적인 운영을 방해할 수 있습니다. 요청 간에 시간 지연을 두거나, 접근 빈도를 조절하여 서버 부하를 관리하세요.

유저 에이전트 설정: 크롤링 시 자신의 스크립트에 유저 에이전트를 설정하여, 웹 서버가 이를 일반 브라우저의 요청으로 인식하도록 합니다. 이는 일부 사이트가 기본 파이썬 유저 에이전트를 차단하기도 하기 때문입니다.

오류 처리: 네트워크 문제나 웹사이트의 변경으로 인해 크롤링 중에 오류가 발생할 수 있습니다. 예외 처리 구문을 이하여 로깅을 통해 오류 내용을 기록하고, 실패한 요청은 재시도하는 로직을 구현하여 데이터 손실을 최소화할 수 있습니다.

페이지 구조 분석: 웹사이트의 HTML 구조를 정확히 이해하는 것이 필요합니다.

개발자 도구(F12)를 열어 HTML 구조를 살펴 볼 수 있습니다. HTML구조를 파악한 후 자신이 원하는 부분의 HTML을 찾고 코드에 적용합니다.


동적 콘텐츠 처리: JavaScript로 로드되는 동적 콘텐츠를 처리하기 위해 Selenium과 같은 도구를 사용할 수 있습니다. 이는 웹 페이지가 완전히 로드된 후에 데이터를 크롤링할 수 있게 해줍니다.