919 lines
39 KiB
Python
919 lines
39 KiB
Python
"""
|
|
Enterprise SEO Command Center
|
|
|
|
Unified AI-powered SEO suite that orchestrates all existing tools into
|
|
intelligent workflows for enterprise-level SEO management.
|
|
"""
|
|
|
|
import streamlit as st
|
|
import asyncio
|
|
import pandas as pd
|
|
from typing import Dict, Any, List, Optional, Tuple
|
|
from datetime import datetime, timedelta
|
|
import json
|
|
from loguru import logger
|
|
|
|
# Import existing SEO tools
|
|
from .on_page_seo_analyzer import fetch_seo_data
|
|
from .content_gap_analysis.enhanced_analyzer import EnhancedContentGapAnalyzer
|
|
from .technical_seo_crawler.crawler import TechnicalSEOCrawler
|
|
from .weburl_seo_checker import url_seo_checker
|
|
from .google_pagespeed_insights import google_pagespeed_insights
|
|
from ..gpt_providers.text_generation.main_text_generation import llm_text_gen
|
|
|
|
# Import the new enterprise tools
|
|
from .google_search_console_integration import GoogleSearchConsoleAnalyzer, render_gsc_integration
|
|
from .ai_content_strategy import AIContentStrategyGenerator, render_ai_content_strategy
|
|
|
|
class EnterpriseSEOSuite:
|
|
"""
|
|
Enterprise-level SEO suite orchestrating all tools into intelligent workflows.
|
|
"""
|
|
|
|
def __init__(self):
|
|
"""Initialize the enterprise SEO suite."""
|
|
self.gap_analyzer = EnhancedContentGapAnalyzer()
|
|
self.technical_crawler = TechnicalSEOCrawler()
|
|
|
|
# Initialize new enterprise tools
|
|
self.gsc_analyzer = GoogleSearchConsoleAnalyzer()
|
|
self.content_strategy_generator = AIContentStrategyGenerator()
|
|
|
|
# SEO workflow templates
|
|
self.workflow_templates = {
|
|
'complete_audit': 'Complete SEO Audit',
|
|
'content_strategy': 'Content Strategy Development',
|
|
'technical_optimization': 'Technical SEO Optimization',
|
|
'competitor_intelligence': 'Competitive Intelligence',
|
|
'keyword_domination': 'Keyword Domination Strategy',
|
|
'local_seo': 'Local SEO Optimization',
|
|
'enterprise_monitoring': 'Enterprise SEO Monitoring'
|
|
}
|
|
|
|
logger.info("Enterprise SEO Suite initialized")
|
|
|
|
async def execute_complete_seo_audit(self, website_url: str, competitors: List[str],
|
|
target_keywords: List[str]) -> Dict[str, Any]:
|
|
"""
|
|
Execute a comprehensive enterprise SEO audit combining all tools.
|
|
|
|
Args:
|
|
website_url: Primary website to audit
|
|
competitors: List of competitor URLs (max 5)
|
|
target_keywords: Primary keywords to optimize for
|
|
|
|
Returns:
|
|
Comprehensive audit results with prioritized action plan
|
|
"""
|
|
try:
|
|
st.info("🚀 Initiating Complete Enterprise SEO Audit...")
|
|
|
|
audit_results = {
|
|
'audit_timestamp': datetime.utcnow().isoformat(),
|
|
'website_url': website_url,
|
|
'competitors': competitors[:5],
|
|
'target_keywords': target_keywords,
|
|
'technical_audit': {},
|
|
'content_analysis': {},
|
|
'competitive_intelligence': {},
|
|
'on_page_analysis': {},
|
|
'performance_metrics': {},
|
|
'strategic_recommendations': {},
|
|
'priority_action_plan': []
|
|
}
|
|
|
|
# Phase 1: Technical SEO Audit
|
|
with st.expander("🔧 Technical SEO Analysis", expanded=True):
|
|
st.info("Analyzing technical SEO factors...")
|
|
technical_results = await self._run_technical_audit(website_url)
|
|
audit_results['technical_audit'] = technical_results
|
|
st.success("✅ Technical audit completed")
|
|
|
|
# Phase 2: Content Gap Analysis
|
|
with st.expander("📊 Content Intelligence Analysis", expanded=True):
|
|
st.info("Analyzing content gaps and opportunities...")
|
|
content_results = await self._run_content_analysis(
|
|
website_url, competitors, target_keywords
|
|
)
|
|
audit_results['content_analysis'] = content_results
|
|
st.success("✅ Content analysis completed")
|
|
|
|
# Phase 3: On-Page SEO Analysis
|
|
with st.expander("🔍 On-Page SEO Analysis", expanded=True):
|
|
st.info("Analyzing on-page SEO factors...")
|
|
onpage_results = await self._run_onpage_analysis(website_url)
|
|
audit_results['on_page_analysis'] = onpage_results
|
|
st.success("✅ On-page analysis completed")
|
|
|
|
# Phase 4: Performance Analysis
|
|
with st.expander("⚡ Performance Analysis", expanded=True):
|
|
st.info("Analyzing website performance...")
|
|
performance_results = await self._run_performance_analysis(website_url)
|
|
audit_results['performance_metrics'] = performance_results
|
|
st.success("✅ Performance analysis completed")
|
|
|
|
# Phase 5: AI-Powered Strategic Recommendations
|
|
with st.expander("🤖 AI Strategic Analysis", expanded=True):
|
|
st.info("Generating AI-powered strategic recommendations...")
|
|
strategic_analysis = await self._generate_strategic_recommendations(audit_results)
|
|
audit_results['strategic_recommendations'] = strategic_analysis
|
|
|
|
# Generate prioritized action plan
|
|
action_plan = await self._create_priority_action_plan(audit_results)
|
|
audit_results['priority_action_plan'] = action_plan
|
|
st.success("✅ Strategic analysis completed")
|
|
|
|
return audit_results
|
|
|
|
except Exception as e:
|
|
error_msg = f"Error in complete SEO audit: {str(e)}"
|
|
logger.error(error_msg, exc_info=True)
|
|
st.error(error_msg)
|
|
return {'error': error_msg}
|
|
|
|
async def _run_technical_audit(self, website_url: str) -> Dict[str, Any]:
|
|
"""Run comprehensive technical SEO audit."""
|
|
try:
|
|
# Use existing technical crawler
|
|
technical_results = self.technical_crawler.analyze_website_technical_seo(
|
|
website_url, crawl_depth=3, max_pages=100
|
|
)
|
|
|
|
# Enhance with additional technical checks
|
|
enhanced_results = {
|
|
'crawler_results': technical_results,
|
|
'critical_issues': self._identify_critical_technical_issues(technical_results),
|
|
'performance_score': self._calculate_technical_score(technical_results),
|
|
'priority_fixes': self._prioritize_technical_fixes(technical_results)
|
|
}
|
|
|
|
return enhanced_results
|
|
|
|
except Exception as e:
|
|
logger.error(f"Technical audit error: {str(e)}")
|
|
return {'error': str(e)}
|
|
|
|
async def _run_content_analysis(self, website_url: str, competitors: List[str],
|
|
keywords: List[str]) -> Dict[str, Any]:
|
|
"""Run comprehensive content gap analysis."""
|
|
try:
|
|
# Use existing content gap analyzer
|
|
content_results = self.gap_analyzer.analyze_comprehensive_gap(
|
|
website_url, competitors, keywords, industry="general"
|
|
)
|
|
|
|
# Enhance with content strategy insights
|
|
enhanced_results = {
|
|
'gap_analysis': content_results,
|
|
'content_opportunities': self._identify_content_opportunities(content_results),
|
|
'keyword_strategy': self._develop_keyword_strategy(content_results),
|
|
'competitive_advantages': self._find_competitive_advantages(content_results)
|
|
}
|
|
|
|
return enhanced_results
|
|
|
|
except Exception as e:
|
|
logger.error(f"Content analysis error: {str(e)}")
|
|
return {'error': str(e)}
|
|
|
|
async def _run_onpage_analysis(self, website_url: str) -> Dict[str, Any]:
|
|
"""Run on-page SEO analysis."""
|
|
try:
|
|
# Use existing on-page analyzer
|
|
onpage_data = fetch_seo_data(website_url)
|
|
|
|
# Enhanced analysis
|
|
enhanced_results = {
|
|
'seo_data': onpage_data,
|
|
'optimization_score': self._calculate_onpage_score(onpage_data),
|
|
'meta_optimization': self._analyze_meta_optimization(onpage_data),
|
|
'content_optimization': self._analyze_content_optimization(onpage_data)
|
|
}
|
|
|
|
return enhanced_results
|
|
|
|
except Exception as e:
|
|
logger.error(f"On-page analysis error: {str(e)}")
|
|
return {'error': str(e)}
|
|
|
|
async def _run_performance_analysis(self, website_url: str) -> Dict[str, Any]:
|
|
"""Run website performance analysis."""
|
|
try:
|
|
# Comprehensive performance metrics
|
|
performance_results = {
|
|
'core_web_vitals': await self._analyze_core_web_vitals(website_url),
|
|
'loading_performance': await self._analyze_loading_performance(website_url),
|
|
'mobile_optimization': await self._analyze_mobile_optimization(website_url),
|
|
'performance_score': 0 # Will be calculated
|
|
}
|
|
|
|
# Calculate overall performance score
|
|
performance_results['performance_score'] = self._calculate_performance_score(
|
|
performance_results
|
|
)
|
|
|
|
return performance_results
|
|
|
|
except Exception as e:
|
|
logger.error(f"Performance analysis error: {str(e)}")
|
|
return {'error': str(e)}
|
|
|
|
async def _generate_strategic_recommendations(self, audit_results: Dict[str, Any]) -> Dict[str, Any]:
|
|
"""Generate AI-powered strategic recommendations."""
|
|
try:
|
|
# Compile audit summary for AI analysis
|
|
audit_summary = {
|
|
'technical_score': audit_results.get('technical_audit', {}).get('performance_score', 0),
|
|
'content_gaps': len(audit_results.get('content_analysis', {}).get('content_opportunities', [])),
|
|
'onpage_score': audit_results.get('on_page_analysis', {}).get('optimization_score', 0),
|
|
'performance_score': audit_results.get('performance_metrics', {}).get('performance_score', 0)
|
|
}
|
|
|
|
strategic_prompt = f"""
|
|
Analyze this comprehensive SEO audit and provide strategic recommendations:
|
|
|
|
AUDIT SUMMARY:
|
|
- Technical SEO Score: {audit_summary['technical_score']}/100
|
|
- Content Gaps Identified: {audit_summary['content_gaps']}
|
|
- On-Page SEO Score: {audit_summary['onpage_score']}/100
|
|
- Performance Score: {audit_summary['performance_score']}/100
|
|
|
|
DETAILED FINDINGS:
|
|
Technical Issues: {json.dumps(audit_results.get('technical_audit', {}), indent=2)[:1000]}
|
|
Content Opportunities: {json.dumps(audit_results.get('content_analysis', {}), indent=2)[:1000]}
|
|
|
|
Provide strategic recommendations in these categories:
|
|
|
|
1. IMMEDIATE WINS (0-30 days):
|
|
- Quick technical fixes with high impact
|
|
- Content optimizations for existing pages
|
|
- Critical performance improvements
|
|
|
|
2. STRATEGIC INITIATIVES (1-3 months):
|
|
- Content strategy development
|
|
- Technical architecture improvements
|
|
- Competitive positioning strategies
|
|
|
|
3. LONG-TERM GROWTH (3-12 months):
|
|
- Authority building strategies
|
|
- Market expansion opportunities
|
|
- Advanced SEO techniques
|
|
|
|
4. RISK MITIGATION:
|
|
- Technical vulnerabilities to address
|
|
- Content gaps that competitors could exploit
|
|
- Performance issues affecting user experience
|
|
|
|
Provide specific, actionable recommendations with expected impact and effort estimates.
|
|
"""
|
|
|
|
strategic_analysis = llm_text_gen(
|
|
strategic_prompt,
|
|
system_prompt="You are an enterprise SEO strategist with 10+ years of experience. Provide detailed, actionable recommendations based on comprehensive audit data."
|
|
)
|
|
|
|
return {
|
|
'full_analysis': strategic_analysis,
|
|
'immediate_wins': self._extract_immediate_wins(strategic_analysis),
|
|
'strategic_initiatives': self._extract_strategic_initiatives(strategic_analysis),
|
|
'long_term_growth': self._extract_long_term_growth(strategic_analysis),
|
|
'risk_mitigation': self._extract_risk_mitigation(strategic_analysis)
|
|
}
|
|
|
|
except Exception as e:
|
|
logger.error(f"Strategic analysis error: {str(e)}")
|
|
return {'error': str(e)}
|
|
|
|
async def _create_priority_action_plan(self, audit_results: Dict[str, Any]) -> List[Dict[str, Any]]:
|
|
"""Create prioritized action plan from audit results."""
|
|
try:
|
|
action_plan = []
|
|
|
|
# Extract recommendations from all analysis phases
|
|
strategic_recs = audit_results.get('strategic_recommendations', {})
|
|
|
|
# Immediate wins (High priority, low effort)
|
|
immediate_wins = strategic_recs.get('immediate_wins', [])
|
|
for win in immediate_wins[:5]:
|
|
action_plan.append({
|
|
'category': 'Immediate Win',
|
|
'priority': 'Critical',
|
|
'effort': 'Low',
|
|
'timeframe': '0-30 days',
|
|
'action': win,
|
|
'expected_impact': 'High',
|
|
'source': 'Strategic Analysis'
|
|
})
|
|
|
|
# Technical fixes
|
|
technical_issues = audit_results.get('technical_audit', {}).get('critical_issues', [])
|
|
for issue in technical_issues[:3]:
|
|
action_plan.append({
|
|
'category': 'Technical SEO',
|
|
'priority': 'High',
|
|
'effort': 'Medium',
|
|
'timeframe': '1-4 weeks',
|
|
'action': issue,
|
|
'expected_impact': 'High',
|
|
'source': 'Technical Audit'
|
|
})
|
|
|
|
# Content opportunities
|
|
content_ops = audit_results.get('content_analysis', {}).get('content_opportunities', [])
|
|
for opportunity in content_ops[:3]:
|
|
action_plan.append({
|
|
'category': 'Content Strategy',
|
|
'priority': 'Medium',
|
|
'effort': 'High',
|
|
'timeframe': '2-8 weeks',
|
|
'action': opportunity,
|
|
'expected_impact': 'Medium',
|
|
'source': 'Content Analysis'
|
|
})
|
|
|
|
# Sort by priority and expected impact
|
|
priority_order = {'Critical': 0, 'High': 1, 'Medium': 2, 'Low': 3}
|
|
action_plan.sort(key=lambda x: priority_order.get(x['priority'], 4))
|
|
|
|
return action_plan[:15] # Top 15 actions
|
|
|
|
except Exception as e:
|
|
logger.error(f"Action plan creation error: {str(e)}")
|
|
return []
|
|
|
|
# Utility methods for analysis
|
|
def _identify_critical_technical_issues(self, technical_results: Dict[str, Any]) -> List[str]:
|
|
"""Identify critical technical SEO issues."""
|
|
critical_issues = []
|
|
|
|
# Add logic to identify critical technical issues
|
|
# This would analyze the technical_results and extract critical problems
|
|
|
|
return critical_issues
|
|
|
|
def _calculate_technical_score(self, technical_results: Dict[str, Any]) -> int:
|
|
"""Calculate technical SEO score."""
|
|
# Implement scoring algorithm based on technical audit results
|
|
return 75 # Placeholder
|
|
|
|
def _prioritize_technical_fixes(self, technical_results: Dict[str, Any]) -> List[str]:
|
|
"""Prioritize technical fixes by impact and effort."""
|
|
# Implement prioritization logic
|
|
return ["Fix broken links", "Optimize images", "Improve page speed"]
|
|
|
|
def _identify_content_opportunities(self, content_results: Dict[str, Any]) -> List[str]:
|
|
"""Identify top content opportunities."""
|
|
# Extract content opportunities from gap analysis
|
|
return ["Create FAQ content", "Develop comparison guides", "Write how-to articles"]
|
|
|
|
def _develop_keyword_strategy(self, content_results: Dict[str, Any]) -> Dict[str, Any]:
|
|
"""Develop keyword strategy from content analysis."""
|
|
return {
|
|
'primary_keywords': [],
|
|
'secondary_keywords': [],
|
|
'long_tail_opportunities': [],
|
|
'competitor_gaps': []
|
|
}
|
|
|
|
def _find_competitive_advantages(self, content_results: Dict[str, Any]) -> List[str]:
|
|
"""Find competitive advantages from analysis."""
|
|
return ["Unique content angles", "Underserved niches", "Technical superiority"]
|
|
|
|
def _calculate_onpage_score(self, onpage_data: Dict[str, Any]) -> int:
|
|
"""Calculate on-page SEO score."""
|
|
return 80 # Placeholder
|
|
|
|
def _analyze_meta_optimization(self, onpage_data: Dict[str, Any]) -> Dict[str, Any]:
|
|
"""Analyze meta tag optimization."""
|
|
return {'title_optimization': 'good', 'description_optimization': 'needs_work'}
|
|
|
|
def _analyze_content_optimization(self, onpage_data: Dict[str, Any]) -> Dict[str, Any]:
|
|
"""Analyze content optimization."""
|
|
return {'keyword_density': 'optimal', 'content_length': 'adequate'}
|
|
|
|
async def _analyze_core_web_vitals(self, website_url: str) -> Dict[str, Any]:
|
|
"""Analyze Core Web Vitals."""
|
|
return {'lcp': 2.5, 'fid': 100, 'cls': 0.1}
|
|
|
|
async def _analyze_loading_performance(self, website_url: str) -> Dict[str, Any]:
|
|
"""Analyze loading performance."""
|
|
return {'ttfb': 200, 'fcp': 1.5, 'speed_index': 3.0}
|
|
|
|
async def _analyze_mobile_optimization(self, website_url: str) -> Dict[str, Any]:
|
|
"""Analyze mobile optimization."""
|
|
return {'mobile_friendly': True, 'responsive_design': True}
|
|
|
|
def _calculate_performance_score(self, performance_results: Dict[str, Any]) -> int:
|
|
"""Calculate overall performance score."""
|
|
return 85 # Placeholder
|
|
|
|
def _extract_immediate_wins(self, analysis: str) -> List[str]:
|
|
"""Extract immediate wins from strategic analysis."""
|
|
# Parse the AI analysis and extract immediate wins
|
|
lines = analysis.split('\n')
|
|
wins = []
|
|
in_immediate_section = False
|
|
|
|
for line in lines:
|
|
if 'IMMEDIATE WINS' in line.upper():
|
|
in_immediate_section = True
|
|
continue
|
|
elif 'STRATEGIC INITIATIVES' in line.upper():
|
|
in_immediate_section = False
|
|
continue
|
|
|
|
if in_immediate_section and line.strip().startswith('-'):
|
|
wins.append(line.strip().lstrip('- '))
|
|
|
|
return wins[:5]
|
|
|
|
def _extract_strategic_initiatives(self, analysis: str) -> List[str]:
|
|
"""Extract strategic initiatives from analysis."""
|
|
# Similar extraction logic for strategic initiatives
|
|
return ["Develop content hub", "Implement schema markup", "Build authority pages"]
|
|
|
|
def _extract_long_term_growth(self, analysis: str) -> List[str]:
|
|
"""Extract long-term growth strategies."""
|
|
return ["Market expansion", "Authority building", "Advanced technical SEO"]
|
|
|
|
def _extract_risk_mitigation(self, analysis: str) -> List[str]:
|
|
"""Extract risk mitigation strategies."""
|
|
return ["Fix technical vulnerabilities", "Address content gaps", "Improve performance"]
|
|
|
|
def execute_content_strategy_workflow(self, business_info: Dict[str, Any]) -> Dict[str, Any]:
|
|
"""
|
|
Execute comprehensive content strategy workflow using AI insights.
|
|
|
|
Args:
|
|
business_info: Business context and objectives
|
|
|
|
Returns:
|
|
Complete content strategy with implementation plan
|
|
"""
|
|
try:
|
|
st.info("🧠 Executing AI-powered content strategy workflow...")
|
|
|
|
# Generate AI content strategy
|
|
content_strategy = self.content_strategy_generator.generate_content_strategy(business_info)
|
|
|
|
# If GSC data is available, enhance with search insights
|
|
if business_info.get('gsc_site_url'):
|
|
gsc_insights = self.gsc_analyzer.analyze_search_performance(
|
|
business_info['gsc_site_url'],
|
|
business_info.get('gsc_date_range', 90)
|
|
)
|
|
content_strategy['gsc_insights'] = gsc_insights
|
|
|
|
# Generate SEO-optimized content recommendations
|
|
seo_content_recs = self._generate_seo_content_recommendations(content_strategy)
|
|
content_strategy['seo_recommendations'] = seo_content_recs
|
|
|
|
return content_strategy
|
|
|
|
except Exception as e:
|
|
logger.error(f"Content strategy workflow error: {str(e)}")
|
|
return {'error': str(e)}
|
|
|
|
def execute_search_intelligence_workflow(self, site_url: str, date_range: int = 90) -> Dict[str, Any]:
|
|
"""
|
|
Execute comprehensive search intelligence workflow using GSC data.
|
|
|
|
Args:
|
|
site_url: Website URL registered in GSC
|
|
date_range: Analysis period in days
|
|
|
|
Returns:
|
|
Complete search intelligence analysis with actionable insights
|
|
"""
|
|
try:
|
|
st.info("📊 Executing search intelligence workflow...")
|
|
|
|
# Analyze GSC performance
|
|
gsc_analysis = self.gsc_analyzer.analyze_search_performance(site_url, date_range)
|
|
|
|
# Enhance with technical SEO analysis
|
|
technical_analysis = self.technical_crawler.crawl_and_analyze(site_url)
|
|
gsc_analysis['technical_insights'] = technical_analysis
|
|
|
|
# Generate content gap analysis based on GSC keywords
|
|
if gsc_analysis.get('keyword_analysis'):
|
|
keywords = [kw['keyword'] for kw in gsc_analysis['keyword_analysis'].get('high_volume_keywords', [])]
|
|
content_gaps = self.gap_analyzer.analyze_content_gaps(
|
|
keywords[:10], # Top 10 keywords
|
|
site_url
|
|
)
|
|
gsc_analysis['content_gap_analysis'] = content_gaps
|
|
|
|
# Generate comprehensive recommendations
|
|
search_recommendations = self._generate_search_intelligence_recommendations(gsc_analysis)
|
|
gsc_analysis['comprehensive_recommendations'] = search_recommendations
|
|
|
|
return gsc_analysis
|
|
|
|
except Exception as e:
|
|
logger.error(f"Search intelligence workflow error: {str(e)}")
|
|
return {'error': str(e)}
|
|
|
|
def _generate_seo_content_recommendations(self, content_strategy: Dict[str, Any]) -> Dict[str, Any]:
|
|
"""Generate SEO-optimized content recommendations based on strategy."""
|
|
try:
|
|
content_pillars = content_strategy.get('content_pillars', [])
|
|
|
|
seo_recommendations = {
|
|
'keyword_optimization': [],
|
|
'content_structure': [],
|
|
'internal_linking': [],
|
|
'technical_seo': []
|
|
}
|
|
|
|
for pillar in content_pillars:
|
|
# Keyword optimization recommendations
|
|
for keyword in pillar.get('target_keywords', []):
|
|
seo_recommendations['keyword_optimization'].append({
|
|
'pillar': pillar['name'],
|
|
'keyword': keyword,
|
|
'recommendation': f"Create comprehensive content targeting '{keyword}' with semantic variations",
|
|
'priority': 'High' if keyword in pillar['target_keywords'][:2] else 'Medium'
|
|
})
|
|
|
|
# Content structure recommendations
|
|
seo_recommendations['content_structure'].append({
|
|
'pillar': pillar['name'],
|
|
'recommendation': f"Create pillar page for {pillar['name']} with supporting cluster content",
|
|
'structure': 'Pillar + Cluster model'
|
|
})
|
|
|
|
# Internal linking strategy
|
|
seo_recommendations['internal_linking'] = [
|
|
"Link all cluster content to relevant pillar pages",
|
|
"Create topic-based internal linking structure",
|
|
"Use contextual anchor text with target keywords",
|
|
"Implement breadcrumb navigation for topic clusters"
|
|
]
|
|
|
|
# Technical SEO recommendations
|
|
seo_recommendations['technical_seo'] = [
|
|
"Optimize page speed for all content pages",
|
|
"Implement structured data for articles",
|
|
"Create XML sitemap sections for content categories",
|
|
"Optimize images with descriptive alt text"
|
|
]
|
|
|
|
return seo_recommendations
|
|
|
|
except Exception as e:
|
|
logger.error(f"SEO content recommendations error: {str(e)}")
|
|
return {'error': str(e)}
|
|
|
|
def _generate_search_intelligence_recommendations(self, gsc_analysis: Dict[str, Any]) -> Dict[str, Any]:
|
|
"""Generate comprehensive recommendations from search intelligence analysis."""
|
|
try:
|
|
recommendations = {
|
|
'immediate_actions': [],
|
|
'content_opportunities': [],
|
|
'technical_improvements': [],
|
|
'strategic_initiatives': []
|
|
}
|
|
|
|
# Extract content opportunities from GSC analysis
|
|
content_opps = gsc_analysis.get('content_opportunities', [])
|
|
for opp in content_opps[:5]: # Top 5 opportunities
|
|
recommendations['content_opportunities'].append({
|
|
'type': opp['type'],
|
|
'keyword': opp['keyword'],
|
|
'action': opp['opportunity'],
|
|
'priority': opp['priority'],
|
|
'estimated_impact': opp['potential_impact']
|
|
})
|
|
|
|
# Technical improvements from analysis
|
|
technical_insights = gsc_analysis.get('technical_insights', {})
|
|
if technical_insights.get('crawl_issues_indicators'):
|
|
for issue in technical_insights['crawl_issues_indicators']:
|
|
recommendations['technical_improvements'].append({
|
|
'issue': issue,
|
|
'priority': 'High',
|
|
'category': 'Crawl & Indexing'
|
|
})
|
|
|
|
# Immediate actions based on performance
|
|
performance = gsc_analysis.get('performance_overview', {})
|
|
if performance.get('avg_ctr', 0) < 2:
|
|
recommendations['immediate_actions'].append({
|
|
'action': 'Improve meta descriptions and titles for better CTR',
|
|
'expected_impact': 'Increase CTR by 1-2%',
|
|
'timeline': '2-4 weeks'
|
|
})
|
|
|
|
if performance.get('avg_position', 0) > 10:
|
|
recommendations['immediate_actions'].append({
|
|
'action': 'Focus on improving content quality for top keywords',
|
|
'expected_impact': 'Improve average position by 2-5 ranks',
|
|
'timeline': '4-8 weeks'
|
|
})
|
|
|
|
# Strategic initiatives
|
|
competitive_analysis = gsc_analysis.get('competitive_analysis', {})
|
|
if competitive_analysis.get('market_position') in ['Challenger', 'Emerging Player']:
|
|
recommendations['strategic_initiatives'].append({
|
|
'initiative': 'Develop thought leadership content strategy',
|
|
'goal': 'Improve market position and brand authority',
|
|
'timeline': '3-6 months'
|
|
})
|
|
|
|
return recommendations
|
|
|
|
except Exception as e:
|
|
logger.error(f"Search intelligence recommendations error: {str(e)}")
|
|
return {'error': str(e)}
|
|
|
|
def render_enterprise_seo_suite():
|
|
"""Render the Enterprise SEO Command Center interface."""
|
|
|
|
st.set_page_config(
|
|
page_title="Enterprise SEO Command Center",
|
|
page_icon="🚀",
|
|
layout="wide"
|
|
)
|
|
|
|
st.title("🚀 Enterprise SEO Command Center")
|
|
st.markdown("**Unified AI-powered SEO suite orchestrating all tools into intelligent workflows**")
|
|
|
|
# Initialize suite
|
|
if 'enterprise_seo_suite' not in st.session_state:
|
|
st.session_state.enterprise_seo_suite = EnterpriseSEOSuite()
|
|
|
|
suite = st.session_state.enterprise_seo_suite
|
|
|
|
# Workflow selection
|
|
st.sidebar.header("🎯 SEO Workflow Selection")
|
|
selected_workflow = st.sidebar.selectbox(
|
|
"Choose Workflow",
|
|
list(suite.workflow_templates.keys()),
|
|
format_func=lambda x: suite.workflow_templates[x]
|
|
)
|
|
|
|
# Main workflow interface
|
|
if selected_workflow == 'complete_audit':
|
|
st.header("🔍 Complete Enterprise SEO Audit")
|
|
render_complete_audit_interface(suite)
|
|
elif selected_workflow == 'content_strategy':
|
|
st.header("📊 Content Strategy Development")
|
|
render_content_strategy_interface(suite)
|
|
elif selected_workflow == 'technical_optimization':
|
|
st.header("🔧 Technical SEO Optimization")
|
|
render_technical_optimization_interface(suite)
|
|
else:
|
|
st.info(f"Workflow '{suite.workflow_templates[selected_workflow]}' is being developed.")
|
|
|
|
def render_complete_audit_interface(suite: EnterpriseSEOSuite):
|
|
"""Render the complete audit workflow interface."""
|
|
|
|
# Input form
|
|
with st.form("enterprise_audit_form"):
|
|
col1, col2 = st.columns(2)
|
|
|
|
with col1:
|
|
website_url = st.text_input(
|
|
"Website URL",
|
|
value="https://example.com",
|
|
help="Enter your website URL for comprehensive analysis"
|
|
)
|
|
|
|
target_keywords = st.text_area(
|
|
"Target Keywords (one per line)",
|
|
value="AI content creation\nSEO tools\ncontent optimization",
|
|
help="Enter your primary keywords to optimize for"
|
|
)
|
|
|
|
with col2:
|
|
competitors = st.text_area(
|
|
"Competitor URLs (one per line)",
|
|
value="https://jasper.ai\nhttps://copy.ai\nhttps://writesonic.com",
|
|
help="Enter up to 5 competitor URLs for analysis"
|
|
)
|
|
|
|
submit_audit = st.form_submit_button("🚀 Start Complete SEO Audit", type="primary")
|
|
|
|
# Process audit
|
|
if submit_audit:
|
|
if website_url and target_keywords:
|
|
# Parse inputs
|
|
keywords_list = [k.strip() for k in target_keywords.split('\n') if k.strip()]
|
|
competitors_list = [c.strip() for c in competitors.split('\n') if c.strip()]
|
|
|
|
# Run audit
|
|
with st.spinner("🔍 Running comprehensive SEO audit..."):
|
|
audit_results = asyncio.run(
|
|
suite.execute_complete_seo_audit(
|
|
website_url, competitors_list, keywords_list
|
|
)
|
|
)
|
|
|
|
if 'error' not in audit_results:
|
|
st.success("✅ Enterprise SEO audit completed!")
|
|
|
|
# Display results dashboard
|
|
render_audit_results_dashboard(audit_results)
|
|
else:
|
|
st.error(f"❌ Audit failed: {audit_results['error']}")
|
|
else:
|
|
st.warning("⚠️ Please enter website URL and target keywords.")
|
|
|
|
def render_audit_results_dashboard(results: Dict[str, Any]):
|
|
"""Render comprehensive audit results dashboard."""
|
|
|
|
# Priority Action Plan (Most Important)
|
|
st.header("📋 Priority Action Plan")
|
|
action_plan = results.get('priority_action_plan', [])
|
|
|
|
if action_plan:
|
|
# Display as interactive table
|
|
df_actions = pd.DataFrame(action_plan)
|
|
|
|
# Style the dataframe
|
|
st.dataframe(
|
|
df_actions,
|
|
column_config={
|
|
"category": "Category",
|
|
"priority": st.column_config.SelectboxColumn(
|
|
"Priority",
|
|
options=["Critical", "High", "Medium", "Low"]
|
|
),
|
|
"effort": "Effort Level",
|
|
"timeframe": "Timeline",
|
|
"action": "Action Required",
|
|
"expected_impact": "Expected Impact"
|
|
},
|
|
hide_index=True,
|
|
use_container_width=True
|
|
)
|
|
|
|
# Key Metrics Overview
|
|
st.header("📊 SEO Health Dashboard")
|
|
|
|
col1, col2, col3, col4 = st.columns(4)
|
|
|
|
with col1:
|
|
technical_score = results.get('technical_audit', {}).get('performance_score', 0)
|
|
st.metric("Technical SEO", f"{technical_score}/100", delta=None)
|
|
|
|
with col2:
|
|
onpage_score = results.get('on_page_analysis', {}).get('optimization_score', 0)
|
|
st.metric("On-Page SEO", f"{onpage_score}/100", delta=None)
|
|
|
|
with col3:
|
|
performance_score = results.get('performance_metrics', {}).get('performance_score', 0)
|
|
st.metric("Performance", f"{performance_score}/100", delta=None)
|
|
|
|
with col4:
|
|
content_gaps = len(results.get('content_analysis', {}).get('content_opportunities', []))
|
|
st.metric("Content Opportunities", content_gaps, delta=None)
|
|
|
|
# Detailed Analysis Sections
|
|
tab1, tab2, tab3, tab4, tab5 = st.tabs([
|
|
"🤖 Strategic Insights",
|
|
"🔧 Technical Analysis",
|
|
"📊 Content Intelligence",
|
|
"🔍 On-Page Analysis",
|
|
"⚡ Performance Metrics"
|
|
])
|
|
|
|
with tab1:
|
|
strategic_recs = results.get('strategic_recommendations', {})
|
|
if strategic_recs:
|
|
st.subheader("AI-Powered Strategic Recommendations")
|
|
|
|
# Immediate wins
|
|
immediate_wins = strategic_recs.get('immediate_wins', [])
|
|
if immediate_wins:
|
|
st.markdown("#### 🚀 Immediate Wins (0-30 days)")
|
|
for win in immediate_wins[:5]:
|
|
st.success(f"✅ {win}")
|
|
|
|
# Strategic initiatives
|
|
strategic_initiatives = strategic_recs.get('strategic_initiatives', [])
|
|
if strategic_initiatives:
|
|
st.markdown("#### 📈 Strategic Initiatives (1-3 months)")
|
|
for initiative in strategic_initiatives[:3]:
|
|
st.info(f"📋 {initiative}")
|
|
|
|
# Full analysis
|
|
full_analysis = strategic_recs.get('full_analysis', '')
|
|
if full_analysis:
|
|
with st.expander("🧠 Complete Strategic Analysis"):
|
|
st.write(full_analysis)
|
|
|
|
with tab2:
|
|
technical_audit = results.get('technical_audit', {})
|
|
if technical_audit:
|
|
st.subheader("Technical SEO Analysis")
|
|
|
|
critical_issues = technical_audit.get('critical_issues', [])
|
|
if critical_issues:
|
|
st.markdown("#### ⚠️ Critical Issues")
|
|
for issue in critical_issues:
|
|
st.error(f"🚨 {issue}")
|
|
|
|
priority_fixes = technical_audit.get('priority_fixes', [])
|
|
if priority_fixes:
|
|
st.markdown("#### 🔧 Priority Fixes")
|
|
for fix in priority_fixes:
|
|
st.warning(f"🛠️ {fix}")
|
|
|
|
with tab3:
|
|
content_analysis = results.get('content_analysis', {})
|
|
if content_analysis:
|
|
st.subheader("Content Intelligence")
|
|
|
|
content_opportunities = content_analysis.get('content_opportunities', [])
|
|
if content_opportunities:
|
|
st.markdown("#### 📝 Content Opportunities")
|
|
for opportunity in content_opportunities[:5]:
|
|
st.info(f"💡 {opportunity}")
|
|
|
|
competitive_advantages = content_analysis.get('competitive_advantages', [])
|
|
if competitive_advantages:
|
|
st.markdown("#### 🏆 Competitive Advantages")
|
|
for advantage in competitive_advantages:
|
|
st.success(f"⭐ {advantage}")
|
|
|
|
with tab4:
|
|
onpage_analysis = results.get('on_page_analysis', {})
|
|
if onpage_analysis:
|
|
st.subheader("On-Page SEO Analysis")
|
|
|
|
meta_optimization = onpage_analysis.get('meta_optimization', {})
|
|
content_optimization = onpage_analysis.get('content_optimization', {})
|
|
|
|
col1, col2 = st.columns(2)
|
|
|
|
with col1:
|
|
st.markdown("#### 🏷️ Meta Tag Optimization")
|
|
st.json(meta_optimization)
|
|
|
|
with col2:
|
|
st.markdown("#### 📄 Content Optimization")
|
|
st.json(content_optimization)
|
|
|
|
with tab5:
|
|
performance_metrics = results.get('performance_metrics', {})
|
|
if performance_metrics:
|
|
st.subheader("Performance Analysis")
|
|
|
|
core_vitals = performance_metrics.get('core_web_vitals', {})
|
|
loading_performance = performance_metrics.get('loading_performance', {})
|
|
|
|
col1, col2 = st.columns(2)
|
|
|
|
with col1:
|
|
st.markdown("#### ⚡ Core Web Vitals")
|
|
st.json(core_vitals)
|
|
|
|
with col2:
|
|
st.markdown("#### 🚀 Loading Performance")
|
|
st.json(loading_performance)
|
|
|
|
# Export functionality
|
|
st.markdown("---")
|
|
col1, col2, col3 = st.columns(3)
|
|
|
|
with col1:
|
|
if st.button("📥 Export Full Report", use_container_width=True):
|
|
# Create downloadable report
|
|
report_json = json.dumps(results, indent=2, default=str)
|
|
st.download_button(
|
|
label="Download JSON Report",
|
|
data=report_json,
|
|
file_name=f"seo_audit_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json",
|
|
mime="application/json"
|
|
)
|
|
|
|
with col2:
|
|
if st.button("📊 Export Action Plan", use_container_width=True):
|
|
# Create CSV of action plan
|
|
df_actions = pd.DataFrame(action_plan)
|
|
csv = df_actions.to_csv(index=False)
|
|
st.download_button(
|
|
label="Download CSV Action Plan",
|
|
data=csv,
|
|
file_name=f"action_plan_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv",
|
|
mime="text/csv"
|
|
)
|
|
|
|
with col3:
|
|
if st.button("🔄 Schedule Follow-up Audit", use_container_width=True):
|
|
st.info("Follow-up scheduling feature coming soon!")
|
|
|
|
def render_content_strategy_interface(suite: EnterpriseSEOSuite):
|
|
"""Render content strategy development interface."""
|
|
st.info("🚧 Content Strategy Development workflow coming soon!")
|
|
|
|
def render_technical_optimization_interface(suite: EnterpriseSEOSuite):
|
|
"""Render technical optimization interface."""
|
|
st.info("🚧 Technical SEO Optimization workflow coming soon!")
|
|
|
|
|
|
# Main execution
|
|
if __name__ == "__main__":
|
|
render_enterprise_seo_suite() |