Intro
오늘은 업무 상 크롤링을 할 일이 있어서 파이썬으로 크롤링할 수 있는 대다수 기법을 활용한 테스트 결과로
현명하게 파이썬 크롤링 기법을 선택하는 방법에 대해 글을 작성하고자 합니다.
🔷요약
✅ 정적 웹사이트라면
간단한 소규모 작업: Requests + Beautiful Soup, lxml 라이브러리
대규모 크롤링: Scrapy
✅ 동적 웹사이트라면
간단한 소규모 작업: Selenium
대규모 & 속도 중시 작업: Scrapy + Playwright 혹은 Scrapy + Splash
➡️무료 프록시를 사용할 생각이다
복잡도가 높은 프로그램 구현은 매우매우 까다롭다.무료 프록시를 사용하면서 멀티스레드랑 멀티프로세싱을 할 생각은 버려라
유로 프록시일 경우 좀 전의 표 참고하셔서 원하는 방향대로 기법 선택하면 됩니다.
➡️ 멀티 프로세싱을 하고 싶다.
SELENIUM에서 Web Driver를 관리해줘야한다. -> 매우 까다롭다, 안된다.멀티 프로세싱 & 멀티 스레드는 정적인 웹 페이지를 크롤링 할때 고려해보자, Scrapy를 통달하던지
➡️ 프록시 없이 크롤링을 여러차례하고 싶다 or 멀티 프로세싱을 구현하고 싶다.
그냥 구글 colab 여러개 띄워서 합시다.... 귀찮더라도 가장 확실하고 안전합니다.
경험 상 프록시 때려잡겠다고 멀티 프로세싱 때려잡겠다고 시간 날린거 대비 구글 colab 여러번 돌리는 게 가성비가 좋습니다.
학교 프로젝트 정도의 규모 -> Selenium or Beutiful Soup ( lxml 까지..?)
대규모 규모, 복잡도가 높은 프로그램 -> 유로 IP 등 아이피 우회 필수 + Scrapy
1. 정적 vs 동적
크롤링을 시작하기 전에, 웹사이트의 특징(정적/동적) 에 따라 사용하는 기술과 도구를 결정해야 합니다.
➡️ 정적 웹사이트와 동적 웹사이트 구분법
항목 | 정적 웹사이트 | 동적 웹사이트 (자바스크립트 기반) |
특징 | HTML에 이미 콘텐츠가 포함 | 자바스크립트 실행 후 콘텐츠 로딩 |
자바스크립트 사용 여부 | 없음 또는 최소한 | 활발히 사용 (Ajax, React, Vue 등) |
크롤링 난이도 | 상대적으로 쉬움 | 상대적으로 어려움 |
HTML 소스 | 요청만으로 바로 데이터가 보임 | 요청만으로는 데이터가 보이지 않음 |
정적인 웹사이트의 경우 이미 완성된 형태로 HTML이 작성되어 있기 때문에, 웹 서버로부터 HTML 코드를 받아와 원하는 데이터를 추출하는 방식을 사용합니다. 이를 HTML 파싱(Parsing) 이라고 합니다.
동적인 웹사이트의 경우 자바스크립트를 통해 콘텐츠가 나중에 로딩되기 때문에 HTML 소스를 단순히 가져오는 방식으로는 데이터가 제대로 크롤링되지 않습니다. 따라서 이런 경우는 브라우저를 직접 제어하는 방식을 이용해 크롤링을 진행해야 합니다.
정적인지 동적인지 확인하는 가장 간단한 방법은 웹 페이지 로딩 속도입니다.
정적 페이지는 서버에서 이미 완성된 HTML을 가져오므로 속도가 빠르며,
동적 페이지는 HTML이 텅 빈 상태에서도 자바스크립트가 다시 실행되면서 콘텐츠가 로딩되기 때문에 속도가 느립니다.
하지만 속도가 절대적 지표가 아닐 뿐더러 빠르게 업로드 되는 웹사이트도 요즘 많기 때문에
가장 확실한 방법으로 브라우저에서 F12(개발자 도구) 확인해봐야합니다.
진행방법:
- 개발자 도구에서 Console(콘솔) 또는 Network(네트워크) 탭을 엽니다.
- Network 탭에서 새로고침 후, XHR, JS 파일 요청이 다수 발생하는지 확인합니다.
- Console에서 자바스크립트 변수(window.info 등)를 호출하여 데이터가 나타나는지도 확인합니다.
즉 코드 안에 함수 호출이나 자바스크립트의 문법이 보인다? 그럼 정적인 크롤링 기법을 사용하면 안된다는 것 입니다.
하단은 정적 및 동적 각 페이지 크롤링시 사용할 수 있는 툴들입니다.
✅ 정적 웹사이트라면
- 간단한 크롤링: Requests + Beautiful Soup, lxml 라이브러리
- 대규모 크롤링: Scrapy
Selenium은 정적인 웹사이트에서도 가능하나 정적인 웹사이트를 굳이 속도가 느린 Selenium으로 구현할 이유는 없죠..?
✅ 동적 웹사이트라면
- Selenium
- Scrapy + Playwright 혹은 Scrapy + Splash
2. 데이터 위치 지정 방법(Css Selecter, XPath)
크롤링 시 원하는 데이터를 정확히 추출하기 위해 HTML에서 해당 데이터의 위치를 지정하는 방법으로 크게 두 가지 기법을 사용할 수 있습니다.
바로 CSS Selector와 XPath입니다.
브라우저 개발자도구 (F12)를 눌러서 HTML의 아무 요소에 오른쪽 마우스를 클릭하면 어떤 위치를 복사할 것인지 표시됩니다.
CSS 일경우 css 경로로 표현되며 ">" 을 사용합니다.
html > body > div > div.content > p.title
xpath일 경우 html 구조상 경로를 "/" 또는 "//"를 사용하여 표현합니다.
/html/body/div/div[@class='content']/p[@class='title']
익숙한 방법을 선택하면 되는데,
익숙한게 없다고 하시면 xpath로 하시는 것을 추천드립니다.
좀 더 직관적이고 페이지 안에 카테고리가 많을 경우 원하는 값을 구조적으로 추출해 내기 편합니다.
여기서 중요한 점은
자주 사용이 되는 BeutifulSoup의 단점이 드러납니다.
BeutifulSuop은 Xpath를 지원하지 않습니다.
그렇기 때문에 xpath를 사용하신다고 하면 Selenium, xml 라이브러리를 고려해봐야하며
Xpath와 CSS Selector 둘다 지원하는 Scrapy를 사용할 수도 있죠
하단의 표로 정확하게 구분하겠습니다.
정적 페이지 | CSS Selector | ✅ Beautiful Soup, Scrapy, Selenium |
XPath | ✅ lxml, Selenium | |
동적 페이지 | CSS Selector | ✅ Selenium, Scrapy(+Splash 또는 Playwright) |
XPath | ✅ Selenium, Scrapy(+Splash 또는 Playwright) |
3. 크롤링 복잡성
크롤링 복잡성이라고 말하는 것은 레벨(깊이)를 의미합니다.
예를 들어 의류 쇼핑몰이 있다고 가정하면,
메인 페이지에서 상의/하의/악세사리 카테고리에 들어가고,
상의 카테고리에서 아우터, 맨투맨, T셔트 들어가고 하의 카테고리에서 면 팬츠, 슬랙스 등등 들어가고
이런 식으로 리프 레벨까지 쭉쭉 들어가면 레벨이 점점 깊어지고 크롤링 복잡도가 증가하겠죠.
그렇기 때문에 진행하려고 하는 크롤링 레벨이 어디냐에 따라 사용해야하는 툴을 다르게 갈 수 있습니다.
정말 깊이가 깊다고 하시면 말 그대로 프레임워크를 사용하는 것이 좋을 수도 있습니다.
안그러면 데이터 파이프라인이나 멀티프레싱 과 멀티스레드 등등 크롤링 외적인 부분에 많은 시간과 노력이 필요하기 때문입니다.
하지만 그냥 한 웹페이지 또는 레벨 2정도의 크롤링만 진행한다고 했을 때는 간단히 Selenium 과 Beutiful Soup을 사용하는 것이 코드 가독성이 높죠.
4. Scrapy가 도대체 무엇이냐?
Scrapy는 크롤링을 위한 통합 웹 프레임 워크입니다.
자세한 내용은 향후 업로드 하겠습니다.
결론부터 말하면,
학교 프로젝트 & 토이 프로젝트로 사용 해보실 꺼면 사용하는 것 비추천입니다.
+ 무료 IP를 사용하시는 것이면 또 비추천 드립니다.
건들었다가 시간만 날릴 수 있습니다.
scrapy의 가장 큰 장점은 병렬처리이자 가장 큰 단점 또한 병렬처리입니다.
그냥 진짜 몇번 돌리고 말꺼면 써도 되는데
자주 돌려야하고 크롤링 구조가 복잡하다면 개발난이도가 상승하고
프레임 워크 특성 상 이슈 잡기가 매우 까다롭습니다.
내가 코드를 잘못 작성한건지, 빠트린 속성이 있는지, 데이터 파이프라인 구축이 잘못된 건지, IP 설정이 잘못된건지
일일히 잡아나가야합니다.
5. 프록시 & 멀티 스레드 & 멀티 프로세싱 여부
이것도 할 말이 많기 때문에 다음 포스트에서 진행하겠습니다.
6. 결론
그럼 결론부터 먼저 내자면,
크롤링을 여러번 돌려야하는 요구사항이 있기 때문에 IP 차단을 방지하기 위해서는
IP를 우회할 필요가 있습니다, 프록시든, VPN이든
➡️무료 프록시를 사용할 생각이다
- 복잡도가 높은 프로그램 구현은 매우매우 까다롭다.
- 무료 프록시를 사용하면서 멀티스레드랑 멀티프로세싱을 할 생각은 버려라
유로 프록시일 경우 좀 전의 표 참고하셔서 원하는 방향대로 기법 선택하면 됩니다.
➡️ 멀티 프로세싱을 하고 싶다.
- SELENIUM에서 Web Driver를 관리해줘야한다. -> 매우 까다롭다, 안된다.
- 멀티 프로세싱 & 멀티 스레드는 정적인 웹 페이지를 크롤링 할때 고려해보자, Scrapy를 통달하던지
➡️ 프록시 없이 크롤링을 여러차례하고 싶다 or 멀티 프로세싱을 구현하고 싶다.
그냥 구글 colab 여러개 띄워서 합시다.... 귀찮더라도 가장 확실하고 안전합니다.
경험 상 프록시 때려잡겠다고 멀티 프로세싱 때려잡겠다고 시간 날린거 대비 구글 colab 여러번 돌리는 게 가성비가 좋습니다. or VPN 사용하기
'Computer Science > Python' 카테고리의 다른 글
[Python] re 모듈: 정규 표현식 (0) | 2025.04.04 |
---|---|
웹 크롤링은 프록시(Proxy)가 필요하다 (셀레니움, Beautiful Soup) (0) | 2025.03.23 |
[Python] 파이썬 독학 자료 정리 (1) | 2025.03.01 |
[Python] 코딩 테스트 필수 STL 1탄 (중요도와 사용 빈도 기준) (0) | 2025.02.06 |