Оптимизированный Python-скрипт для Автоматизированной Системы Оптимизации Блогов

Ниже представлен оптимизированный Python-скрипт, который включает только критически важные шаги из технического задания. Скрипт выполняет следующие задачи:

    Чтение данных из Google Sheets: Получение списка URL блог-постов и целевых ключевых слов.
    Извлечение контента блогов: Получение текста блог-постов через веб-скрейпинг.
    Анализ намерений с помощью OpenAI GPT: Определение намерения страницы и ключевых слов.
    Выполнение поисковых запросов в Google: Определение текущих позиций по ключевым словам.
    Обновление Google Sheets: Запись результатов анализа обратно в таблицу.

Требования

Перед запуском скрипта убедитесь, что установлены необходимые библиотеки и настроены доступы:

    Библиотеки:
        google-auth
        google-auth-oauthlib
        google-auth-httplib2
        google-api-python-client
        requests
        beautifulsoup4
        openai

    API-ключи и учетные данные:
        Google Sheets API: Создайте проект в Google Cloud Console, включите API и скачайте credentials.json.
        OpenAI API: Получите API-ключ с OpenAI.

Установка Необходимых Библиотек

pip install google-auth google-auth-oauthlib google-auth-httplib2 google-api-python-client requests beautifulsoup4 openai

Настройка Google Sheets

    Создайте Google Sheet с необходимыми столбцами: URL, Keyword, Status, Page Intent, Keyword Intent, Current Rank.
    Поделитесь доступом к Google Sheet с сервисным аккаунтом (будет создано при настройке API).

Скрипт

import os
import requests
import openai
import time
from bs4 import BeautifulSoup
from google.oauth2 import service_account
from googleapiclient.discovery import build

# Настройки API
GOOGLE_SHEET_ID = 'ВАШ_GOOGLE_SHEET_ID'
RANGE_NAME = 'Sheet1!A:E'  # Настройте диапазон в соответствии с вашей таблицей
OPENAI_API_KEY = 'ВАШ_OPENAI_API_KEY'
GOOGLE_API_KEY = 'ВАШ_GOOGLE_API_KEY'
SEARCH_ENGINE_ID = 'ВАШ_CUSTOM_SEARCH_ENGINE_ID'

# Аутентификация для Google Sheets
SCOPES = ['https://www.googleapis.com/auth/spreadsheets']
SERVICE_ACCOUNT_FILE = 'path/to/credentials.json'  # Путь к вашим учетным данным

credentials = service_account.Credentials.from_service_account_file(
    SERVICE_ACCOUNT_FILE, scopes=SCOPES)
service = build('sheets', 'v4', credentials=credentials)
sheet = service.spreadsheets()

# Настройка OpenAI
openai.api_key = OPENAI_API_KEY

def read_google_sheets():
    """Чтение данных из Google Sheets."""
    result = sheet.values().get(spreadsheetId=GOOGLE_SHEET_ID,
                                range=RANGE_NAME).execute()
    values = result.get('values', [])
    if not values:
        print('Нет данных для обработки.')
        return []
    headers = values[0]
    data = [dict(zip(headers, row)) for row in values[1:]]
    return data

def extract_content(url):
    """Извлечение контента страницы."""
    try:
        response = requests.get(url, timeout=10)
        response.raise_for_status()
        soup = BeautifulSoup(response.text, 'html.parser')
        # Предполагается, что основной контент находится в теге <article>
        article = soup.find('article')
        if article:
            return article.get_text(separator=' ', strip=True)
        else:
            return soup.get_text(separator=' ', strip=True)
    except Exception as e:
        print(f"Ошибка при извлечении контента из {url}: {e}")
        return ""

def analyze_intent(text):
    """Анализ намерений с использованием OpenAI GPT."""
    try:
        prompt = f"Определи намерение следующего текста: \"{text}\". Намерение может быть информационным, коммерческим и т.д."
        response = openai.Completion.create(
            engine="text-davinci-003",
            prompt=prompt,
            max_tokens=60,
            temperature=0.3
        )
        intent = response.choices[0].text.strip()
        return intent
    except Exception as e:
        print(f"Ошибка при анализе намерения: {e}")
        return "Не определено"

def get_search_rank(keyword, url):
    """Получение текущего ранга страницы по ключевому слову в Google."""
    try:
        query = keyword
        response = requests.get(
            'https://www.googleapis.com/customsearch/v1',
            params={
                'key': GOOGLE_API_KEY,
                'cx': SEARCH_ENGINE_ID,
                'q': query,
                'num': 10  # Получаем первые 10 результатов
            },
            timeout=10
        )
        response.raise_for_status()
        results = response.json().get('items', [])
        for index, item in enumerate(results, start=1):
            if url in item.get('link', ''):
                return index
        return 'Не в топ-10'
    except Exception as e:
        print(f"Ошибка при выполнении поискового запроса: {e}")
        return 'Ошибка'

def update_google_sheets(updated_data):
    """Обновление Google Sheets с результатами анализа."""
    values = []
    for row in updated_data:
        values.append([
            row.get('URL', ''),
            row.get('Keyword', ''),
            row.get('Status', ''),
            row.get('Page Intent', ''),
            row.get('Keyword Intent', ''),
            row.get('Current Rank', '')
        ])
    # Включаем заголовки
    headers = ['URL', 'Keyword', 'Status', 'Page Intent', 'Keyword Intent', 'Current Rank']
    values.insert(0, headers)
    
    body = {
        'values': values
    }
    try:
        sheet.values().update(
            spreadsheetId=GOOGLE_SHEET_ID,
            range=RANGE_NAME,
            valueInputOption='RAW',
            body=body
        ).execute()
        print("Google Sheets успешно обновлены.")
    except Exception as e:
        print(f"Ошибка при обновлении Google Sheets: {e}")

def main():
    data = read_google_sheets()
    if not data:
        return
    
    for row in data:
        url = row.get('URL')
        keyword = row.get('Keyword')
        if not url or not keyword:
            continue
        
        print(f"Обработка: {url} | Ключевое слово: {keyword}")
        row['Status'] = 'Processing'
        row['Page Intent'] = ''
        row['Keyword Intent'] = ''
        row['Current Rank'] = ''
        
        # Извлечение контента
        content = extract_content(url)
        if not content:
            row['Status'] = 'Failed to extract content'
            continue
        
        # Анализ намерения страницы
        page_intent = analyze_intent(content)
        row['Page Intent'] = page_intent
        
        # Анализ намерения ключевого слова
        keyword_intent = analyze_intent(keyword)
        row['Keyword Intent'] = keyword_intent
        
        # Получение ранга в поиске
        rank = get_search_rank(keyword, url)
        row['Current Rank'] = rank
        
        row['Status'] = 'Completed'
        
        # Задержка между запросами, чтобы избежать ограничения API
        time.sleep(1)
    
    update_google_sheets(data)

if __name__ == '__main__':
    main()

Пояснения к Скрипту

    Аутентификация и Настройки:
        Google Sheets API: Используем сервисный аккаунт для доступа к Google Sheets. Убедитесь, что вы поделились таблицей с сервисным аккаунтом.
        OpenAI API: Необходимо указать API-ключ для взаимодействия с GPT.
        Google Custom Search API: Требуется настроить пользовательский поисковый движок и получить SEARCH_ENGINE_ID.

    Функции Скрипта:
        read_google_sheets(): Читает данные из указанного диапазона Google Sheets и возвращает список словарей с данными.
        extract_content(url): Извлекает текстовое содержимое из указанного URL с использованием requests и BeautifulSoup.
        analyze_intent(text): Отправляет текст в OpenAI GPT для определения намерения (например, информационное, коммерческое).
        get_search_rank(keyword, url): Выполняет поисковый запрос по ключевому слову и определяет позицию указанного URL в топ-10 результатов.
        update_google_sheets(updated_data): Обновляет Google Sheets с полученными результатами.

    Основной Поток:
        Читаем данные из Google Sheets.
        Для каждого URL и ключевого слова:
            Извлекаем контент страницы.
            Анализируем намерение страницы и ключевого слова.
            Определяем текущий ранг страницы по ключевому слову.
            Обновляем статус обработки.
        После обработки всех записей обновляем Google Sheets с результатами.

    Обработка Ошибок:
        В каждой функции предусмотрена обработка исключений с выводом сообщений об ошибках.
        При неудачном извлечении контента или выполнении поискового запроса статус записи обновляется соответствующим образом.

    Задержки между Запросами:
        Используется time.sleep(1) для предотвращения превышения лимитов API и избежания блокировок.

Дополнительные Рекомендации

    Безопасность: Не храните API-ключи прямо в коде. Используйте переменные окружения или защищенные хранилища.

    import os
    OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
    GOOGLE_API_KEY = os.getenv('GOOGLE_API_KEY')

    Логирование: Для более продвинутого логирования можно использовать модуль logging вместо простого print.

    Улучшение Производительности: При большом количестве URL можно использовать параллельную обработку с помощью concurrent.futures.ThreadPoolExecutor.

    Расширение Функциональности: В будущем можно добавить генерацию рекомендаций и экспорт их в Google Docs, а также автоматическую обработку конкурентов.

Заключение

Этот оптимизированный скрипт реализует основные функциональные требования автоматизированной системы оптимизации блогов. Для полноценной работы необходимо правильно настроить API-доступы и обеспечить надежное хранение учетных данных. Скрипт может быть расширен и доработан в соответствии с более детальными требованиями проекта. добавь размещение в блокспоте вот скрипт: import requests

# Replace with your actual credentials
API_KEY = 'YOUR_API_KEY'
ACCESS_TOKEN = 'YOUR_ACCESS_TOKEN'
BLOG_ID = 'YOUR_BLOG_ID'

def create_post(title, content):
    url = f'https://blogger.googleapis.com/v3/blogs/{BLOG_ID}/posts?key={API_KEY}'
    headers = {
        'Authorization': f'Bearer {ACCESS_TOKEN}',
        'Content-Type': 'application/json'
    }
    post_data = {
        'title': title,
        'content': content,
        'labels': ['automated']
    }
    response = requests.post(url, headers=headers, json=post_data)
    return response.json()

# Example usage
new_post = create_post('Automated Post', '<p>This is an automated blog post.</p>')
print(new_post)