Работа с API Google Search Console на Python в целях SEO-оптимизации
Get All Your Search traffic With Google Search Console API (With Code Sample)
github
Данная статья перевод текста Get All Your Search traffic With Google Search Console API (With Code Sample) с дополнениями автора перевода.
Содержание
- Что потребуется
- Ограничения Google Search Console
- Какие данные вы можете извлечь?
- Извлечение всех данных по ключевым словам из Google Search Console
- Шаг 1: Получить ключ API Google Search Console
- Шаг 2: Импорт библиотек
- Шаг 3: Создайте каталог для вашего проекта
- Шаг 4. Авторизация в API
- Шаг 5: Выполняем запрос
- Шаг 6: Создание функции для обработки CSV-файлов
- Шаг 7: Функция для извлечения всех данных
- Шаг 8: Выполнить запрос
Что потребуется
- клиентская библиотека google-api-python-client. Подробнее тут
- созданные учетные данные (идентификатор и секретный ключ клиента)
В этой статье показано, как автоматически извлечь весь поисковый трафик и все ключевые слова из Google Webmaster Tool с помощью Python и Google Search Console API.
Ниже пошаговое руководство с образцом кода.
Это идеальное решение для SEO-оптимизаторов, работающих на больших сайтах, имеющих много страниц и большое количество ключевых слов.
Вы узнаете, как извлечь более 25000 ключевых слов и автоматически экспортировать данные в CSV-файл. С помощью этого скрипта мне удалось ежемесячно извлекать более 500 тыс. строк данных из GSC API.
Дополнительные ссылки:
- Видеоурок GSC API.
- Полное руководством по Python для SEO
- Руководства по Google Search Console API
Ограничения Google Search Console
GSC — это бесплатный инструмент, предлагаемый Google, поэтому нормально, что они не показывают все данные, так как это был бы очень дорогой процесс. Вместо этого они предлагают вам API.
С GSC вы не сможете получить полный отчет о наиболее эффективных ключевых словах по страницам, странам или устройствам. Данные о эффективности в Google Search Console ограничивают вас 1000 строками данных.
GSC API позволяет создавать отчеты по ключевым словам по страницам, а также позволяет запрашивать все страницы и все ключевые слова, которые можно извлечь из GSC.
Какие данные вы можете извлечь?
API консоли поиска Google имеет три функции: аналитика поиска , карты сайта и сайты .
- Search Analytics — позволяет извлекать подробную информацию из отчетов по эффективности (клики, CTR и показы).
- Карты сайта — позволяет перечислять, добавлять, удалять или обновлять карты сайта.
- Сайты — позволяет получать, перечислять, добавлять или удалять веб-сайты из GSC.
Извлечение всех данных по ключевым словам из Google Search Console
Для тех, кто не привык работать с API, это может быть препятствием для старта, но это не должно вас останавливать, потому что API Google великолепно решает задачи SEO.
Вот шаги по извлечению всех данных о поисковом трафике из API Google Search Console:
- Получить ключ API Google Search Console
- Импортировать библиотеки
- Войти в API
- Сделать запрос к API
Шаг 1: Получить ключ API Google Search Console
Во-первых, вам нужно получить ключ для подключения к API Google Search Console.
Ключ API — это своего рода имя пользователя и пароль, которые вам необходимы для доступа к API.
Следуйте этому руководству, в нем описаны подробные шаги по получению API-ключа Google Search Console.
Вот шаги для получения ключа API Google Search Console:
- Перейдите в консоль разработчиков Google и войдите в систему;
- Создайте проект в Google API
- Перейдите в «Библиотеку» и нажмите «Включить API и услуги»;
- Найдите «API Google Search Console» и включите API;
- Перейдите на вкладку «credential», нажмите «create credential» и выберите «OAuth Client ID»;
- Выберите «Desctop app» в качестве типа приложения и нажмите кнопку «Создать»;
- Cохраните JSON-файл с идентификатором и ключом клиента.
Шаг 2: Импорт библиотек
Предварительно установите google-api-python-client
pip install google-api-python-client
Вот библиотеки, которые понадобятся для запуска.
import pandas as pd import datetime from datetime import date, timedelta import httplib2 from googleapiclient.discovery import build from oauth3client.client import OAuth3WebServerFlow from collections import defaultdict from dateutil import relativedelta import argparse from oauth3client import client from oauth3client import file from oauth3client import tools import re import os from urllib.parse import urlparse
Шаг 3: Создайте каталог для вашего проекта
Цель здесь состоит в том, чтобы использовать добавленный URL-адрес для создания каталога вашего проекта для хранения данных CSV. Эти две функции извлекут доменное имя и создадут проект с использованием доменного имени.
# Get Domain Name to Create a Project
def get_domain_name(start_url):
domain_name = '{uri.netloc}'.format(uri=urlparse(start_url)) # Get Domain Name To Name Project
domain_name = domain_name.replace('.','_')
return domain_name
# Create a project Directory for this website
def create_project(directory):
if not os.
path.exists(directory):
print('Create project: '+ directory)
os.makedirs(directory)Шаг 4. Авторизация в API
Теперь, чтобы авторизоваться в API, вам нужно будет загрузить свой ключ API JSON с шага 1 и сохранить его как client_secrets.json в своей рабочей папке.
def authorize_creds(creds):
# Variable parameter that controls the set of resources that the access token permits.
SCOPES = ['https://www.googleapis.com/auth/webmasters.readonly']
# Path to client_secrets.json file
CLIENT_SECRETS_PATH = creds
# Create a parser to be able to open browser for Authorization
parser = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter,
parents=[tools.argparser])
flags = parser.parse_args([])
flow = client.flow_from_clientsecrets(
CLIENT_SECRETS_PATH, scope = SCOPES,
message = tools.message_if_missing(CLIENT_SECRETS_PATH))
# Prepare credentials and authorize HTTP
# If they exist, get them from the storage object
# credentials will get written back to a file.
storage = file.Storage('authorizedcreds.dat')
credentials = storage.get()
# If authenticated credentials don't exist, open Browser to authenticate
if credentials is None or credentials.invalid:
credentials = tools.run_flow(flow, storage, flags)
http = credentials.authorize(http=httplib2.Http())
webmasters_service = build('webmasters', 'v3', http=http)
return webmasters_service Шаг 5: Выполняем запрос
Создадим функцию для выполнения запроса к Google Search Console API.
def execute_request(service, property_uri, request):
return service.searchanalytics().query(siteUrl=property_uri, body=request).execute()Шаг 6: Создание функции для обработки CSV-файлов
Напишим функцию, которая будет сохранять данные в CSV-файл всякий раз, когда будет закончено извлечение данных за определенную дату. Также будем проверить, были ли обработаны даты, чтобы не извлекать одну и ту же информацию дважды.
# Create function to write to CSV
def write_to_csv(data,filename):
if not os.
path.isfile(filename):
data.to_csv(filename)
else: # else it exists so append without writing the header
data.to_csv(filename, mode='a', header=False)
# Read CSV if it exists to find dates that have already been processed.
def get_dates_from_csv(path):
if os.path.isfile(path):
data = pd.read_csv(path)
data = pd.Series(data['date'].unique())
return data
else:
passШаг 7: Функция для извлечения всех данных
Данная функция в качестве даты конца выгрузки (end_date) берет текущую дату — 3 дня. Если вам необходимо выгрузить данные за определенный промежуток времени задайте свои start_date и end_date.
Например:
start_date = datetime.datetime.strptime('2021-02-01', "%Y-%m-%d")
end_date = datetime.datetime.strptime('2021-02-28', "%Y-%m-%d")# Create function to extract all the data
def extract_data(site,creds,num_days,output):
domain_name = get_domain_name(site)
create_project(domain_name)
full_path = domain_name + '/' + output
current_dates = get_dates_from_csv(full_path)
webmasters_service = authorize_creds(creds)
# Set up Dates
end_date = datetime.
date.today() - relativedelta.relativedelta(days=3) #от текущей даты отнимаем 3 дня, так как данные показывает неточные
start_date = end_date - relativedelta.relativedelta(days=num_days) #начало выгрузки. конеяная дата - num_days заданное количество дней
delta = datetime.timedelta(days=1) # This will let us loop one day at the time
scDict = defaultdict(list)
while start_date <= end_date:
#Проверка что за дату не были выгружены данные ранее
if current_dates is not None and current_dates.str.contains(datetime.datetime.strftime(start_date,'%Y-%m-%d')).any():
print('Existing Date: %s' % start_date)
start_date += delta
else:
print('Start date at beginning: %s' % start_date)
maxRows = 25000 # Maximum 25K per call
numRows = 0 # Start at Row Zero
status = '' # Initialize status of extraction
while (status != 'Finished') : # Test with i < 10 just to see how long the task will take to process.
request = {
'startDate': datetime.datetime.strftime(start_date,'%Y-%m-%d'),
'endDate': datetime.datetime.strftime(start_date,'%Y-%m-%d'),
'dimensions': ['date','page','query'],
'rowLimit': maxRows,
'startRow': numRows
}
response = execute_request(webmasters_service, site, request)
try:
#Process the response
for row in response['rows']:
scDict['date'].append(row['keys'][0] or 0)
scDict['page'].append(row['keys'][1] or 0)
scDict['query'].append(row['keys'][2] or 0)
scDict['clicks'].append(row['clicks'] or 0)
scDict['ctr'].append(row['ctr'] or 0)
scDict['impressions'].append(row['impressions'] or 0)
scDict['position'].
append(row['position'] or 0)
print('successful at %i' % numRows)
except:
print('error occurred at %i' % numRows)
#Add response to dataframe
df = pd.DataFrame(data = scDict)
df['clicks'] = df['clicks'].astype('int')
df['ctr'] = df['ctr']*100
df['impressions'] = df['impressions'].astype('int')
df['position'] = df['position'].round(2)
print('Numrows at the start of loop: %i' % numRows)
try:
numRows = numRows + len(response['rows'])
except:
status = 'Finished'
print('Numrows at the end of loop: %i' % numRows)
if numRows % maxRows != 0:
status = 'Finished'
start_date += delta
print('Start date at end: %s' % start_date)
write_to_csv(df,full_path)
return dfШаг 8: Выполнить запрос
site = 'https://site.ru' # Property to extract num_days = 30 # Number of Days to Extract creds = 'client_secret.json' # Credential file from GSC. output = 'gsc_data.csv' extract_data(site,creds,num_days,output) #df = extract_data(site,creds,num_days,output) #df.sort_values('clicks',ascending=False)
После вызова функции extract_data в папке, где лежит ваш скрипт, появится папка с csv-файлом с данными по всем поисковым запросам.
Формат итогового файла выгрузки#API#Google
| из flask import Flask, перенаправление, url_for, сеанс, запрос, jsonify | |
| из flask_oauthlib.client импортировать OAuth | |
| приложение = фляга (__имя__) | |
app.![]() | |
| app.secret_key = «разработка» | |
| oauth = OAuth (приложение) | |
| google = oauth.remote_app( | |
| «гугл», | |
| Consumer_key=’xxxxxxxxxxxxxxx.apps.googleusercontent.com’, | |
| Consumer_secret=’xxxxxxxxxxxxxxxxxx’, | |
| request_token_params={ | |
| ‘область’: ‘https://www.googleapis.com/auth/userinfo.email’ | |
| }, | |
base_url=’https://www. google.com/accounts/’, | |
| request_token_url=Нет, | |
| access_token_method=’POST’, | |
| access_token_url=’https://accounts.google.com/o/oauth3/token’, | |
| authorize_url=’https://accounts.google.com/o/oauth3/auth’, | |
| ) | |
| @app.route(‘/’) | |
| индекс защиты(): | |
| , если ‘google_token’ в сеансе: | |
я = google. get(‘/v1/userinfo’) | |
| возврат jsonify(me.data) | |
| возврат перенаправления (url_for (‘логин’)) | |
| @app.route(‘/логин’) | |
| деф логин(): | |
| вернуть google.authorize(callback=url_for(‘авторизованный’, _external=True)) | |
| @app.route(‘/выход из системы’) | |
| деф выход(): | |
session. pop(‘google_token’, нет) | |
| возврат перенаправления (url_for (‘index’)) | |
| @app.route(‘/логин/авторизованный’) | |
| @google.authorized_handler | |
| авторизованный по умолчанию (соотв.): | |
| , если соответственно нет: | |
| возврат ‘Доступ запрещен: причина=%s ошибка=%s’ % ( | |
| запрос.аргументы[‘причина_ошибки’], | |
| запрос.args[‘описание_ошибки’] | |
| ) | |
сеанс[‘google_token’] = (соотв. [‘access_token’], ») | |
| я = google.get(‘/v1/userinfo’) | |
| возврат jsonify(me.data) | |
| @google.tokengetter | |
| защита get_google_oauth_token(): | |
| возврат session.get(‘google_token’) | |
| , если __name__ == ‘__main__’: | |
| app.run() |
| #!/usr/bin/env питон | |
| # Привязки Python к поисковой системе Google | |
| # Copyright (c) 2009-2013, Марио Вилас | |
| # Все права защищены. | |
| # | |
| # Распространение и использование в исходных и бинарных формах, с 9 или без0006 | |
| # модификация, разрешены при соблюдении следующих условий: | |
| # | |
| # * При повторном распространении исходного кода должно сохраняться вышеуказанное уведомление об авторских правах, | |
| # этот список условий и следующий отказ от ответственности. | |
| # * Распространение в бинарной форме должно воспроизводить указанное выше авторское право | |
| # уведомление, этот список условий и следующий отказ от ответственности в | |
| # документация и/или другие материалы, поставляемые с дистрибутивом. | |
| #* Ни имени правообладателя, ни имени его | |
| # участников можно использовать для поддержки или продвижения продуктов, созданных на основе | |
| # это программное обеспечение без специального предварительного письменного разрешения. | |
| # | |
| # ЭТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ОБЛАДАТЕЛЯМИ АВТОРСКИХ ПРАВ И УЧАСТНИКАМИ «КАК ЕСТЬ» | |
| # И ЛЮБЫЕ ЯВНЫЕ ИЛИ ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ, ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, | |
| # ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ КОММЕРЧЕСКОЙ ПРИГОДНОСТИ И ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ | |
# ОТКАЗЫВАЕТСЯ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ВЛАДЕЛЕЦ АВТОРСКИХ ПРАВ ИЛИ УЧАСТНИКИ НЕ ДОЛЖНЫ БЫТЬ | |
| # ОТВЕТСТВЕННОСТЬ ЗА ЛЮБЫЕ ПРЯМЫЕ, КОСВЕННЫЕ, СЛУЧАЙНЫЕ, СПЕЦИАЛЬНЫЕ, ОБРАЗЦОВЫЕ ИЛИ | |
| # КОСВЕННЫЕ УБЫТКИ (ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПРИОБРЕТЕНИЕ | |
| # ЗАМЕНЯЮЩИЕ ТОВАРЫ ИЛИ УСЛУГИ; ПОТЕРЯ ИСПОЛЬЗОВАНИЯ, ДАННЫХ ИЛИ ПРИБЫЛИ; ИЛИ БИЗНЕС | |
| #ПРЕРЫВАНИЕ) ОДНАКО ВЫЗВАННАЯ И ПО ЛЮБОЙ ТЕОРИИ ОТВЕТСТВЕННОСТИ, БУдь В | |
| # КОНТРАКТ, СТРОГАЯ ОТВЕТСТВЕННОСТЬ ИЛИ ДЕЛИКТ (ВКЛЮЧАЯ ХАЛАТНОСТЬ ИЛИ ИНОЕ) | |
| # ВОЗНИКАЮЩИЕ ЛЮБЫМ СПОСОБОМ В РЕЗУЛЬТАТЕ ИСПОЛЬЗОВАНИЯ ЭТОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, ДАЖЕ ПРИ СОВЕТЕ | |
# ВОЗМОЖНОСТЬ ТАКОГО ПОВРЕЖДЕНИЯ.![]() | |
| __all__ = [‘поиск’] | |
| импорт ОС | |
| система импорта | |
| время импорта | |
| , если sys.version_info[0] > 2: | |
| из http.cookiejar импортировать LWPCookieJar | |
| из запроса импорта urllib.request, urlopen | |
| из urllib.parse импортировать quote_plus, urlparse, parse_qs | |
| иначе: | |
| из импорта cookielib LWPCookieJar | |
| из urllib импорта quote_plus | |
| из запроса импорта urllib2, urlopen | |
| из urlparse импорта urlparse, parse_qs | |
# Ленивый импорт BeautifulSoup.![]() | |
| BeautifulSoup = Нет | |
| # Шаблоны URL для поиска в Google. | |
| url_home = «http://www.google.%(tld)s/» | |
| url_search = «http://www.google.%(tld)s/search?hl=%(lang)s&q=%(query)s&btnG=Google+Search» | |
| url_next_page = «http://www.google.%(tld)s/search?hl=%(lang)s&q=%(query)s&start=%(start)d» | |
| url_search_num = «http://www.google.%(tld)s/search?hl=%(lang)s&q=%(query)s&num=%(num)d&btnG=Google+Search» | |
| url_next_page_num = «http://www.google.%(tld)s/search?hl=%(lang)s&q=%(query)s&num=%(num)d&start=%(start)d» | |
# Баночка для печенья. Хранится в домашней папке пользователя. | |
| домашняя_папка = os.getenv(‘HOME’) | |
| если не домашняя_папка: | |
| домашняя_папка = os.getenv(‘ДОМ ПОЛЬЗОВАТЕЛЯ’) | |
| если не домашняя_папка: | |
| домашняя_папка = ‘.’ # Использовать текущую папку при ошибке. | |
| cookie_jar = LWPCookieJar(os.path.join(home_folder, ‘.google-cookie’)) | |
| попытка: | |
| cookie_jar.load() | |
| кроме Исключение: | |
| проход | |
# Запросите указанный URL-адрес и верните страницу ответа, используя файл cookie.![]() | |
| деф get_page(url): | |
| «»» | |
| Запросите указанный URL-адрес и верните страницу ответа, используя файл cookie. | |
| @тип URL: ул | |
| @param url: URL для получения. | |
| @rtype: ул | |
| @return: веб-страница получена по указанному URL-адресу. | |
@raise IOError: При ошибке возникает исключение.![]() | |
| @raise urllib2.URLError: При ошибке возникает исключение. | |
| @raise urllib2.HTTPError: при ошибке возникает исключение. | |
| «»» | |
| запрос = Запрос (URL) | |
| request.add_header(‘Агент пользователя’, | |
| ‘Mozilla/4.0 (совместимый; MSIE 8.0; Windows NT 6.0)’) | |
| cookie_jar.add_cookie_header (запрос) | |
| ответ = urlopen(запрос) | |
| cookie_jar.extract_cookies (ответ, запрос) | |
HTML = ответ. чтение() | |
| ответ.close() | |
| cookie_jar.save() | |
| вернуть HTML | |
| # Фильтровать ссылки, найденные в HTML-коде страниц результатов Google. | |
| # Возвращает None, если ссылка не дает корректного результата. | |
| def filter_result (ссылка): | |
| попытка: | |
| # Действительными результатами являются абсолютные URL-адреса, не указывающие на домен Google | |
# например, images. google.com или googleusercontent.com | |
| о = urlparse(ссылка, ‘http’) | |
| , если o.netloc и ‘google’ не в o.netloc: | |
| обратная ссылка | |
| # Декодировать скрытые URL. | |
| , если link.startswith(‘/url?’): | |
| ссылка = parse_qs(o.query)[‘q’][0] | |
| # Действительными результатами являются абсолютные URL-адреса, не указывающие на домен Google | |
# например, images. google.com или googleusercontent.com | |
| о = urlparse(ссылка, ‘http’) | |
| , если o.netloc и ‘google’ не в o.netloc: | |
| обратная ссылка | |
| # В противном случае или при ошибке вернуть None. | |
| кроме Исключение: | |
| проход | |
| возврат Нет | |
| # Возвращает генератор, который выдает URL-адреса. | |
поиск по определению (запрос, tld=’com’, lang=’en’, num=10, start=0, stop=None, pause=2. 0): | |
| «»» | |
| Поиск заданной строки запроса с помощью Google. | |
| @тип запроса: ул | |
| @param запрос: Строка запроса. НЕ ДОЛЖЕН кодироваться в URL-адресе. | |
| @type tld: ул | |
| @param tld: Домен верхнего уровня. | |
| @type язык: str | |
| @param lang: язык. | |
| @type num: int | |
@param num: количество результатов на странице.![]() | |
| @тип start: int | |
| @param start: Первый результат для получения. | |
| @тип остановки: int | |
| @param stop: последний результат для получения. | |
| Используйте C{None}, чтобы продолжать поиск вечно. | |
| @type pause: float | |
| @param pause: Время ожидания между HTTP-запросами. | |
| Слишком длинный промежуток сделает поиск медленным, но слишком короткий может | |
заставит Google заблокировать ваш IP. Ваш пробег может отличаться! | |
| @rtype: генератор | |
| @return: Генератор (итератор), который выдает найденные URL-адреса. Если C{стоп} | |
| Параметр | равен C{None}, итератор будет зацикливаться вечно. |
| «»» | |
| # Ленивый импорт BeautifulSoup. | |
| # Попробуйте использовать BeautifulSoup 4, если он доступен, в противном случае откатитесь к 3. | |
| глобальный BeautifulSoup | |
| , если BeautifulSoup не имеет значения: | |
| попытка: | |
| из bs4 импортировать BeautifulSoup | |
| кроме ImportError: | |
| из импорта BeautifulSoup BeautifulSoup | |
# Набор хэшей для найденных результатов.![]() | |
| # Это используется, чтобы избежать повторяющихся результатов. | |
| хэшей = set() | |
| # Подготовить строку поиска. | |
| запрос = quote_plus(запрос) | |
| # Возьмите куки с домашней страницы. | |
| get_page(url_home% vars()) | |
| # Подготовьте URL первого запроса. | |
| если начать: | |
| , если число == 10: | |
| url = url_next_page% vars() | |
| иначе: | |
| url = url_next_page_num% vars() | |
| иначе: | |
| , если число == 10: | |
| url = url_search% vars() | |
| иначе: | |
| url = url_search_num % vars() | |
# Цикл, пока мы не достигнем максимального результата, если он есть (иначе, цикл навсегда).![]() | |
| пока не остановится или не запустится < стоп: | |
| # Сон между запросами. | |
| время сна(пауза) | |
| # Запрос страницы результатов поиска Google. | |
| html = get_page(url) | |
| # Разобрать ответ и обработать каждый привязанный URL. | |
| суп = BeautifulSoup(html) | |
якорей = суп. найти(идентификатор=’поиск’).найтиВсе(‘а’) | |
| для анкеров: | |
| # Получить URL-адрес из тега привязки. | |
| попытка: | |
| ссылка = [‘href’] | |
| кроме KeyError: | |
| продолжить | |
| # Фильтровать недействительные ссылки и ссылки, указывающие на сам Google. | |
| ссылка = filter_result(ссылка) | |
| если не ссылка: | |
| продолжить | |
# Отбросить повторяющиеся результаты.![]() | |
| ч = хэш (ссылка) | |
| если h в хэшах: | |
| продолжить | |
| хэшей.add(h) | |
| # Выдать результат. | |
| выход ссылка | |
| # Завершить, если больше нет результатов. | |
| , если не суп. найти (id = ‘nav’): | |
| перерыв | |
# Подготовить URL для следующего запроса.![]() | |
| начало += число | |
| , если число == 10: | |
| url = url_next_page% vars() | |
| иначе: | |
| url = url_next_page_num% vars() | |
| # При запуске как скрипт… | |
| если __name__ == «__main__»: | |
| из optparse import OptionParser, IndentedHelpFormatter | |
| класс BannerHelpFormatter (IndentedHelpFormatter): | |
«Небольшое изменение в optparse для печати баннера. » | |
| def __init__(я, баннер, *argv, **argd): | |
| селф.баннер = баннер | |
| IndentedHelpFormatter.__init__(self, *argv, **argd) | |
| def format_usage(я, использование): | |
| msg = IndentedHelpFormatter.format_usage(я, использование) | |
| вернуть ‘%s\n%s’ % (self.banner, msg) | |
| # Разобрать аргументы командной строки. | |
| Форматтер | = BannerHelpFormatter( |
| «Скрипт Python для использования поисковой системы Google\n» | |
«Марио Вилас (mvilas в gmail. com)\n» | |
| «https://github.com/MarioVilas/google\n» | |
| ) | |
| парсер = OptionParser(formatter=formatter) | |
| parser.set_usage(«%prog [параметры] запрос») | |
| parser.add_option(«—tld», metavar=»TLD», type=»string», default=»com», | |
| help=»используемый домен верхнего уровня [по умолчанию: com]») | |
| parser.add_option(«—lang», metavar=»LANGUAGE», type=»string», default=»en», | |
| help=»выводить результаты на заданном языке [по умолчанию: en]») | |
parser. add_option(«—num», metavar=»NUMBER», type=»int», по умолчанию=10, | |
| help=»количество результатов на странице [по умолчанию: 10]») | |
| parser.add_option(«—start», metavar=»NUMBER», type=»int», default=0, | |
| help=»первый результат для получения [по умолчанию: 0]») | |
| parser.add_option(«—stop», metavar=»NUMBER», type=»int», по умолчанию=0, | |
| help=»последний результат для получения [по умолчанию: неограниченно]») | |
| parser.add_option(«—pause», metavar=»SECONDS», type=»float», default=2.0, | |
help=»пауза между HTTP-запросами [по умолчанию: 2.![]() |


path.exists(directory):
print('Create project: '+ directory)
os.makedirs(directory)
storage = file.Storage('authorizedcreds.dat')
credentials = storage.get()
# If authenticated credentials don't exist, open Browser to authenticate
if credentials is None or credentials.invalid:
credentials = tools.run_flow(flow, storage, flags)
http = credentials.authorize(http=httplib2.Http())
webmasters_service = build('webmasters', 'v3', http=http)
return webmasters_service
date.today() - relativedelta.relativedelta(days=3) #от текущей даты отнимаем 3 дня, так как данные показывает неточные
start_date = end_date - relativedelta.relativedelta(days=num_days) #начало выгрузки. конеяная дата - num_days заданное количество дней
delta = datetime.timedelta(days=1) # This will let us loop one day at the time
scDict = defaultdict(list)
while start_date <= end_date:
#Проверка что за дату не были выгружены данные ранее
if current_dates is not None and current_dates.str.contains(datetime.datetime.strftime(start_date,'%Y-%m-%d')).any():
print('Existing Date: %s' % start_date)
start_date += delta
else:
print('Start date at beginning: %s' % start_date)
maxRows = 25000 # Maximum 25K per call
numRows = 0 # Start at Row Zero
status = '' # Initialize status of extraction
while (status != 'Finished') : # Test with i < 10 just to see how long the task will take to process.
append(row['position'] or 0)
print('successful at %i' % numRows)
except:
print('error occurred at %i' % numRows)
#Add response to dataframe
df = pd.DataFrame(data = scDict)
df['clicks'] = df['clicks'].astype('int')
df['ctr'] = df['ctr']*100
df['impressions'] = df['impressions'].astype('int')
df['position'] = df['position'].round(2)
print('Numrows at the start of loop: %i' % numRows)
try:
numRows = numRows + len(response['rows'])
except:
status = 'Finished'
print('Numrows at the end of loop: %i' % numRows)
if numRows % maxRows != 0:
status = 'Finished'
start_date += delta
print('Start date at end: %s' % start_date)
write_to_csv(df,full_path)
return df
py на мастере · KimiNewt/google · GitHub
НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ВЛАДЕЛЕЦ АВТОРСКИХ ПРАВ ИЛИ УЧАСТНИКИ НЕ ДОЛЖНЫ БЫТЬ

Хранится в домашней папке пользователя.
чтение()
google.com или googleusercontent.com
google.com или googleusercontent.com
0):
Ваш пробег может отличаться!

найти(идентификатор=’поиск’).найтиВсе(‘а’)

»
com)\n»
add_option(«—num», metavar=»NUMBER», type=»int», по умолчанию=10,