“분명 브라우저에선 접속되는데, 왜 내 파이썬 코드는 403일까?”
엔지니어라면 누구나 한 번쯤 겪어보는 ‘클라우드플레어(Cloudflare)의 벽’! 🛠️
분명히 살아있는 사이트인데, 우리가 짠 단순한 체크 스크립트에는 차갑게 고개를 돌리곤 하죠. 오늘은 이 방어막을 아주 발랄하게(?) 우회해서 사이트가 정말 죽었는지 살았는지 판별하는 갓벽한 코드를 공유해 보려고 해요!
🕵️ 핵심 무기: cloudscraper
일반적인 requests 라이브러리는 브라우저처럼 보이기 위한 ‘지문’이 부족해요. 그래서 우리는 **cloudscraper**라는 강력한 도구를 사용합니다. 이 친구는 브라우저의 엔진 동작을 흉내 내서 클라우드플레어의 챌린지를 통과시켜 주거든요!
1. 완벽한 변장술: “나 크롬 쓰고 있어!”
가장 먼저 할 일은 우리의 스크래퍼에게 멋진 옷을 입혀주는 거예요.
scraper = cloudscraper.create_scraper(
browser={
'browser': 'chrome',
'platform': 'windows',
'desktop': True
}
)
“나는 파이썬 스크립트가 아니라, 윈도우 데스크탑에서 크롬을 쓰고 있는 일반 사용자야!”라고 명함을 내미는 과정이죠. 이렇게 설정해 두면 봇 탐지 필터를 아주 부드럽게 통과할 수 있답니다. 🚀
2. 오늘의 하이라이트: “에러가 나면 살아있는 거다?” (역발상 전략)
이 코드의 가장 짜릿한 지점은 바로 **‘생존 판정 기준’**에 있어요. 보통은 에러가 나면 False를 리턴하고 싶어지잖아요? 하지만 우리는 관점을 바꿨습니다!
try:
response = scraper.get(url, timeout=15)
# 200 OK는 당연히 생존!
except CloudflareChallengeError:
return True # 캡차가 떴다는 건 서버가 살아있다는 증거!
와, 이거 대박이지 않나요? 💡 클라우드플레어가 캡차나 챌린지 페이지를 보여줬다는 건, 그 뒤에 있는 원본 서버가 아주 쌩쌩하게 응답하고 있다는 확실한 증거거든요!
데이터를 긁어오는 게 목적이 아니라 ‘생존 확인’이 목적이라면, 방어막의 반응 자체가 곧 생존 신호가 되는 셈이죠. 삽질 끝에 찾아낸 이런 역발상이 엔지니어링의 묘미 아닐까요?
🛠️ get_status 함수 분석
우리가 만든 함수는 아주 꼼꼼하게 설계되었어요.
- 재시도 로직(Retry): 네트워크의 일시적인 불안정을 대비해
max_tries만큼 다시 시도하는 끈기! - 상태 코드 분석:
200은 물론이고, 차단(403)이나 과부하(503) 메시지가 와도 “어쨌든 서버는 반응 중!”이라고 판단합니다. - Time Sleep: 무차별적인 호출로 서버에 부담을 주지 않도록 재시도 사이에 짧은 휴식을 주는 매너까지 챙겼습니다.
🎯 마치며
이 스크립트는 매주 일요일 저녁 진행하는 torrent.md 주소 업데이트 자동화의 핵심 엔진으로 활약 중입니다.
단순히 requests.get()만 쓰다가 “왜 안 되지?”라며 머리를 쥐어뜯던 분들이라면, 오늘 소개한 cloudscraper와 ‘챌린지 역이용 로직’을 꼭 도입해 보세요. 여러분의 자동화 라이프가 훨씬 즐거워질 거예요! 🔥
DevBJ | No Bio, Just Log 0과 1 사이에서 정답을 찾는 즐거움, 함께 나누고 싶습니다! 🚀