SerpAPI 완전 가이드 - Google 검색 크롤링 대안의 모든 것
SerpAPI 완전 가이드 - Google 검색 크롤링 대안의 모든 것
Google 검색 결과를 자동으로 수집하고 싶었던 경험이 있으신가요? 저는 있었습니다. 직접 크롤링을 시도하다가 IP 차단, CAPTCHA, 구조 변화 등 다양한 벽에 부딪혔죠. 이 문제를 해결하기 위해 찾은 대안이 SerpAPI입니다. 오늘은 SerpAPI가 무엇인지, 어떻게 사용하는지, 그리고 무료로试用하는 방법까지 정리합니다.
Google 검색 크롤링의 현실
크롤링 시도에서 마주한 벽
직접 Google 검색 결과를 크롤링하려고 하면 다음과 같은 문제들이 발생합니다:
| 문제 | 설명 |
|---|---|
| IP 차단 | 반복적인 요청으로 인해 Google이 요청을 차단 |
| CAPTCHA | 비정상적인 트래픽으로 인해 검증 요청 발생 |
| 구조 변화 | Google의 HTML 구조가 빈번하게 변경되어 파싱 실패 |
| 동적 콘텐츠 | JavaScript로 렌더링되는 콘텐츠无法抓取 |
| ** rate limit** | 短时间内大量请求时被限制 |
저는 Python으로 requests와 BeautifulSoup을 사용해 크롤러를 만들었지만, 며칠 만에 IP가 차단되고, HTML 구조가 변경되어 파싱 코드가 작동하지 않았습니다.
SerpAPI란?
SerpAPI는 Google, Bing, Baidu 등 주요 검색 엔진의 검색 결과 데이터를 API 형태로 제공하는 서비스입니다. 직접 크롤링하는 대신 SerpAPI를 통해 안정적으로 검색 결과를 가져올 수 있습니다.
핵심 특징
- 직접 크롤링 대안:我们自己不用爬Google, API로 결과만 받음
- 구조화된 데이터:JSON 형태로 검색 결과를 반환
- 스크린샷 지원:검색 결과 페이지의 이미지 भी 제공
- 무료 티어 제공:월 250회까지 무료 사용 가능
지원 검색 엔진
SerpAPI는 다음과 같은 검색 엔진을 지원합니다:
- Bing
- Baidu
- Yahoo
- DuckDuckGo
- Yandex
- Naver (제한적)
SerpAPI 사용 방법
1. API 키 발급
먼저 SerpAPI 웹사이트에서 계정을 생성하고 API 키를 발급받습니다.
- SerpAPI 웹사이트 방문
- Sign Up으로 계정 생성
- Dashboard에서 API Key 확인
2. 기본 사용 예시
import requests
# API 키 설정
API_KEY = "your_api_key_here"
# 검색 쿼리 설정
query = "Python programming"
engine = "google"
num_results = 10
# API 요청 URL
url = f"https://serpapi.com/search?q={query}&engine={engine}&num={num_results}&api_key={API_KEY}"
# 요청 보내기
response = requests.get(url)
data = response.json()
# 결과 출력
for result in data.get("organic_results", []):
print(f"Title: {result.get('title')}")
print(f"Link: {result.get('link')}")
print(f"Snippet: {result.get('snippet')}")
print("---")
3. 검색 결과 페이지 스크린샷 얻기
SerpAPI의 가장 강력한 기능 중 하나는 검색 결과 페이지의 스크린샷을 얻을 수 있다는 것입니다.
import requests
API_KEY = "your_api_key_here"
# 스크린샷 포함하여 요청
params = {
"q": "Django REST Framework tutorial",
"engine": "google",
"num": 10,
"api_key": API_KEY,
"tbm": "isch", # 이미지 검색
"ijn": 0, # 페이지 번호
}
response = requests.get("https://serpapi.com/search", params=params)
data = response.json()
# 이미지 결과에서 스크린샷 확인
if "images_results" in data:
for image in data["images_results"][:5]:
print(f"Thumbnail: {image.get('thumbnail')}")
print(f"Source: {image.get('source')}")
print("---")
# 전체 페이지 스크린샷 (Paid 플랜)
if "search_metadata" in data:
print(f"PNG URL: {data.get('image_url')}")
4. 다양한 검색 유형 지원
# 일반 웹 검색
params = {
"q": "best Python frameworks 2026",
"engine": "google",
"api_key": API_KEY,
}
# 이미지 검색
params = {
"q": "cat images",
"engine": "google",
"tbm": "isch", # image search
"api_key": API_KEY,
}
# 뉴스 검색
params = {
"q": "AI technology",
"engine": "google",
"tbm": "nws", # news search
"api_key": API_KEY,
}
# 비디오 검색
params = {
"q": "Python tutorial",
"engine": "google",
"tbm": "vid", # video search
"api_key": API_KEY,
}
주요 기능 정리
1. 검색 결과 유형
SerpAPI는 다양한 검색 결과를 반환합니다:
| 필드 | 설명 |
|---|---|
organic_results |
일반 검색 결과 |
knowledge_graph |
지식 그래프 정보 |
images_results |
이미지 검색 결과 |
news_results |
뉴스 검색 결과 |
shopping_results |
쇼핑 검색 결과 |
local_results |
지역 검색 결과 |
video_results |
비디오 검색 결과 |
2. 필터 및 정렬 옵션
params = {
"q": "Python tutorial",
"engine": "google",
"api_key": API_KEY,
"tbs": "qdr:d", # 최근 24시간
"sort": "relevance", # 정렬 기준
}
3. 위치 및 언어 설정
params = {
"q": "coffee shop",
"engine": "google",
"api_key": API_KEY,
"gl": "us", # 국가
"hl": "en", # 언어
"location": "California, United States", # 위치
}
무료 티어 활용하기
무료 플랜 제한
| 항목 | 무료 플랜 |
|---|---|
| 월간 요청 횟수 | 250회 |
| 검색 엔진 | Google, Bing 등 |
| 스크린샷 | 제한적 |
| 동시 요청 | 1개 |
| 지원 | 이메일 지원 |
무료로 최대한 활용하는 팁
- 필요한 데이터만 요청:불필요한 필드 요청을 줄여 효율적으로 사용
- 캐싱 활용:같은 쿼리는 결과를 저장하여 중복 요청 방지
- 배치 처리:여러 쿼리를 하나로 묶어 처리
- 개발 환경 분리:테스트용과 프로덕션용 분리
import requests
from functools import lru_cache
API_KEY = "your_api_key_here"
# 캐싱을 통한 중복 요청 방지
@lru_cache(maxsize=100)
def search_with_cache(query, num=10):
url = f"https://serpapi.com/search?q={query}&engine=google&num={num}&api_key={API_KEY}"
response = requests.get(url)
return response.json()
# 테스트
result = search_with_cache("Django REST Framework")
print(f"총 결과 수: {len(result.get('organic_results', []))}")
실제 사용 사례
1. SEO 모니터링
def track_keyword_rankings(keywords, target_domain):
results = []
for keyword in keywords:
data = search_with_cache(keyword)
for i, result in enumerate(data.get("organic_results", []), 1):
if target_domain in result.get("link", ""):
results.append({
"keyword": keyword,
"rank": i,
"title": result.get("title"),
"url": result.get("link")
})
break
return results
# 사용 예시
keywords = ["Django tutorial", "Python web framework", "REST API Django"]
rankings = track_keyword_rankings(keywords, "example.com")
for r in rankings:
print(f"Keyword: {r['keyword']}, Rank: {r['rank']}")
2. 경쟁사 분석
def analyze_competitors(query, competitors):
data = search_with_cache(query)
analysis = {}
for comp in competitors:
count = 0
for result in data.get("organic_results", []):
if comp.lower() in result.get("link", "").lower():
count += 1
analysis[comp] = count
return analysis
# 사용 예시
competitors = ["github.com", "stackoverflow.com", "medium.com"]
result = analyze_competitors("Python Django", competitors)
print(result)
가격 정책
| 플랜 | 월간 비용 | 요청 횟수 | 특징 |
|---|---|---|---|
| Free | $0 | 250회/월 | 기본 기능 |
| Starter | $50 | 5,000회/월 | 스크린샷 포함 |
| Standard | $100 | 15,000회/월 | 모든 기능 |
| Professional | $200 | 30,000회/월 | 우선 지원 |
| Enterprise | 맞춤가 | 무제한 | 커스텀 지원 |
결론
직접 Google 검색을 크롤링하다 보면 IP 차단, 구조 변화, CAPTCHA 등 다양한 문제에 직면합니다. SerpAPI는 이러한 문제를 해결하고 안정적으로 검색 결과를 가져올 수 있는 대안을 제공합니다.
특히 월 250회 무료로試해볼 수 있으므로, 직접 크롤링에서 어려움을 겪고 계신다면 SerpAPI를検討해보세요. 스크린샷 기능까지 제공되므로 시각적인 분석이 필요한 경우에도 유용합니다.
다음 포스트에서는 SerpAPI를 활용한 더 구체적인 자동화 사례를 다뤄보겠습니다.
참고: SerpAPI 가격 및 기능은 변경될 수 있습니다. 공식 웹사이트를 확인하세요.