| #!/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 = ",".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) |