티스토리 뷰

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(너무 많은 요청) 응답 코드를 받으면 차단되었을 가능성이 높음

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함