풀스택 개발자가 크롤링해보며 궁금했던 6가지 궁금증
파이썬 웹 크롤링 초보자를 위한 완벽 가이드! 동적 페이지 크롤링, IP 차단 해결, 데이터 파싱 등 현업 데이터 엔지니어의 실전 노하우를 Q&A 형식으로 쉽게 배워보세요. Selenium, BeautifulSoup, 프록시 사용법까지 한번에!
풀스택 개발자가 크롤링해보며 궁금했던 6가지 궁금증
풀스택 개발자이지만 데이터 엔지니어링의 일환으로 크롤러를 개발해본 경험을 정리해보고자 한다. Python, GCP 기반 크롤러를 개발하면서 경험했던 상황들을 간단하게 정리해보면 어려운 문제라고 말하긴 애매하지만 굉장히 작은 업무를 매일매일 해결해 나가는 느낌이었다. 그래서 그 동안 크롤링하면서 어려웠던 부분을 해결했던 경험을 질문 형태로 정리해본다
Q1. 크롤링했는데 Html Body 가 텅 비었다.
CSR(Client Side Rendering) 로 동작하는 동적 웹사이트일 가능성이 매우 높다.
웹사이트는 크게 정적 페이지와 동적 페이지로 나뉜다. 정적 페이지(SSR)는 서버에서 HTML 내용을 미리 만들어둔 상태로 브라우저에 렌더링되고, 동적 페이지(CSR)는 브라우저에서 사이트가 먼저 렌더링된 후 각 모듈이 순차적으로 렌더링되는 방식이다.
크롤링했는데 Html Body 가 비어 있는 문제는 웹사이트가 동적 웹사이트이기 때문에 발생한다. 페이지를 열 때 JavaScript가 추가 Html 파일을 불러와 화면에 보여주기 때문에, 우리가 아는 파이썬 requests 같은 라이브러리는 HTML 소스만 가져올 뿐, 나중에 불러온 데이터는 놓치게 된다.
해결책:
Python에서는 Selenium이나 Playwright 같은 웹 브라우저 자동화 도구를 사용해야 한다. 실제로 크롬이나 파이어폭스를 켜서 페이지 로딩이 끝날 때까지 기다린 후 html 를 스크랩하면 잘 가저온다.
Q2. 잘 동작하던 크롤러가 동작을 안한다.
IP 가 차단되었을 가능성이 높다.
웹사이트 입장에서는 짧은 시간 내에 특정 IP에서 수백, 수천 건의 요청이 들어오면 서버에 과부하를 줄 수 있다고 판단한다.
해결책:
무작정 빠르게 요청하지 않도록 코드를 수정한다. Python의 time.sleep() 함수를 사용해 요청 사이에 1~3초 정도의 간격을 두면 훨씬 안전하다.
User-Agent 를 실제 브라우저의 User-Agent 를 사용하여 크롤러의 정체를 숨기는 것은 간단한 방법이다. requests 라이브러리의 headers에 일반 웹 브라우저의 User-Agent 정보를 넣어주면 웹사이트가 봇이 아닌 일반 사용자로 인식할 가능성이 높다.
Q3. 프록시 툴, 굳이 사용해야 하나?
크롤러를 숨기기 위해서는 프록시 툴 사용을 권장.
IP 차단 문제를 근본적으로 해결하려면 IP 주소를 바꿔가며 접속해야 한다. 하지만 수많은 프락시 서버를 위한 IP를 직접 구하고 관리하는 것은 매우 번거롭고 어려운 일이다. 유료 프록시 서비스를 활용하면 안전한 프락시 서버를 통해 내가 운영 중인 서버의 IP 를 숨길 수 있다. (무료 프락시는 비추.)
유료 프록시 툴 사용의 장점:
- 자동 IP 교체 (로테이션): 전문 프록시 툴은 수많은 IP를 자동으로 관리하고 요청마다 다른 IP를 사용한다. IP가 차단되더라도 다음 IP로 자동으로 전환해주니, IP 밴 걱정을 크게 덜 수 있다.
- 고성능과 안정성: Bright Data 같은 유료 서비스는 전 세계의 안정적인 IP를 제공하며, IP 밴을 감지하고 교체하는 고급 기능까지 포함하고 있다.
- Residential IP: 데이터센터, 주거용 등 다양한 IP 유형을 제공한다. 소셜 미디어처럼 사람이 사용하는 IP가 필요한 곳에는 주거용 프록시를 사용해 탐지 시스템을 효과적으로 피할 수 있다.
Q4. 데이터는 가져왔는데, 원하는 정보만 쏙 빼내는 게 너무 어렵다.
BeautifulSoup 혹은 마크다운으로 변경하면 편하다.
개발자라면 어려워하지 말고 공부해서 내 것으로 만들어야 한다. 그리고 조금만 공부를 하면 알 것이다. HTML 따위는 굉장히 쉬운 언어에 속한다는 것을…
해결책:
- 개발자 도구 활용: 크롬 개발자 도구(F12)를 열고 ‘Elements’ 탭을 확인한다. 원하는 정보가 어떤 HTML 태그나 클래스에 속해 있는지 쉽게 확인할 수 있다.
- Python 파싱 라이브러리: BeautifulSoup나 lxml은 크롤링한 HTML 데이터를 분석하고, CSS 선택자를 통해 원하는 정보만 추출 할 수 있다.
Q5. 크롤링 중에 오류가 너무 자주 나ㄴ다. 안정적인 크롤러 만들 수 없나?
완벽한 크롤러는 없다. 계속 유지보수해야한다.
네트워크 불안정, 대상 웹 사이트 구조 변경 등 크롤링은 외부 변수에 매우 취약하다. 하지만 몇 가지 안전장치를 마련하면 크롤러가 멈추지 않고 계속 작동하도록 만들 수 있다. 모든 서비스는 성장하면서 자연스레 사이트 개편을 하고 이전에 추출했던 데이터를 못 찾을 수 있다.
해결책:
- 예외 처리: Python의 try-except 구문을 활용해 오류가 발생해도 프로그램이 멈추지 않고 계속 실행되도록 만드세요. 예를 들어, 페이지를 찾을 수 없거나(404), 연결이 끊겼을 때(ConnectionError) 오류 메시지를 띄우고 다음 작업으로 넘어가게 할 수 있다.
- 로그 기록: logging 모듈을 사용해 어떤 오류가 어디서 발생했는지 기록하면 문제 원인을 빠르게 파악하고 수정하는 데 큰 도움이 된다.
Q6. 그래서, 어떤 파이썬 크롤링 도구를 사용해야 하나?
목적에 따라 다르다. 크롤링 목적에 따라 적합한 도구가 따로 있다.
- 가볍고 빠른 크롤링: requests + BeautifulSoup 조합이 가장 기본적이고 빠르게 개발할 수 있다.
- 대규모/전문 크롤링: Scrapy와 같은 전문 프레임워크는 IP 로테이션, 데이터 파이프라인 등 복잡한 기능을 체계적으로 관리할 수 있다.
- AI 기반 크롤링: Firecrawl처럼 URL만 입력하면 AI가 알아서 데이터를 추출해주는 툴도 있다. 복잡한 코딩 없이 빠르게 데이터를 얻고 싶을 때 매우 유용하다.
결론
웹 크롤링은 단순히 코드를 짜는 것을 넘어, 웹의 작동 원리를 이해하고 다양한 기술을 적재적소에 활용하는 과정이다. 데이터가 중요해진 빅데이터 시대에 크롤링 기술은 간단하면서도 어려운 기술이다.
크롤러를 개발하면서 느낀 점은 절대 포기하면 안된다는 것이다. 일반적인 서비스의 기능은 한번 잘 만들어두면 기획이 변경되지 않는 이상 건드릴 일은 거의 없지만 크롤러는 항상 예의주시하고 에러 발생시 즉각 반응하여 원인 분석을 위해 디버깅, 리서치를 통해 해결해 나가야 한다.
