199 lines
6.7 KiB
Python
199 lines
6.7 KiB
Python
#!/usr/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
#
|
|
# Copyright 2015 Google Inc. All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
"""Example for using the Google Search Analytics API (part of Search Console API).
|
|
|
|
A basic python command-line example that uses the searchAnalytics.query method
|
|
of the Google Search Console API. This example demonstrates how to query Google
|
|
search results data for your property. Learn more at
|
|
https://developers.google.com/webmaster-tools/
|
|
|
|
To use:
|
|
1) Install the Google Python client library, as shown at https://developers.google.com/webmaster-tools/v3/libraries.
|
|
2) Sign up for a new project in the Google APIs console at https://code.google.com/apis/console.
|
|
3) Register the project to use OAuth2.0 for installed applications.
|
|
4) Copy your client ID, client secret, and redirect URL into the client_secrets.json file included in this package.
|
|
5) Run the app in the command-line as shown below.
|
|
|
|
Sample usage:
|
|
|
|
$ python search_analytics_api_sample.py 'https://www.example.com/' '2015-05-01' '2015-05-30'
|
|
|
|
"""
|
|
from __future__ import print_function
|
|
|
|
import argparse
|
|
import sys
|
|
from googleapiclient import sample_tools
|
|
|
|
# Declare command-line flags.
|
|
argparser = argparse.ArgumentParser(add_help=False)
|
|
argparser.add_argument('property_uri', type=str,
|
|
help=('Site or app URI to query data for (including '
|
|
'trailing slash).'))
|
|
argparser.add_argument('start_date', type=str,
|
|
help=('Start date of the requested date range in '
|
|
'YYYY-MM-DD format.'))
|
|
argparser.add_argument('end_date', type=str,
|
|
help=('End date of the requested date range in '
|
|
'YYYY-MM-DD format.'))
|
|
|
|
|
|
def main(argv):
|
|
service, flags = sample_tools.init(
|
|
argv, 'searchconsole', 'v1', __doc__, __file__, parents=[argparser],
|
|
scope='https://www.googleapis.com/auth/webmasters.readonly')
|
|
|
|
# First run a query to learn which dates we have data for. You should always
|
|
# check which days in a date range have data before running your main query.
|
|
# This query shows data for the entire range, grouped and sorted by day,
|
|
# descending; any days without data will be missing from the results.
|
|
request = {
|
|
'startDate': flags.start_date,
|
|
'endDate': flags.end_date,
|
|
'dimensions': ['date']
|
|
}
|
|
response = execute_request(service, flags.property_uri, request)
|
|
print_table(response, 'Available dates')
|
|
|
|
# Get totals for the date range.
|
|
request = {
|
|
'startDate': flags.start_date,
|
|
'endDate': flags.end_date
|
|
}
|
|
response = execute_request(service, flags.property_uri, request)
|
|
print_table(response, 'Totals')
|
|
|
|
# Get top 10 queries for the date range, sorted by click count, descending.
|
|
request = {
|
|
'startDate': flags.start_date,
|
|
'endDate': flags.end_date,
|
|
'dimensions': ['query'],
|
|
'rowLimit': 10
|
|
}
|
|
response = execute_request(service, flags.property_uri, request)
|
|
print_table(response, 'Top Queries')
|
|
|
|
# Get top 11-20 mobile queries for the date range, sorted by click count, descending.
|
|
request = {
|
|
'startDate': flags.start_date,
|
|
'endDate': flags.end_date,
|
|
'dimensions': ['query'],
|
|
'dimensionFilterGroups': [{
|
|
'filters': [{
|
|
'dimension': 'device',
|
|
'expression': 'mobile'
|
|
}]
|
|
}],
|
|
'rowLimit': 10,
|
|
'startRow': 10
|
|
}
|
|
response = execute_request(service, flags.property_uri, request)
|
|
print_table(response, 'Top 11-20 Mobile Queries')
|
|
|
|
# Get top 10 pages for the date range, sorted by click count, descending.
|
|
request = {
|
|
'startDate': flags.start_date,
|
|
'endDate': flags.end_date,
|
|
'dimensions': ['page'],
|
|
'rowLimit': 10
|
|
}
|
|
response = execute_request(service, flags.property_uri, request)
|
|
print_table(response, 'Top Pages')
|
|
|
|
# Get the top 10 queries in India, sorted by click count, descending.
|
|
request = {
|
|
'startDate': flags.start_date,
|
|
'endDate': flags.end_date,
|
|
'dimensions': ['query'],
|
|
'dimensionFilterGroups': [{
|
|
'filters': [{
|
|
'dimension': 'country',
|
|
'expression': 'ind'
|
|
}]
|
|
}],
|
|
'rowLimit': 10
|
|
}
|
|
response = execute_request(service, flags.property_uri, request)
|
|
print_table(response, 'Top queries in India')
|
|
|
|
# Group by both country and device.
|
|
request = {
|
|
'startDate': flags.start_date,
|
|
'endDate': flags.end_date,
|
|
'dimensions': ['country', 'device'],
|
|
'rowLimit': 10
|
|
}
|
|
response = execute_request(service, flags.property_uri, request)
|
|
print_table(response, 'Group by country and device')
|
|
|
|
# Group by total number of Search Appearance count.
|
|
# Note: It is not possible to use searchAppearance with other
|
|
# dimensions.
|
|
request = {
|
|
'startDate': flags.start_date,
|
|
'endDate': flags.end_date,
|
|
'dimensions': ['searchAppearance'],
|
|
'rowLimit': 10
|
|
}
|
|
response = execute_request(service, flags.property_uri, request)
|
|
print_table(response, 'Search Appearance Features')
|
|
|
|
def execute_request(service, property_uri, request):
|
|
"""Executes a searchAnalytics.query request.
|
|
|
|
Args:
|
|
service: The searchconsole service to use when executing the query.
|
|
property_uri: The site or app URI to request data for.
|
|
request: The request to be executed.
|
|
|
|
Returns:
|
|
An array of response rows.
|
|
"""
|
|
return service.searchanalytics().query(
|
|
siteUrl=property_uri, body=request).execute()
|
|
|
|
|
|
def print_table(response, title):
|
|
"""Prints out a response table.
|
|
|
|
Each row contains key(s), clicks, impressions, CTR, and average position.
|
|
|
|
Args:
|
|
response: The server response to be printed as a table.
|
|
title: The title of the table.
|
|
"""
|
|
print('\n --' + title + ':')
|
|
|
|
if 'rows' not in response:
|
|
print('Empty response')
|
|
return
|
|
|
|
rows = response['rows']
|
|
row_format = '{:<20}' + '{:>20}' * 4
|
|
print(row_format.format('Keys', 'Clicks', 'Impressions', 'CTR', 'Position'))
|
|
for row in rows:
|
|
keys = ''
|
|
# Keys are returned only if one or more dimensions are requested.
|
|
if 'keys' in row:
|
|
keys = u','.join(row['keys']).encode('utf-8').decode()
|
|
print(row_format.format(
|
|
keys, row['clicks'], row['impressions'], row['ctr'], row['position']))
|
|
|
|
if __name__ == '__main__':
|
|
main(sys.argv)
|