크롤링으로 데이터를 수집하려다가 벽에 부딪히신 적 있으신가요? 단순한 requests만으로는 원하는 데이터를 가져올 수 없었던 경험, 다들 한 번쯤 있으시죠?
🌟 크롤링의 세계로 오신 것을 환영합니다
지난 주말, 한 스타트업 대표님께서 제게 연락을 주셨습니다. "전국의 카페 리뷰 데이터가 필요한데, 어떻게 하면 좋을까요?"
같은 날 오후, 한 대학원생도 비슷한 고민을 털어놓았습니다. "논문 작성을 위한 SNS 데이터를 수집하고 싶은데, 자동화할 수 있는 방법이 없을까요?"
이런 요청들을 들으며 문득 깨달았습니다. 많은 분들이 데이터 수집의 진짜 어려움을 겪고 계시다는 것을요.
🤔 왜 단순한 크롤링으로는 부족할까요?
실제 웹사이트를 한번 상상해 보세요.
- 스크롤을 내리면 새로운 콘텐츠가 로딩되는 무한 스크롤
- 클릭해야만 나타나는 숨겨진 정보들
- 로그인이 필요한 회원 전용 페이지
이런 동적 콘텐츠들을 단순한 requests로 가져올 수 있을까요?
💡 selenium과 scrapy가 필요한 진짜 이유
1. Selenium의 마법
실제 브라우저처럼 동작하는 selenium은 마치 마법사의 지팡이 같습니다. 예제 코드와 함께 살펴볼까요?
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
# WebDriver 초기화
driver = webdriver.Chrome()
# 카페 리뷰 페이지 접속
driver.get("https://example.com/cafe-reviews")
# 로그인 처리
username = driver.find_element(By.ID, "username")
password = driver.find_element(By.ID, "password")
username.send_keys("your_id")
password.send_keys("your_password")
password.send_keys(Keys.RETURN)
# 무한 스크롤 처리
SCROLL_PAUSE_TIME = 2
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
# 스크롤 다운
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(SCROLL_PAUSE_TIME)
# 새로운 높이 계산
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
# 리뷰 데이터 수집
reviews = driver.find_elements(By.CLASS_NAME, "review-content")
for review in reviews:
print(review.text)
driver.quit()
2. Scrapy의 강력함
대규모 데이터 수집에는 scrapy가 제격입니다. 실제 구현 예시를 볼까요?
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class CafeReviewSpider(CrawlSpider):
name = 'cafe_reviews'
allowed_domains = ['example.com']
start_urls = ['https://example.com/cafe-reviews']
rules = (
# 카페 목록 페이지를 순회하는 규칙
Rule(
LinkExtractor(allow=r'cafe/\d+$'),
callback='parse_cafe'
),
)
def parse_cafe(self, response):
# 카페 정보 추출
yield {
'name': response.css('h1.cafe-name::text').get(),
'address': response.css('div.address::text').get(),
'rating': response.css('div.rating::text').get(),
'reviews': self.extract_reviews(response)
}
def extract_reviews(self, response):
reviews = []
for review in response.css('div.review-item'):
reviews.append({
'author': review.css('span.author::text').get(),
'date': review.css('span.date::text').get(),
'content': review.css('p.content::text').get(),
'rating': review.css('span.rating::text').get()
})
return reviews
# 실행 방법
scrapy crawl cafe_reviews -o cafe_reviews.json
🎯 실제 활용 사례
스타트업 대표님의 성공 스토리
카페 리뷰 데이터가 필요했던 대표님은 selenium을 활용해 문제를 해결하셨습니다.
- 무한 스크롤 자동화
- 리뷰 더보기 클릭 자동화
- 이미지와 텍스트 데이터 수집
대학원생의 연구 혁신
SNS 데이터가 필요했던 대학원생은 scrapy로 목표를 달성했습니다.
- 수백만 건의 포스트 수집
- 해시태그와 댓글 분석
- 시계열 데이터 확보
📚 시작하기 전에 알아야 할 것들
from urllib.robotparser import RobotFileParser
def check_robots_txt(url):
rp = RobotFileParser()
rp.set_url(url + "/robots.txt")
rp.read()
return rp.can_fetch("*", url)
- robots.txt 확인은 필수!
- 웹사이트의 이용약관 숙지
- 적절한 delay 설정으로 서버 부하 방지
# Scrapy settings.py
DOWNLOAD_DELAY = 2 # 2초 딜레이
RANDOMIZE_DOWNLOAD_DELAY = True
🚀 결론
웹 크롤링은 마치 보물찾기와 같습니다. 올바른 도구(selenium, scrapy)만 있다면, 여러분이 찾는 데이터라는 보물을 반드시 발견할 수 있습니다!
다음 단계로 나아가기
# 1. Selenium 설치하기
pip install scrapy
scrapy startproject mycrawler
cd mycrawler
scrapy genspider example example.com
# 2. Scrapy 시작하기
pip install scrapy
scrapy startproject mycrawler
cd mycrawler
scrapy genspider example example.com
웹 크롤링 베스트 프랙티스
- 에러 처리 추가하기
- 데이터 전처리 파이프라인 구축
- 로깅 시스템 구현
여러분의 데이터 수집 여정에 이 글이 도움이 되었기를 바랍니다.
반응형
'Develop' 카테고리의 다른 글
ElasticBeanstalk에서 Selenium 크롤링하기: 트러블슈팅부터 실전 팁까지 (0) | 2024.10.23 |
---|---|
Make.com을 활용한 업무 자동화로 칼퇴 실현하기 (0) | 2024.10.21 |
새로운 차원의 도구: ChatGPT 4.0 with Canvas, 당신의 글쓰기와 코딩 파트너 (1) | 2024.10.14 |
이미지 생성형 AI의 모든 것: 창작의 새로운 도구, 사용법, 그리고 활용 사례 (5) | 2024.10.09 |
크롤링 시 IP 차단 해결책: 휴대폰 테더링으로 IP 바꾸는 법 (0) | 2024.10.07 |