티스토리 뷰
학습목표
- 웹 크롤링의 기본 개념과 BeautifulSoup 사용법을 이해한다.
- 실제 웹사이트에서 필요한 데이터를 가져올 수 있는 능력을 배운다.
- 크롤링한 데이터를 저장하고 활용하는 방법을 익힌다.
1. 웹 크롤링 (Web Crawling) 개요
거미가 거미줄을 기어다니는 것처럼
1) 웹 크롤링 (Web Crawling) 이란?
웹 크롤링(Web Crawling)은 인터넷 상의 다양한 웹 페이지를 탐색하며 데이터를 수집하는 기술이다. "크롤링(Crawling)"이라는 용어는 거미(Spider)가 거미줄(Web)을 탐색하듯, 프로그램이 웹(Web)을 탐색하면서 데이터를 수집하는 방식을 비유적으로 표현한 데서 유래되었다. 초기 인터넷 시대에는 웹사이트의 수가 폭발적으로 증가하면서 사람이 원하는 정보를 효율적으로 찾는 것이 어려워졌고, 이를 해결하기 위해 자동화 도구인 "웹 크롤러"가 개발되었다. 당시 개발자들은 이 프로그램이 거미처럼 전 세계 웹사이트를 탐색하는 모습을 상상하며 "크롤러"라는 이름을 붙였다. 구글의 초창기 웹 크롤러는 "Googlebot"이라는 이름으로 불리며 수백만 개의 웹 페이지를 탐색하여 오늘날의 강력한 검색 엔진의 기반을 마련했다. 웹 크롤러는 도서관 사서가 책장을 하나씩 훑으며 책 정보를 기록하는 모습이나, 부지런한 우체부가 여러 집을 방문해 편지를 배달하고 기록하는 모습에 비유될 수 있다.
즉, 웹 크롤링(Web Crawling)이란 인터넷 상의 데이터를 자동으로 수집하고 저장하는 기술을 의미한다. 웹 크롤링을 통해 사용자는 특정 웹 페이지에서 필요한 정보를 추출하고, 이를 다양한 목적(데이터 분석, 정보 검색, 머신러닝 데이터 생성 등)에 활용할 수 있다.
- 웹 크롤러(Web Crawler)
- 특정 웹 페이지의 HTML 구조를 분석하고, 그 안에서 텍스트, 이미지, 링크 등 사용자가 지정한 데이터를 가져오는 도구이다.
- 예: 구글의 검색 엔진 크롤러는 전 세계 웹 페이지를 크롤링하여 검색 결과를 구성한다.
2) 웹 크롤링의 사용 목적 및 특징
- 데이터 분석을 위한 데이터 수집
- 뉴스 기사를 수집하여 트렌드 분석.
- 쇼핑몰의 상품 정보를 비교하여 가격 동향 파악.
- 주식 데이터를 분석하여 투자 전략 수립.
- 소셜 미디어에서 사용자 의견을 수집하여 감성 분석 수행.
- 웹 크롤링의 장점
- 대량의 데이터를 빠르게 수집할 수 있다.
- 다양한 소스에서 데이터를 통합하여 분석할 수 있다.
- 사람의 개입 없이 자동화된 데이터 수집이 가능하다.
- 웹 크롤링의 주의 사항
- 법적, 윤리적 고려사항
- 웹사이트 이용 약관을 준수해야 한다.
- 허가 없이 과도한 요청을 보내는 것은 법적 문제가 될 수 있다.
- 웹사이트의 로봇 배제 표준(Robots.txt)을 확인하여 허용된 크롤링 범위를 준수해야 한다.
- 기술적 제한
- 일부 웹사이트는 크롤링 방지 기술(캡차, IP 차단 등)을 적용한다.
- 크롤링 대상 웹 페이지의 구조가 자주 변경될 수 있다.
- 법적, 윤리적 고려사항
3) 웹 크롤링의 작동 원리
- HTTP 요청(Request) : 크롤러가 특정 URL에 접근하여 웹 페이지 데이터를 요청한다.
- HTML 응답(Response) : 요청받은 서버가 웹 페이지의 HTML 데이터를 반환한다.
- 데이터 파싱(Parsing) : 반환된 HTML 데이터를 분석하여 필요한 정보를 추출한다.
- 데이터 저장(Storage) : 추출된 데이터를 파일(CSV, JSON 등)로 저장하거나 데이터베이스에 기록한다.
4) 크롤링 도구와 기술
- 도구
- BeautifulSoup: 파이썬 기반의 HTML, XML 파싱 도구.
- Selenium: 웹 브라우저를 제어하여 동적 콘텐츠를 크롤링할 수 있는 도구.
- Scrapy: 고성능의 웹 크롤링 프레임워크.
- 기술
- HTTP 요청 및 응답 처리: requests 라이브러리를 활용.
- HTML 파싱: BeautifulSoup을 사용하여 HTML 구조 탐색 및 데이터 추출.
- 데이터 저장: 추출한 데이터를 CSV, JSON 또는 데이터베이스로 저장.
2. 웹 크롤링 전 알아야할 지식
먼저, HTML 태그와 DOM(Document Object Model)을 분석하는 능력이 필요하다. 웹 페이지의 원하는 데이터를 효율적으로 추출하려면 HTML 구조를 파악하고, 태그와 요소 간의 관계를 명확히 이해해야 한다.
또한, HTTP 프로토콜에 대한 기본 지식을 갖추는 것이 중요하다. HTTP 요청(GET, POST 등)을 통해 데이터를 가져오고, 응답 상태 코드(예: 200은 성공, 404는 페이지 없음)를 분석하여 작업 상태를 점검할 수 있어야 한다.
마지막으로, JavaScript로 로드되는 동적 콘텐츠에 대한 이해가 필요하다. 정적 콘텐츠는 HTML 소스에 이미 포함되어 있어 쉽게 수집할 수 있지만, 동적 콘텐츠는 JavaScript에 의해 브라우저에서 로드되므로 Selenium과 같은 브라우저 자동화 도구가 필요할 수 있다.
이제 크롬 개발자 도구를 활용하여 웹 페이지의 소스를 보는 방법, HTML 기본 구조, CSS 선택자 활용법, 그리고 Requests 라이브러리를 사용한 기본 크롤링 방법을 살펴보자.
1) 크롬에서 HTML 구조 살펴보기
웹 페이지의 HTML 구조를 분석하려면 크롬 브라우저의 개발자 도구를 활용하면 된다.
- 개발자 도구 열기:
- 웹 페이지에서 마우스 오른쪽 버튼 클릭 → "검사"를 선택하거나 Ctrl + Shift + I (Mac에서는 Cmd + Option + I) or F12를 누른다.
- 요소(Element) 탭:
- HTML 태그 구조를 확인할 수 있다.
- 마우스를 요소 위에 올리면 해당 요소가 웹 페이지에서 하이라이트되어 위치를 쉽게 파악할 수 있다.
- 특정 요소 선택:
- 왼쪽 위의 포인터 모양 아이콘(요소 선택)을 클릭한 후, 페이지의 특정 영역을 클릭하면 해당 요소의 HTML과 CSS를 바로 확인할 수 있다.
- 복사 기능 활용:
- HTML 경로나 CSS 선택자를 복사하려면 요소를 마우스 오른쪽 버튼으로 클릭하고 "Copy" → "Copy selector" 또는 "Copy XPath"를 선택한다.
2) HTML 기본 구조
HTML은 웹 페이지의 골격을 이루는 마크업 언어이다. 기본 구조는 다음과 같다:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>웹 페이지 제목</title>
</head>
<body>
<h1>웹 페이지의 주요 제목</h1>
<p>여기에 콘텐츠가 들어갑니다.</p>
<a href="https://example.com">링크</a>
</body>
</html>
- <!DOCTYPE html>: HTML5 문서를 선언.
- <html>: 전체 HTML 문서를 감싸는 루트 태그.
- <head>: 메타정보(문자셋, 뷰포트, 제목 등)를 포함.
- <body>: 실제 화면에 표시되는 콘텐츠를 포함.
3) CSS 선택자
CSS 선택자는 HTML 요소를 식별하여 스타일을 적용하거나 크롤링 시 데이터를 추출하는 데 사용된다.
- 기본 선택자:
- 태그 선택자: p, h1, div 등 특정 태그를 선택.
- 클래스 선택자: .classname (예: .menu).
- 아이디 선택자: #idname (예: #header).
- 조합 선택자:
- 하위 선택자: div p (div 내부의 모든 p 태그).
- 자식 선택자: div > p (div의 직접 자식인 p 태그).
- 속성 선택자: input[type="text"] (속성이 "text"인 input 태그).
- 특수 선택자:
- :nth-child(n): n번째 자식 요소.
- :first-child, :last-child: 첫 번째 또는 마지막 자식 요소.
/* 모든 <p> 태그 */
p { color: blue; }
/* 클래스가 'menu'인 요소 */
.menu { font-size: 16px; }
/* id가 'header'인 요소 */
#header { background-color: gray; }
다음은 CSS 선택자의 종류를 테이블로 정리한 것이다:
선택자 | 형식 | 설명 | 예시 |
전체 선택자 | * | 모든 HTML 요소를 선택. | * { margin: 0; } |
태그 선택자 | tagname | 특정 HTML 태그를 선택. | p { color: blue; } |
클래스 선택자 | .classname | 특정 클래스 속성을 가진 요소를 선택. | .menu { font-size: 14px; } |
아이디 선택자 | #idname | 특정 아이디 속성을 가진 요소를 선택. | #header { background: gray; } |
그룹 선택자 | selector, selector | 여러 요소를 동시에 선택. | h1, h2, h3 { font-weight: bold; } |
하위 선택자 | ancestor descendant | 특정 조상 요소의 모든 자손 요소를 선택. | div p { color: green; } |
자식 선택자 | parent > child | 특정 부모 요소의 직계 자식 요소만 선택. | ul > li { list-style: none; } |
형제 선택자 | element + sibling | 특정 요소의 바로 다음 형제 요소를 선택. | h1 + p { margin-top: 10px; } |
일반 형제 선택자 | element ~ siblings | 특정 요소 뒤에 나오는 모든 형제 요소를 선택. | h1 ~ p { color: gray; } |
속성 선택자 | [attribute] | 특정 속성을 가진 요소를 선택. | input[type="text"] { } |
속성값 선택자 | [attribute=value] | 특정 속성과 값을 가진 요소를 선택. | a[href="https://"] { } |
첫 번째 자식 | :first-child | 부모 요소의 첫 번째 자식 요소를 선택. | li:first-child { } |
마지막 자식 | :last-child | 부모 요소의 마지막 자식 요소를 선택. | li:last-child { } |
n번째 자식 | :nth-child(n) | 부모 요소의 n번째 자식 요소를 선택. | li:nth-child(2) { } |
유사 클래스 | :hover, :focus | 특정 상태의 요소를 선택 (예: 마우스 오버, 포커스). | button:hover { } |
가상 요소 | ::before, ::after | 요소의 앞 또는 뒤에 가상의 콘텐츠를 삽입. | p::before { content: ""; } |
이 테이블은 CSS 선택자의 다양한 종류와 사용 방법을 이해하는 데 도움이 된다. 필요에 따라 적합한 선택자를 활용해 효율적으로 스타일을 적용할 수 있다.
4) Requests 라이브러리를 사용한 기본 크롤링
Python의 Requests 라이브러리는 웹 페이지의 HTML을 가져오는 데 매우 유용하다.
- 설치
pip install requests
- 기본 사용법:
import requests
# HTTP 요청
url = "https://example.com"
response = requests.get(url)
# 응답 확인
if response.status_code == 200:
print("요청 성공")
print(response.text) # HTML 소스 출력
else:
print(f"요청 실패: {response.status_code}")
헤더 추가 (필요시): 일부 웹사이트는 봇을 차단하므로 사용자 에이전트를 추가해야 할 때가 있다.
headers = {"User-Agent": "Mozilla/5.0"}
response = requests.get(url, headers=headers)
응답 상태 코드: 다음은 HTTP 응답 상태 코드를 테이블로 정리한 것이다:
상태 | 코드의미 | 설명 |
200 | 요청 성공 | 요청이 성공적으로 처리되었으며, 서버가 정상적으로 응답 데이터를 반환함. |
404 | 페이지를 찾을 수 없음 | 요청한 URL이 존재하지 않거나 삭제되어 클라이언트가 접근할 수 없음. |
403 | 접근 금지 | 요청한 리소스에 대한 접근 권한이 없거나, 서버가 접근을 차단함. |
500 | 서버 오류 | 서버 내부에서 처리 중 오류가 발생하여 요청을 완료할 수 없음. |
이 테이블을 참고하여 상태 코드를 빠르게 이해하고, 크롤링 작업 중 발생하는 상황에 맞게 대처할 수 있다.
3. BeautifulSoup 라이브러리 개요
1) BeautifulSoup이란?
파이썬에서 HTML 및 XML 문서를 파싱(parsing)하여 데이터를 추출할 수 있도록 돕는 라이브러리이다.
HTML 태그 구조를 쉽게 탐색하고, 필요한 데이터를 가져올 수 있다.
https://beautifulsoup-korean.readthedocs.io/ko/latest
Beautiful Soup의 공식 웹사이트는 https://www.crummy.com/software/BeautifulSoup/입니다. 이곳에서 라이브러리의 최신 버전, 다운로드 링크, 그리고 다양한 문서와 튜토리얼을 확인하실 수 있습니다.
또한, 공식 문서의 한국어 번역본은 https://beautifulsoup-korean.readthedocs.io에서 제공됩니다
2) 설치
pip install beautifulsoup4
import bs4
print(bs4.__version__)
import requests
from bs4 import BeautifulSoup
3) 주요 메서드
아래는 BeautifulSoup4의 주요 메서드와 각각의 예제를 테이블 형식으로 정리한 내용이다.
메서드 | 설명 | 예제 코드 | 출력 예제 |
find() | 특정 조건에 맞는 첫 번째 태그를 반환 | python soup.find('h1') | <h1>제목</h1> |
특정 클래스명을 가진 태그를 검색 | python soup.find('div', class_='main') | <div class="main">내용</div> | |
find_all() | 특정 조건에 맞는 모든 태그를 리스트로 반환 | python soup.find_all('a') | [<a href="#">링크1</a>, <a href="#">링크2</a>] |
특정 클래스명을 가진 태그를 모두 검색 | python soup.find_all('span', class_='highlight') | [<span class="highlight">강조1</span>] | |
get_text() | 태그 내부의 텍스트를 추출 | python soup.find('p').get_text() | 내용입니다. |
select() | CSS 선택자를 사용하여 태그를 찾음 | python soup.select('.header > h2') | [<h2>소제목</h2>] |
select_one() | CSS 선택자를 사용하여 첫 번째로 발견된 태그를 반환 | python soup.select_one('.header > h2') | <h2>소제목</h2> |
attrs | 태그의 속성을 딕셔너리 형태로 반환 | python tag = soup.find('img')\ntag.attrs | {'src': 'image.png', 'alt': '설명'} |
['속성명'] | 특정 속성의 값을 반환 | python img_tag = soup.find('img')\nimg_tag['src'] | 'image.png' |
decompose() | 특정 태그를 제거 | python unwanted = soup.find('script')\nunwanted.decompose() | 제거 후 HTML에는 해당 태그가 사라짐 |
find_parent() | 특정 태그의 부모 태그를 반환 | python soup.find('span').find_parent('div') | <div>...<span>내용</span>...</div> |
find_next_sibling() | 특정 태그의 다음 형제 태그를 반환 | python soup.find('h1').find_next_sibling() | <h2>다음 제목</h2> |
find_previous_sibling() | 특정 태그의 이전 형제 태그를 반환 | python soup.find('h2').find_previous_sibling() | <h1>이전 제목</h1> |
주요 메서드 요약
- find()와 find_all(): 태그를 찾을 때 가장 많이 사용하는 메서드로, 단일 태그 혹은 다수의 태그를 검색.
- select()와 select_one(): CSS 선택자를 활용하여 태그 검색.
- get_text(): HTML 태그 안의 텍스트만 추출.
- attrs와 ['속성명']: 태그 속성에 접근하거나 값을 반환.
- 형제/부모 태그 탐색 메서드: 태그 간 관계를 활용한 데이터 탐색 가능.
3. 과제 : 웹 페이지에서 기사 제목 크롤링
1. 필요한 라이브러리 설치
BeautifulSoup과 HTTP 요청을 처리하는 requests 라이브러리를 설치한다:
pip install beautifulsoup4 requests
2. 기본 예제: 웹 페이지 제목 가져오기
import requests
from bs4 import BeautifulSoup
# 1. 요청할 URL 설정
url = "https://www.chemstar.kr"
response = requests.get(url)
# 2. 웹 페이지 응답 확인
if response.status_code == 200: # HTTP 요청 성공 여부 확인
html = response.text # 웹 페이지의 HTML 소스 가져오기
soup = BeautifulSoup(html, 'html.parser') # HTML 소스를 BeautifulSoup을 사용해 파싱
# 3. 특정 태그의 내용 추출
titles = soup.find_all('h1') # 모든 <h1> 태그를 리스트로 가져오기
print("사이트 제목:")
for idx, title in enumerate(titles): # 가져온 <h1> 태그를 순회하며 내용 출력
print(f"{idx + 1}. {title.get_text()}") # 태그 내용에서 텍스트만 추출하여 출력
else:
# 요청 실패 시 상태 코드 출력
print(f"웹 페이지를 불러오지 못했습니다. 상태 코드: {response.status_code}")
2. 여러 데이터 추출: 리스트 가져오기
# HTML 예시 구조:
# <ul>
# <li>Item 1</li>
# <li>Item 2</li>
# <li>Item 3</li>
# </ul>
# 1. <li> 태그 추출
items = soup.find_all('li')
for item in items:
print(item.get_text())
import requests
from bs4 import BeautifulSoup
# 1. 요청할 URL 설정
url = "https://www.chemstar.kr" # 대상 웹사이트
response = requests.get(url)
# 2. 웹 페이지 응답 확인
if response.status_code == 200: # HTTP 요청 성공 여부 확인
html = response.text # 웹 페이지의 HTML 소스 가져오기
soup = BeautifulSoup(html, 'html.parser') # HTML 소스를 BeautifulSoup을 사용해 파싱
# 3. <li> 태그 추출
items = soup.find_all('li') # 모든 <li> 태그를 리스트로 가져오기
print("리스트 항목:")
for idx, item in enumerate(items): # 가져온 <li> 태그를 순회하며 내용 출력
print(f"{idx + 1}. {item.get_text()}") # 태그 내용에서 텍스트만 추출하여 출력
else:
# 요청 실패 시 상태 코드 출력
print(f"웹 페이지를 불러오지 못했습니다. 상태 코드: {response.status_code}")
3. CSS 선택자를 활용한 데이터 추출
# CSS 선택자 사용 예제
selected_data = soup.select('.class-name > p') # 특정 클래스 안의 <p> 태그 선택
for data in selected_data:
print(data.get_text())
import requests
from bs4 import BeautifulSoup
# 1. 요청할 URL 설정
url = "https://chemstar.kr" # 대상 웹사이트
response = requests.get(url)
# 2. 웹 페이지 응답 확인
if response.status_code == 200: # HTTP 요청 성공 여부 확인
html = response.text # 웹 페이지의 HTML 소스 가져오기
soup = BeautifulSoup(html, 'html.parser') # HTML 소스를 BeautifulSoup을 사용해 파싱
# 3. CSS 선택자를 사용해 데이터 추출
selected_data = soup.select('.copy-line') # 특정 클래스 안의 <p> 태그 선택
print("선택된 데이터:")
for idx, data in enumerate(selected_data): # 가져온 요소를 순회하며 내용 출력
print(f"{idx + 1}. {data.get_text(strip=True)}") # 텍스트만 추출하여 출력
else:
# 요청 실패 시 상태 코드 출력
print(f"웹 페이지를 불러오지 못했습니다. 상태 코드: {response.status_code}")
4. 속성값 가져오기
# 이미지 태그에서 src 속성 추출
img_tag = soup.find('img')
if img_tag:
print(f"이미지 URL: {img_tag['src']}")
import requests
from bs4 import BeautifulSoup
# 1. 요청할 URL 설정
url = "https://chemstar.kr" # 대상 웹사이트
response = requests.get(url)
# 2. 웹 페이지 응답 확인
if response.status_code == 200: # HTTP 요청 성공 여부 확인
html = response.text # 웹 페이지의 HTML 소스 가져오기
soup = BeautifulSoup(html, 'html.parser') # HTML 소스를 BeautifulSoup을 사용해 파싱
# 3. 첫 번째 <img> 태그에서 src 속성 추출
img_tag = soup.find('img') # 첫 번째 <img> 태그를 검색
if img_tag and 'src' in img_tag.attrs: # <img> 태그가 존재하고 src 속성이 있는지 확인
print(f"이미지 URL: {img_tag['src']}") # src 속성 출력
else:
print("이미지 태그가 없거나 src 속성이 없습니다.")
else:
# 요청 실패 시 상태 코드 출력
print(f"웹 페이지를 불러오지 못했습니다. 상태 코드: {response.status_code}")
- soup.find('img') HTML 문서에서 첫 번째 <img> 태그를 검색한다.
- 'src' in img_tag.attrs: 검색된 <img> 태그에 src 속성이 포함되어 있는지 확인한다.
- 출력: img_tag['src']를 통해 src 속성 값을 가져와 출력한다.
5. 크롤링 데이터 저장하기 (CSV)
import csv
# 크롤링 데이터를 리스트로 저장
data = [item.get_text() for item in soup.find_all('li')]
# CSV 파일로 저장
with open('data.csv', 'w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow(["Item"])
for row in data:
writer.writerow([row])
print("데이터가 CSV 파일로 저장되었습니다.")
BeautifulSoup 학습 포인트
- HTML 구조 이해 : 개발자 도구(F12)를 사용하여 웹 페이지의 HTML 구조를 분석한다.
- 메서드 활용: find(), find_all(), select()와 같은 메서드의 차이와 사용법을 익힌다.
- 실습 중심 학습 : 여러 웹사이트에서 실습하며 크롤링 경험을 쌓는다.
예제: 코드 실행 결과
만약 https://example.com의 HTML 구조가 아래와 같다고 가정한다:
<!DOCTYPE html>
<html>
<head><title>Example Page</title></head>
<body>
<h1>첫 번째 기사 제목</h1>
<h1>두 번째 기사 제목</h1>
</body>
</html>
위 코드를 실행하면 출력은 다음과 같다:
기사 제목:
1. 첫 번째 기사 제목
2. 두 번째 기사 제목
- requests.get(url) : URL로 HTTP 요청을 보내고 응답받은 HTML 데이터를 가져온다.
- BeautifulSoup(html, 'html.parser') : HTML 데이터를 파싱하여 BeautifulSoup 객체로 만든다.
- soup.find_all('h1') : HTML에서 <h1> 태그를 모두 찾는다.
- get_text() : 태그 안의 텍스트(본문)를 추출한다.
4. 뉴스 웹사이트에서 기사 제목 크롤링하기
- 뉴스 웹사이트 분석
- 대상 웹사이트: 예를 들어, 네이버 뉴스(https://news.naver.com)
- 개발자 도구(F12)를 활용하여 제목이 포함된 HTML 태그 확인.
- 예: 제목은 <h3> 태그 또는 특정 클래스명(class)으로 감싸져 있음.
- 코드 구현
- 필요한 라이브러리: requests, BeautifulSoup
import requests from bs4 import BeautifulSoup # 1. 웹 페이지 요청 url = "https://news.naver.com" response = requests.get(url) if response.status_code == 200: html = response.text soup = BeautifulSoup(html, 'html.parser') # 2. 기사 제목 크롤링 titles = soup.find_all('h3', class_='headline') # 예시: h3 태그와 특정 클래스명 for idx, title in enumerate(titles): print(f"{idx + 1}: {title.get_text()}") else: print("웹 페이지를 불러오지 못했습니다.")
- 필요한 라이브러리: requests, BeautifulSoup
- 크롤링 데이터 저장 및 확인 : CSV 파일로 저장하기
import csv
# 크롤링 데이터를 리스트로 수집
data = []
for title in titles:
data.append(title.get_text())
# CSV 파일로 저장
with open('news_titles.csv', 'w', encoding='utf-8', newline='') as file:
writer = csv.writer(file)
writer.writerow(["Title"])
for row in data:
writer.writerow([row])
print("데이터가 news_titles.csv 파일로 저장되었습니다.")
저장된 데이터 확인
저장된 news_titles.csv 파일을 Excel 또는 텍스트 편집기로 열어서 확인
참고 크롤링 매너와 robots.txt 소개
- 크롤링 매너 : 서버에 과도한 부하를 주지 않도록 요청 간 간격을 두어야 한다.
- 예: time.sleep(1)을 사용하여 요청 사이에 1초 대기.
- 크롤링 대상 사이트의 데이터를 상업적으로 이용할 경우, 반드시 사전 동의를 받아야 한다.
- 불필요한 데이터를 무작위로 수집하지 않고, 필요한 정보만 효율적으로 수집한다.
- robots.txt 파일 확인
- robots.txt란? 웹사이트의 루트 디렉토리에 위치하며, 크롤러가 접근 가능한 경로와 제한된 경로를 명시하는 파일이다.
- 예: https://example.com/robots.txt
- robots.txt 파일 구조
User-agent: * # 모든 크롤러에 적용
Disallow: /admin # /admin 디렉토리에 접근 금지
Allow: /public # /public 디렉토리에 접근 허용
- Python으로 robots.txt 확인하기
import requests
url = "https://example.com/robots.txt"
response = requests.get(url)
if response.status_code == 200:
print(response.text) # robots.txt 파일 내용 출력
else:
print("robots.txt 파일을 확인할 수 없습니다.")
- 크롤링 가능 여부 확인
- robots.txt 파일을 확인하여 Disallow로 설정된 경로는 크롤링하지 않는다.
- Allow로 명시된 경로는 자유롭게 접근 가능하다.
- Total
- Today
- Yesterday