티스토리 뷰
1. robots.txt 설정
- robots.txt 파일을 통해 크롤러의 접근을 차단
* robots.txt는 웹사이트 루트 디렉토리에 위치하는 텍스트파일,
- 하지만 robots.txt는 강제성이 없고, 직접 만든 python 크롤러(requests 등)들은 무시할 수 있다.
User-agent: *
Disallow: /admin/
Disallow: /private/
Allow: /public/
2. HTTP 헤더 및 User-Agent 차단
- 웹 서버에서 특정 User-Agent(봇 식별자)를 감지하고 차단
- 예를 들어, scrapy, selenium, python-urllib과 같은 크롤링 관련 User-Agent를 차단
if ($http_user_agent ~* (Scrapy|Selenium|Python-urllib)) {
return 403;
}
- 하지만 브라우저처럼 보이제 User-Agent를 변경하면 우회 가능
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"
}
response = requests.get(url, headers=headers)
3. reCAPTCHA 적용
- google reCAPTCHA 또는 Cloudflare Turnstile을 통해 크롤링 방지
- 주로 로그인, 검색, 폼 제출 시 CAPTCHA를 추가하여 자동화된 요청을 막음
- 하지만 AI 기반 OCR이나 브라우저 자동화 도구를 사용하면 일부 우회 가능
from pytesseract import image_to_string
from PIL import Image
captcha_image = Image.open("captcha.png")
captcha_text = image_to_string(captcha_image)
print(captcha_text) # CAPTCHA 자동 인식
4. IP 차단 & Rate Limiting
- 특정 IP에서 일정 횟수 이상 요청이 오면 차단
- AWS WAF, Cloudflare, Nginx 등에서Rate Limiting(속도 제한) 적용
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
- 하지만 VPN, 프록시, Tor 네트워크를 사용하면 IP를 바꿔서 우회 가능
proxies = {
"http": "http://your-proxy.com:8080",
"https": "http://your-proxy.com:8080",
}
response = requests.get(url, proxies=proxies)
5. 데이터를 JavaScript 렌더이(동적 로딩)
- 데이터를 JavaScript로 렌더링하여 단순 HTML 크롤링을 방지
- React, Vue.js, Angular 등의 SPA(Single Page Application)을 활용
- 하지만 Selenium, Playwright 같은 브라우저 자동화 도구를 사용하여 우회 가능
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--headless") # 브라우저 창 없이 실행
driver = webdriver.Chrome(options=options)
driver.get("https://example.com")
print(driver.page_source) # JavaScript 렌더링된 HTML 가져오기
6. 빈 페이지 반환
- 크롤링 시 특정 헤더, 쿠키가 없으면 빈 페이지 또는 잘못된 데이터 반환
- 예: 네이버는 비로그인 사용자가 크롤링하면 검색 결과가 빈 화면으로 반환
- 하지만 Selenium을 사용해 실제 브라우저처럼 동작하여 우회 가능
7. 동적 요청 추적(API 요청 차단)
- API 요청의 헤더, 쿠키, 토큰을 검사하여 비정상 요청 차단
- Instagram, Facebook 등은 CSRF 토큰, 인증 토큰을 요구
- 요청할 때마다 변경되는 난수 값을 요구하여 자동화된 접근 차단
- 하지만 정상 요청을 캡처하여 크롤링할 때 사용해 우회 가능
session = requests.Session()
session.headers.update({"User-Agent": "Mozilla/5.0"})
login_url = "https://example.com/login"
data = {"username": "test", "password": "1234"}
session.post(login_url, data=data) # 로그인 후 세션 유지
response = session.get("https://example.com/private-data")
print(response.text)
# 세션 쿠키와 인증 토큰을 유지하면 정상적으로 API 요청 가능
8. Honey Pot (의도적인 함정 페이지)
- 크롤링을 탐지하기 위해 숨겨진 링크나 필드를 추가
- 실제 사용자는 클릭하지 않지만, 크롤러는 이를 따라가므로 쉽게 탐지 가능
- 만약 해당 페이지를 요청하면 차단
<a href="/hidden-page" style="display: none;">Click Me</a>
- 하지만 숨겨진 요소를 감지하고 제외하면 Honeypot 우회 가능
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, "html.parser")
links = soup.find_all("a")
for link in links:
if "display: none" not in link.attrs.get("style", ""): # 숨겨진 링크 제외
print(link["href"])
9. WebSocket을 활용한 데이터 전송
- 데이터를 WebSocket을 통해 실시간으로 전송하여 일반적인 HTTP 요청 크롤링을 어렵게 만듦
- 예를 들어, 주식 거래 사이트에서 WebSocket을 통해 가격을 갱신하면 정적 크롤링이 어려워짐
- 하지만 WebSocket을 직접 연결하여 데이터를 수집하면 우회 가능
import websocket
def on_message(ws, message):
print(f"Received: {message}")
ws = websocket.WebSocketApp("wss://example.com/socket", on_message=on_message)
ws.run_forever()
10. 데이터 암호화 및 난독화
- HTML 소스 코드 내 데이터를 암호화하거나 Base64 인코딩
- JavaScript를이용해 데이터를 클라이언트에서 복호화
- 예시: Base64 인코딩된 데이터
<div data-info="U29tZSBzZWNyZXQgZGF0YQ=="></div>
- 하지만 JavaScript를 분석하여 복호화 로직을 재현해 후회할 수 있음
import base64
encoded_data = "U29tZSBzZWNyZXQgZGF0YQ=="
decoded_data = base64.b64decode(encoded_data).decode("utf-8")
print(decoded_data) # "Some secret data"
11. 크롤링 정책 확인
- 브라우저에서 직접 확인: https://example.com/robots.txt
- 웹사이트 이용 약관(Terms of Use, TOU) 확인
- 크롤링시 403(접근 금지), 429(너무 많은 요청) 응답 코드를 받으면 차단되었을 가능성이 높음
'AI > AI 서비스 개발' 카테고리의 다른 글
[AI 서비스 개발] 리눅스에 미니포지 설치하기 (0) | 2025.03.28 |
---|---|
[AI 서비스 개발] AI 여행플래너 서비스 프로젝트 관련 용어 복기 (0) | 2025.03.18 |
[AI 서비스 개발] RAG의 패러다임 변화 (0) | 2025.03.16 |
[AI 서비스 개발] LLM의 Reasoning, Deepseek R1, 파인튜닝과 강화학습 (0) | 2025.03.11 |
[AI 서비스 개발] RAG 파이프라인 (0) | 2025.03.06 |
- Total
- Today
- Yesterday
- SQL
- Python
- 루틴
- 스크랩
- 고득점 Kit
- 오픽
- 오블완
- IH
- 미라클모닝
- 아침
- 실기
- 아침운동
- 빅데이터 분석기사
- 프로그래머스
- 영어회화
- 다이어트
- 30분
- 티스토리챌린지
- 습관
- 줄넘기
- 기초
- 경제
- opic
- C언어
- 갓생
- 운동
- ChatGPT
- Ai
- 뉴스
- llm
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |