파이썬 프로그램만 설치할 줄 알면 ChatGPT로 구글 서치콘솔 데이터 자동화도 할 수 있다

파이썬 코드를 몰라도 ChatGPT와 Pycharm을 활용해 구글 서치콘솔 데이터 자동화하기 방법을 소개한다. 구글 서치콘솔 데이터를 최신 상태로 유지하는 것은 SEO 전문가와 웹마스터에게 필수적인 작업이다. 이 글에서는 ChatGPT와 PycCharm을 활용하여 구글 서치콘솔 데이터를 반자동으로 업데이트하는 방법을 소개한다. PyCharm을 사용하여 코드를 실행하며, Google Cloud의 Search API와 Sheets API를 활용한다.

이 글을 파이썬을 다운로드해서 초기값만 세팅한다면 챗ㅎGPT에 문의해서 정리 가능하다.

▲ 자동화 작업 시 어려운 지점(챗GPT가 잘 설명하지 못하는 것으로 보임)
– chromedrive 다운로드 시 현재 크롬 브라우저 버전과 같은 버전의 driver를 다운해야 함. chromedriver는 크롬 브라우저를 자동차처럼 움직일 수 있도록 하는 파일로 Python을 사용할 경우 이용
– 최신버전(크롬 버전 115 이상) Chrome for Testing (CfT) 가용성 대시보드
안정적 크롬버전 114 이하

파이썬 프로그램인 Pycharm 다운로드와 간략 사용법도 확인하자

ChatGPT와 Python을 활용해 구글 서치콘솔 데이터 자동화하기 예제
ChatGPT와 Python을 활용해 구글 서치콘솔 데이터 자동화하기 예제

구글 서치콘솔 데이터 자동화를 위한 준비물

  • ChatGPT: 무료 버전으로도 충분히 활용할 수 있지만, 유료 버전(ChatGPT Plus)을 사용하면 더 안정적인 서비스 이용이 가능하다.
  • PyCharm: Python 개발을 위한 IDE로, 코드 작성과 디버깅에 유용하다.
  • Google Cloud Platform: Search API와 Sheets API를 활성화해야 한다.
  • Google Search Console 계정: 데이터를 가져올 사이트의 소유권이 확인된 계정이 필요하다.

ChatGPT를 활용한 코드 작성

ChatGPT를 통해 필요한 코드를 생성할 수 있다. 예를 들어, 다음과 같이 요청할 수 있다:

“구글 서치콘솔에서 데이터를 가져와 구글 스프레드시트에 업데이트하는 Python 코드를 작성해 주세요.”

ChatGPT는 필요한 라이브러리와 함수들을 포함한 코드를 생성해 줄 것이다. 생성된 코드에서 필요한 부분을 수정하여 사용하면 된다.

PyCharm에서 코드 실행 및 오류 수정

생성된 코드를 PyCharm에 복사하여 실행한다. 실행 중 오류가 발생하면, 오류 메시지를 복사하여 ChatGPT에 다음과 같이 문의한다:

“다음 오류가 발생했다: [오류 메시지]. 이 오류를 어떻게 해결할 수 있을까요?”

ChatGPT는 오류의 원인을 분석하고 해결 방법을 제시해 줄 것이다.

Google Cloud에서 API 설정

  1. Google Cloud Console에 접속하여 프로젝트를 생성한다.
  2. Search Console APIGoogle Sheets API를 활성화한다.
  3. 서비스 계정을 생성하고, 키(JSON 파일)를 다운로드한다.
  4. 서비스 계정에 필요한 권한을 부여한다.

구글 스프레드시트와 연동

  1. 데이터를 저장할 구글 스프레드시트를 생성한다.
  2. Search Console API에 있는 서비스 계정 이메일을 스프레드시트의 공유 사용자로 추가한다.
  3. 코드에서 스프레드시트 ID와 시트 이름을 설정한다.

전체 코드 예제

아래는 모든 과정을 포함한 전체 코드이다. 필요한 부분(서비스 계정 파일 경로, 스프레드시트 ID, 속성 URL 등)을 실제 값으로 대체해야 한다.

전체 코드를 챗GPT에 넣고 내가 해야 할 일을 알려달라고 하면 된다. 파이썬 코딩을 모를 경우 몇 시간을 헤멜 수도 있지만 완료되면 나만의 코드를 만들 수 있다.

# import
import gspread
from google.oauth2 import service_account
from googleapiclient.discovery import build
from datetime import datetime, timedelta
import re

# 구글 스프레드시트와 연결을 위한 서비스 계정 파일 경로
SERVICE_ACCOUNT_FILE = '서비스 계정 파일 경로'

# 인증 범위 설정
SCOPES = ['https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/webmasters.readonly']

# 구글 스프레드시트 ID 및 워크시트 이름
SPREADSHEET_ID = '스프레드시트 ID'
RAW_WORKSHEET_NAME = 'raw_data'  # 시트 이름

# 두 개의 속성 (서치콘솔의 도메인 주소 입력)
PROPERTIES = ['https://www.example.com', 'https://m.example.com']

# 검색 유형 설정
SEARCH_TYPES = ['discover', 'news', 'web']

# 고정된 헤더 정의
HEADERS = [
    '일자',
    'www 디스커버 클릭', 'www 디스커버 노출', 'www 구글뉴스 클릭', 'www 구글뉴스 노출',
    'www 검색결과 클릭', 'www 검색결과 노출', 'www 클릭 합계', 'www 노출 합계',
    'm 디스커버 클릭', 'm 디스커버 노출', 'm 구글뉴스 클릭', 'm 구글뉴스 노출',
    'm 검색결과 클릭', 'm 검색결과 노출', 'm 클릭 합계', 'm 노출 합계',
    '통합 디스커버 클릭', '통합 디스커버 노출', '통합 구글뉴스 클릭', '통합 구글뉴스 노출',
    '통합 검색결과 클릭', '통합 검색결과 노출', '통합 클릭 합계', '통합 노출 합계'
]

# 인증 설정 및 Search Console 서비스 연결
def authenticate_service_account():
    creds = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    return creds

# 시트에서 가장 최근 날짜를 찾는 함수
def get_latest_date_from_sheet(client):
    sheet = client.open_by_key(SPREADSHEET_ID)
    worksheet = sheet.worksheet(RAW_WORKSHEET_NAME)

    # 일자 데이터를 읽어서 최신 날짜 추출
    records = worksheet.get_all_records()
    if not records:
        return None  # 데이터가 없으면 None 반환

    # 일자 형식의 가장 최신 날짜 추출 (YYYY-MM-DD 형식)
    latest_date_str = records[-1]['일자']
    match = re.search(r'\d{4}-\d{2}-\d{2}', latest_date_str)
    if match:
        latest_date_str = match.group(0)
    latest_date = datetime.strptime(latest_date_str, "%Y-%m-%d")
    return latest_date

# 데이터 수집 함수
def get_search_console_data(service, site_url, start_date, end_date):
    data = {'discover': {}, 'news': {}, 'web': {}}
    for search_type in SEARCH_TYPES:
        request = {
            'startDate': start_date.strftime('%Y-%m-%d'),
            'endDate': end_date.strftime('%Y-%m-%d'),
            'dimensions': ['date'],
            'searchType': search_type
        }
        response = service.searchanalytics().query(siteUrl=site_url, body=request).execute()
        for row in response.get('rows', []):
            date = row['keys'][0]
            if date not in data[search_type]:
                data[search_type][date] = {'clicks': 0, 'impressions': 0}
            data[search_type][date]['clicks'] += int(row.get('clicks', 0))
            data[search_type][date]['impressions'] += int(row.get('impressions', 0))
    return data

# 데이터를 포맷하고 통합하는 함수
def combine_data(data_www, data_m):
    combined_data = []
    all_dates = sorted(set(data_www['discover'].keys()) | set(data_m['discover'].keys()))

    for date in all_dates:
        # 각 속성에 대한 데이터 가져오기
        www_discover_clicks = data_www['discover'].get(date, {}).get('clicks', 0)
        www_discover_impressions = data_www['discover'].get(date, {}).get('impressions', 0)
        www_news_clicks = data_www['news'].get(date, {}).get('clicks', 0)
        www_news_impressions = data_www['news'].get(date, {}).get('impressions', 0)
        www_web_clicks = data_www['web'].get(date, {}).get('clicks', 0)
        www_web_impressions = data_www['web'].get(date, {}).get('impressions', 0)
        www_total_clicks = www_discover_clicks + www_news_clicks + www_web_clicks
        www_total_impressions = www_discover_impressions + www_news_impressions + www_web_impressions

        m_discover_clicks = data_m['discover'].get(date, {}).get('clicks', 0)
        m_discover_impressions = data_m['discover'].get(date, {}).get('impressions', 0)
        m_news_clicks = data_m['news'].get(date, {}).get('clicks', 0)
        m_news_impressions = data_m['news'].get(date, {}).get('impressions', 0)
        m_web_clicks = data_m['web'].get(date, {}).get('clicks', 0)
        m_web_impressions = data_m['web'].get(date, {}).get('impressions', 0)
        m_total_clicks = m_discover_clicks + m_news_clicks + m_web_clicks
        m_total_impressions = m_discover_impressions + m_news_impressions + m_web_impressions

        total_discover_clicks = www_discover_clicks + m_discover_clicks
        total_discover_impressions = www_discover

_impressions + m_discover_impressions
        total_news_clicks = www_news_clicks + m_news_clicks
        total_news_impressions = www_news_impressions + m_news_impressions
        total_web_clicks = www_web_clicks + m_web_clicks
        total_web_impressions = www_web_impressions + m_web_impressions
        total_clicks = www_total_clicks + m_total_clicks
        total_impressions = www_total_impressions + m_total_impressions

        # 각 행의 데이터를 올바르게 포맷팅하여 추가
        row = [
            date,
            www_discover_clicks, www_discover_impressions,
            www_news_clicks, www_news_impressions,
            www_web_clicks, www_web_impressions, www_total_clicks, www_total_impressions,
            m_discover_clicks, m_discover_impressions,
            m_news_clicks, m_news_impressions,
            m_web_clicks, m_web_impressions, m_total_clicks, m_total_impressions,
            total_discover_clicks, total_discover_impressions,
            total_news_clicks, total_news_impressions,
            total_web_clicks, total_web_impressions, total_clicks, total_impressions
        ]

        combined_data.append(row)

    return combined_data

# 데이터를 스프레드시트에 추가하는 함수
def append_data_to_google_sheets(data):
    creds = authenticate_service_account()
    client = gspread.authorize(creds)
    sheet = client.open_by_key(SPREADSHEET_ID)
    worksheet = sheet.worksheet(RAW_WORKSHEET_NAME)

    # 기존 데이터 유지 및 제목 설정
    if len(worksheet.get_all_values()) == 0:
        worksheet.append_row(HEADERS, value_input_option='USER_ENTERED')

    # 데이터 추가 (헤더 아래에 데이터 추가)
    existing_data = worksheet.get_all_values()[1:]  # 헤더 이후의 데이터만 가져옴
    existing_dates = {row[0] for row in existing_data}  # 기존 데이터의 날짜 집합

    # 중복되지 않는 일자만 추가
    new_data = [row for row in data if row[0] not in existing_dates]

    if new_data:
        # 기존 데이터 유지하면서 새로운 데이터 추가
        worksheet.append_rows(new_data, value_input_option='USER_ENTERED')

# 메인 함수
def main():
    creds = authenticate_service_account()
    client = gspread.authorize(creds)
    service = build('searchconsole', 'v1', credentials=creds)

    # 시트에서 최신 날짜 가져오기
    latest_date = get_latest_date_from_sheet(client)
    if latest_date is None:
        start_date = datetime.today() - timedelta(days=10)  # 초기 시작 날짜가 없을 경우 최근 10일 전부터 시작
    else:
        start_date = latest_date + timedelta(days=1)

    # API에서 가져올 데이터의 종료 날짜
    end_date = datetime.today() - timedelta(days=1)  # 전날까지의 데이터로 변경

    # 시작 날짜와 종료 날짜 확인
    if start_date > end_date:
        print("업데이트할 데이터가 없다. 최신 데이터가 이미 존재한다.")
        return

    # 데이터 수집을 위해 각 속성에 대해 데이터 가져오기
    data_www = get_search_console_data(service, PROPERTIES[0], start_date, end_date)
    data_m = get_search_console_data(service, PROPERTIES[1], start_date, end_date)

    # 데이터를 포맷하고 통합
    combined_data = combine_data(data_www, data_m)

    # 구글 시트에 데이터 추가
    append_data_to_google_sheets(combined_data)

    # 시트에 업데이트된 데이터의 최신 날짜 확인
    updated_data_dates = [row[0] for row in combined_data]
    if updated_data_dates:
        latest_updated_date = max(updated_data_dates)  # 업데이트된 데이터 중 가장 최신 날짜 확인
        print(f"{latest_updated_date} 까지 업데이트했다.")
    else:
        print("새로운 데이터가 없다.")

if __name__ == '__main__':
    main()

결론

이 글에서는 ChatGPT와 Python을 활용하여 구글 서치콘솔 데이터를 자동으로 구글 스프레드시트에 업데이트하는 방법을 소개했다. ChatGPT를 통해 코드를 생성하고, PyCharm에서 실행 및 디버깅하는 과정을 거치면 효율적으로 데이터를 관리할 수 있다. 이를 통해 시간을 절약하고 데이터 분석에 더 집중할 수 있다. (끝)

Leave a Comment