| #!/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' |
| |
| """ |
| |
| 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, 'webmasters', 'v3', __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') |
| |
| |
| def execute_request(service, property_uri, request): |
| """Executes a searchAnalytics.query request. |
| |
| Args: |
| service: The webmasters 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 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') |
| print row_format.format( |
| keys, row['clicks'], row['impressions'], row['ctr'], row['position']) |
| |
| if __name__ == '__main__': |
| main(sys.argv) |