크롤링

봇탐지 우회

taehyuck 2025. 3. 29. 17:48
728x90

봇 탐지 우회란??

사이트가 정상적이지 않은 행동 패턴들을 감지해 차단 시키는 것을 말한다.

예를들어 1초에 여러 페이지 요청, 댓글 작성 등 인간적으로 불가능한 행위를 탐지한다.

 

이럴 경우에는 간단하게

time.sleep과 random라이브러리를 이용하면 쉽게 이용할 수 있다.

하지만 역시

 

이렇게 자동으로 무분별하게 데이터를 긁어가는 것을 방지하기 위해

많은 사이트들이 여러 방법들로 보안을 강화하고 있다.

 

대표적으로

 

1. 헤더검증

2. 쿠키검증

3. 요청 패턴 검사

4. 자바스크립트 실행 여부 확인

5. 자동화 브라우저 탐지

 

위 방법들의 우회를 할 줄 안다면

존재하는 95%의 웹을 크롤링 할 수 있다.

 

우린 모든 방법들을 다 할 줄 안다

그러나 그건 다 기초적인 방법들이고

실전에서는 응용해야 한다.

 

오늘은 그 중에서 세션의 유지 시간이 극단적으로 짧은 사이트를 크롤링 하는 방법에 대해 작성하려고 한다.

 

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.get(url)
time.sleep(1)

username = driver.find_element(By.CSS_SELECTOR, "#username")
username.send_keys(your_id)
time.sleep(1)

password = driver.find_element(By.CSS_SELECTOR, "#password")
password.send_keys(your_pw)
time.sleep(1)

login_btn = driver.find_element(By.CSS_SELECTOR, "#submit")
login_btn.click()
time.sleep(1)

 

먼저 셀레니움 방식으로 로그인을 먼저 진행해 준다

크롤링을 좀 해본 사람들은 위 방식대로 로그인을 하면 셀레니움이 감지되어 차단될 것을 알고있다

그러니까 앞전에 배운 pyperclip 라이브러리를 이용하자

 

로그인을 하면 로그인 정보가 포함된 세션이 생성된다

그러니까

# 현재 바라보고 있는 페이지의 쿠키를 가져온다.
cookies = driver.get_cookies()

#세션 객체를 생성
session = requests.Session()

# 세션 객체에 쿠키 값을 넣어준다
for cookie in cookies:
    session.cookies.set(cookie['name'], cookie['value'])

세션과 쿠키를 찾아주고 이를 이용해 세션이 필요한 페이지에 접근할 수 있도록 한다.

 

response = session.get(
        url,
        params=params,
        headers=headers,
    )

바로 페이지를 요청하려고 하는데

 

 

세션이 유효하지 않다고 뜬다.

원인은 해당 사이트는 세션 유지시간이 1분으로 설정이 되어 있다

 

그러면 세션이 만료될 때마다 새로운 세션값을 받아오면 해결이 될거다

 

if response.status_code == 401:
	session = new_session()

401 에러는 인증이 되지 않았을 때 발생한다.

확인을 해보면 쿠키나 세션이 같지 않아서 자주 발생한다.

 

def new_session():
    driver = webdriver.Chrome()
    driver.get(url)
    cookies = driver.get_cookies()
    driver.quit()

    session = requests.Session()

    for cookie in cookies:
        session.cookies.set(cookie['name'], cookie['value'])
    session.headers.update(headers)

    return sessio

그래서 만약 401에러가 발생한다면

세션과 쿠키를 자동으로 업데이트 해주는 함수를 실행한다.

 

이를 이용하면 세션이 만료가 되더라도 계속해서 새로운 세션으로 업데이트를 해주니 해결할 수 있다.

 

마지막 요약으로

 

사이트에서 접근이 거부되었을때

1. 세션과 쿠키 값이 일치한지 확인 해보고

2. 헤더에서 고정값이 아닌 가변값이 있는지 확인을 해본다.

이 두 가지가 제일 많은 것 같다.

 

요청 패턴을 검사하는 것이 정말 중요하다.

 

728x90