구글 서치콘솔 색인 생성 요청, 이제 클릭 노가다 없이 자동으로!
블로그를 운영하다 보면 이런 상황을 겪게 됩니다.
구글 서치콘솔을 열면 "발견됨 - 현재 색인이 생성되지 않음" 상태의 URL이 수십, 수백 개씩 쌓여 있습니다. 하나씩 처리하려면 이 과정을 반복해야 합니다.
URL 검사 클릭 → 실제 URL 테스트 클릭 → 완료 대기 → 색인 생성 요청 클릭 → 다음 URL로 이동 → 반복...
URL이 10개면 그나마 참을 수 있습니다. 하지만 100개, 200개라면? 이건 사람이 할 일이 아닙니다. 오늘은 이 반복 작업을 Python 스크립트 하나로 완전 자동화하는 방법을 공유합니다.
📌 핵심 원리 : Google Indexing API
구글은 공식적으로 Indexing API를 제공합니다. 원래는 구인 공고(JobPosting)나 라이브 방송(BroadcastEvent) 페이지를 위해 만들어졌지만, 실제로는 일반 URL에도 동작합니다.
이 API를 활용하면 URL 목록을 텍스트 파일에 담아두고 스크립트를 실행하는 것만으로 모든 색인 요청이 자동으로 처리됩니다.
- ✅ 하루 최대 200개 URL 무료 처리
- ✅ 한 번 설정하면 다음부터는 URL만 추가하고 실행
- ✅ 성공/실패 로그 자동 저장
🔧 Step 1. Google Cloud 설정 (최초 1회)
① Google Cloud Console에서 프로젝트 생성
console.cloud.google.com에 접속해 새 프로젝트를 만듭니다.
② Indexing API 활성화
왼쪽 메뉴 → API 및 서비스 → 라이브러리 → Web Search Indexing API 검색 → 사용 설정
③ 서비스 계정(Service Account) 생성
사용자 인증 정보→+ 사용자 인증 정보 만들기→ 서비스 계정- 이름 입력 후 생성
- 생성된 서비스 계정 클릭 →
키탭 →키 추가→새 키 만들기→ JSON - 다운로드된 파일을
credentials.json으로 이름 변경 후 작업 폴더에 저장
🔑 Step 2. Search Console에서 소유자 권한 부여
이 단계가 빠지면 Permission denied 오류가 납니다. 반드시 "소유자" 권한으로 추가해야 합니다.
- Google Search Console 접속
- 좌측 하단
설정→사용자 및 권한 사용자 추가클릭- 서비스 계정 이메일 입력 (
credentials.json파일 내"client_email"값) - 권한: 소유자 선택 ← 핵심!
🐍 Step 3. Python 스크립트 준비
먼저 필요한 패키지를 설치합니다.
pip install google-api-python-client google-auth
그다음 아래 스크립트를 indexing.py로 저장합니다.
import json
import time
from pathlib import Path
from google.oauth2 import service_account
from googleapiclient.discovery import build
CREDENTIALS_FILE = "credentials.json"
SCOPES = ["https://www.googleapis.com/auth/indexing"]
DELAY_SECONDS = 1.5
LOG_FILE = "indexing_log.json"
def get_service():
credentials = service_account.Credentials.from_service_account_file(
CREDENTIALS_FILE, scopes=SCOPES
)
return build("indexing", "v3", credentials=credentials)
def request_indexing(service, url):
body = {"url": url, "type": "URL_UPDATED"}
return service.urlNotifications().publish(body=body).execute()
def load_urls():
urls = []
for line in Path("urls.txt").read_text(encoding="utf-8").splitlines():
line = line.strip()
if line and not line.startswith("#"):
urls.append(line)
return urls
def main():
urls = load_urls()
print(f"총 {len(urls)}개 URL 처리 시작\n")
service = get_service()
results = []
success = fail = 0
for i, url in enumerate(urls, 1):
try:
response = request_indexing(service, url)
print(f"[{i}/{len(urls)}] ✓ 성공: {url}")
results.append({"url": url, "status": "success"})
success += 1
except Exception as e:
print(f"[{i}/{len(urls)}] ✗ 실패: {url} - {e}")
results.append({"url": url, "status": "error", "error": str(e)})
fail += 1
time.sleep(DELAY_SECONDS)
print(f"\n완료: 성공 {success}개 / 실패 {fail}개")
with open(LOG_FILE, "w", encoding="utf-8") as f:
json.dump(results, f, ensure_ascii=False, indent=2)
if __name__ == "__main__":
main()
📝 Step 4. URL 목록 작성 및 실행
urls.txt 파일을 만들고 색인 요청할 URL을 한 줄에 하나씩 입력합니다. #으로 시작하는 줄은 무시됩니다.
# 색인 요청할 URL 목록
https://myblog.com/post-1
https://myblog.com/post-2
https://myblog.com/post-3
그리고 실행!
python indexing.py
실행하면 이런 결과가 출력됩니다.
총 180개 URL 처리 시작
[1/180] ✓ 성공: https://myblog.com/post-1
[2/180] ✓ 성공: https://myblog.com/post-2
...
완료: 성공 180개 / 실패 0개
✅ 실제 결과
이번에 "발견됨 - 현재 색인이 생성되지 않음" 상태였던 URL 180개를 약 5분 만에 전부 색인 요청했습니다. 수동으로 했다면 클릭만 수백 번, 최소 1~2시간은 걸렸을 작업입니다.
처리 완료된 URL은 urls.txt에서 자동으로 # 주석 처리해두면 다음 실행 때 중복 요청을 방지할 수 있습니다.
💡 활용 팁
URL이 200개 초과라면?
하루 할당량이 200개이므로 날짜별로 나눠서 실행하거나, Service Account를 여러 개 만들어 병행하면 됩니다.
색인 반영은 언제?
요청 후 수일~2주 내에 GSC에서 "색인 생성됨" 상태로 바뀝니다. 요청은 즉시 처리되지만 구글이 실제로 크롤링하는 시점은 구글이 결정합니다.
Blogger 사용자라면?
blogspot.com 도메인도 정상 동작합니다. GSC에서 서비스 계정을 소유자로 추가하면 됩니다.
마무리
반복 작업은 자동화가 답입니다. 한 번 세팅해두면 앞으로 새 글을 발행할 때마다 URL만 추가하고 스크립트를 돌리면 됩니다. 구글이 내 글을 더 빠르게 발견하도록 도와주는 가장 효율적인 방법입니다.
설정 과정에서 막히는 부분이 있다면 댓글로 남겨주세요!