【python】OAuth経由でSearch ConsoleのAPIから検索アナリティクスデータをCSVに保存する

Search ConsoleのAPIから、OAuth経由で検索アナリティクスのデータを抜き出してくる方法。
検索アナリティクスは90日分のデータしか保存されないので、定期的にこのプログラムを動かして、検索アナリティクスのデータを蓄積していきたい。

準備

諸々の必要なモジュールをインポートする。
今回は事前にSQlite3に保存しておいた、OAuth認証トークンを使用する。
CSVの生成用にpandasもインポート。

#OAuth認証のデータを扱う時に使う
import json
import sqlite3

#API経由でデータ取得する時に使う
import httplib2
from apiclient.discovery import build
from oauth2client.client import OAuth2WebServerFlow
from oauth2client import client

#CSVに保存する時に使う
import pandas as pd
from pandas import DataFrame, Series

検索アナリティクスのデータ取得

サイトURLや取得対象日の入力

複数サイトを管理してる場合でも扱いやすくするために、今回はインプットでサイトURLを指定する方式にする。

#取得対象のURL、開始日、終了日をインプットで入力する。
property_uri = input('取得対象のURL: ')
s_date = input('開始日の入力(YYYY-MM-DD):')
e_date = input('終了日の入力(YYYY-MM-DD):')

#CSVのファイル名用にURLの変換
domain = property_uri.replace('://','_').replace('/','_')

OAuthトークンを、SQlite3から抜き出すための関数

SQlite3で作成したテーブルから、取得対象URLに一致するサイトのOAuthトークンを取り出す。
※前もってOAuth認証を済ませておき、OAuthトークンをSQlite3に保存しておく必要がある。

def get_oauth_json():
    #OAuth認証情報のデータベースに接続
    #oauth_database.dbは同じディレクトリに保存しておく
    connecter = sqlite3.connect('oauth_database.db')
    c = connecter.cursor()

    #データベースから、取得対象URLに一致するデータを抜き出し
    c.execute("select * from oauth_list where site_name = '" + property_uri +"' ")
    for row in c:
        oauth_json = row[1]
    
 #データベースを閉じる
    connecter.commit()
    connecter.close()
    
    #取得対象URLのOAuth認証データを返す
    return oauth_json

リクエストを処理するための関数

これは参考にした記事の内容をそのまま使用させて頂いている。

def execute_request(webmasters_service, property_uri, request):
    return webmasters_service.searchanalytics().query(
        siteUrl=property_uri, body=request).execute()

取得したデータをCSVを保存するための関数

今回は取得したデータをCSVにして保存する。

def print_table(response):
    if 'rows' not in response:
        print ('Empty response')
        return
    rows = response['rows']
    df = DataFrame(rows)
    
    #取得したデータのままだと検索クエリがリストになっているので、キーワードを抜き出す。
    keys = Series(df['keys'].apply(lambda x : x[0]))
    df['keys'] = keys
    
    #各カラムの名前を日本語に変換。
    shaped_df = df.rename(columns={'keys': 'キーワード', 'clicks': 'クリック数', 'impressions':'表示回数','position':'平均掲載順位','ctr':'CTR'})
    
    #カラムの並び替え。Search Consoleの画面と同じ並びにする。
    shaped_df = shaped_df.loc[:,['キーワード','クリック数','表示回数','CTR','平均掲載順位']]
    
    output_name ='【' + domain +'】SearchAnalytics_' +s_date + '_ ' + e_date + '.csv'
    
 #CSV形式でアウトプット
    df2.to_csv(output_name)

メインの処理

sqliteからOAtuhトークンを取り出し、API経由で取り出した検索アナリティクスのデータをCSVに保存する。

def main():
    oauth_json_data = get_oauth_json()
    credentials = client.OAuth2Credentials.from_json(oauth_json_data)    
    http_auth = credentials.authorize(httplib2.Http())

    webmasters_service = build('webmasters', 'v3', http=http_auth)
        
    # Get the queries for the date range, sorted by click count, descending.
    request = {
        'startDate': s_date,
        'endDate': e_date,
        'dimensions': ['query'],
        'rowLimit': 2000
    }
    response = execute_request(webmasters_service, property_uri, request)
    print_table(response)

実行

if __name__ == '__main__':
    main()

下記の形式で、CSVで保存される。
f:id:otoha-googl:20171119023518p:plain

まとめ

OAuth認証の仕方すら知らない状態からだったので、すごく苦戦してしまった…。
でも何とか形に出来たので、あとはスケジュール通りに実行できる仕組みさえ整えてしまえば、かなり便利になりそう!


今回のプログラムの作成にあたって下記の記事を参考にさせて頂きました。
xxbxxqxx.com