nordabiz/SCRAPING_IMPROVEMENTS_PLAN.md
2026-01-01 14:01:49 +01:00

16 KiB

🚀 PLAN ULEPSZEŃ SYSTEMU SCRAPINGU

Data: 2025-11-27 Autor: Claude Code Status: Propozycje do implementacji


📊 AKTUALNE MOŻLIWOŚCI (v1.0)

Co już zbieramy:

  • Raw HTML (50k znaków)
  • Tekst bez tagów (30k znaków)
  • Tytuł strony
  • Meta description/keywords
  • Dane kontaktowe: email, telefon (regex)
  • Social media links
  • Word count, char count
  • AI Analysis:
    • Business summary
    • Services list
    • Suggested category (95% confidence avg)
    • Target market
    • USP (Unique Selling Points)
    • Company values
    • Certifications

🎯 ULEPSZENIA PRIORITY 1 (Quick Wins)

1. Rozszerzona Ekstrakcja Danych Kontaktowych

Problem: Obecnie znajdujemy tylko podstawowe email/telefon Rozwiązanie: Multi-level extraction

class EnhancedContactExtractor:
    """
    Ekstrakcja wielu form kontaktu
    """

    def extract_all_contacts(self, soup, text):
        return {
            'emails': {
                'general': self._extract_general_emails(text),
                'sales': self._extract_sales_emails(text),
                'support': self._extract_support_emails(text),
                'hr': self._extract_hr_emails(text)
            },
            'phones': {
                'office': self._extract_office_phones(text),
                'mobile': self._extract_mobile_phones(text),
                'fax': self._extract_fax(text),
                'emergency': self._extract_emergency_phones(text)
            },
            'addresses': {
                'headquarters': self._extract_address(soup),
                'branches': self._extract_branches(soup)
            },
            'social_media': {
                'facebook': self._extract_fb_url(soup),
                'linkedin': self._extract_linkedin_url(soup),
                'instagram': self._extract_instagram_url(soup),
                'youtube': self._extract_youtube_url(soup),
                'twitter': self._extract_twitter_url(soup)
            },
            'messaging': {
                'whatsapp': self._extract_whatsapp(text),
                'telegram': self._extract_telegram(text),
                'messenger': self._extract_messenger(soup)
            }
        }

Wartość biznesowa: Kompletna baza kontaktów do networkingu


2. Ekstrakcja Godzin Otwarcia

Problem: Nie wiemy kiedy firmy działają Rozwiązanie: NLP + Pattern matching

def extract_business_hours(self, text):
    """
    Wykrywa godziny otwarcia z różnych formatów:
    - "Pon-Pt: 8:00-16:00"
    - "Poniedziałek-Piątek 8-16"
    - "24/7"
    - "Czynne: 9:00 - 17:00"
    """
    patterns = [
        r'(?:pon|pn).*?(?:pt|piątek).*?(\d{1,2}[:\.]?\d{0,2})\s*-\s*(\d{1,2}[:\.]?\d{0,2})',
        r'godziny?\s+otwarcia.*?(\d{1,2}[:\.]?\d{0,2})\s*-\s*(\d{1,2}[:\.]?\d{0,2})',
        r'czynne.*?(\d{1,2}[:\.]?\d{0,2})\s*-\s*(\d{1,2}[:\.]?\d{0,2})',
        r'24/7',
        r'non-stop'
    ]

    # AI fallback if regex fails
    if not found_hours:
        return self._ai_extract_hours(text)

Wartość biznesowa: Wiadomo kiedy można się skontaktować


3. Certyfikaty i Nagrody (Enhanced)

Problem: Obecnie AI znajduje niektóre, ale nie wszystkie Rozwiązanie: Targeted extraction + visual recognition

def extract_certifications(self, soup, text):
    """
    Wykrywa:
    - ISO certyfikaty (9001, 14001, 27001, etc.)
    - Branżowe certyfikaty
    - Nagrody (Diamenty Forbesa, Gazele Biznesu)
    - Członkostwa (KDPW, KIG, etc.)
    - EU dofinansowania
    """

    certifications = {
        'iso': self._extract_iso_certs(text),  # ISO 9001:2015
        'industry': self._extract_industry_certs(text),  # SEP, budowlane
        'awards': self._extract_awards(text),  # Nagrody
        'memberships': self._extract_memberships(text),  # Izby gospodarcze
        'eu_funding': self._extract_eu_funding(text),  # PARP, UE
        'verified_supplier': self._check_verified_badges(soup)  # Google Verified
    }

    return certifications

Wartość biznesowa: Trust indicators, jakość firm


4. Historia Firmy & Doświadczenie

Problem: Nie wiemy ile lat firma działa Rozwiązanie: Timeline extraction

def extract_company_history(self, text):
    """
    Wykrywa:
    - Rok założenia ("od 1995", "założona w 2005")
    - Lata doświadczenia ("20 lat na rynku")
    - Kamienie milowe ("od 2010 jako sp. z o.o.")
    - Rozwój ("obecnie 50+ pracowników")
    """

    return {
        'founded_year': self._extract_founding_year(text),
        'years_in_business': self._calculate_years(founded_year),
        'milestones': self._extract_milestones(text),
        'growth_indicators': self._extract_growth(text)
    }

Wartość biznesowa: Wiarygodność, doświadczenie


5. Zakres Geograficzny

Problem: Nie wiemy gdzie firma działa Rozwiązanie: Geographic extraction

def extract_service_area(self, text):
    """
    Wykrywa obszar działania:
    - "Trójmiasto i okolice"
    - "cała Polska"
    - "Europa Północna"
    - "Wejherowo, Puck, Gdynia"
    """

    return {
        'local': self._extract_local_areas(text),  # Miasta
        'regional': self._extract_regions(text),  # Województwa
        'national': self._check_national_coverage(text),  # Cała PL
        'international': self._extract_countries(text)  # Export
    }

Wartość biznesowa: Matching firm po lokalizacji


🚀 ULEPSZENIA PRIORITY 2 (Advanced)

6. Ekstrakcja Portfolio & Case Studies

def extract_portfolio(self, soup):
    """
    Znajduje:
    - Realizacje / Portfolio
    - Case studies
    - Referencje klientów
    - Przykładowe projekty
    """

    portfolio_sections = soup.find_all(['section', 'div'],
        class_=re.compile(r'portfolio|realizacje|projekty|case-stud', re.I))

    projects = []
    for section in portfolio_sections:
        projects.append({
            'title': self._extract_project_title(section),
            'client': self._extract_client_name(section),
            'description': self._extract_project_desc(section),
            'images': self._extract_project_images(section),
            'year': self._extract_project_year(section)
        })

    return {
        'projects_count': len(projects),
        'projects': projects[:10],  # Top 10
        'featured_clients': self._extract_client_logos(soup)
    }

Wartość biznesowa: Social proof, referencje


7. Cenniki & Pricing Indicators

def extract_pricing_info(self, text, soup):
    """
    Wykrywa informacje o cenach (jeśli dostępne):
    - Zakresy cenowe ("od 100 zł")
    - Darmowe konsultacje
    - Wycena indywidualna
    - Przykładowe ceny usług
    """

    return {
        'has_public_prices': self._check_price_list(soup),
        'price_ranges': self._extract_price_ranges(text),
        'free_consultation': self._check_free_consult(text),
        'custom_quote': self._check_custom_quote(text),
        'payment_methods': self._extract_payment_methods(text)
    }

Wartość biznesowa: Transparentność cenowa


8. Zespół & Struktura

def extract_team_info(self, soup, text):
    """
    Wykrywa informacje o zespole:
    - Liczba pracowników
    - Kadra zarządzająca
    - Eksperci / specjaliści
    - Struktura organizacyjna
    """

    return {
        'employee_count': self._extract_employee_count(text),
        'management': self._extract_management(soup),
        'specialists': self._extract_specialists(soup),
        'departments': self._extract_departments(text)
    }

Wartość biznesowa: Wielkość firmy, kluczowe osoby


9. Content & Marketing Quality

def analyze_content_quality(self, soup, text):
    """
    Analiza jakości strony:
    - Obecność bloga
    - Aktualność treści
    - SEO quality
    - Call-to-actions
    - Downloadable materials
    """

    return {
        'has_blog': self._check_blog(soup),
        'blog_frequency': self._estimate_blog_activity(soup),
        'news_section': self._check_news(soup),
        'downloads': self._extract_downloads(soup),  # Katalogi, broszury
        'videos': self._extract_videos(soup),
        'seo_quality_score': self._calculate_seo_score(soup, text),
        'cta_elements': self._count_cta_buttons(soup),
        'contact_form': self._check_contact_form(soup)
    }

Wartość biznesowa: Ocena profesjonalizmu strony


10. Technologie & Narzędzia

def extract_technologies(self, soup, text):
    """
    Wykrywa technologie używane przez firmę:
    - Software (SAP, AutoCAD, Revit)
    - Platformy (WooCommerce, Shopify)
    - Narzędzia branżowe
    - Certyfikaty partnerskie (Microsoft Partner, etc.)
    """

    tech_keywords = {
        'software': ['SAP', 'AutoCAD', 'Revit', 'SolidWorks'],
        'platforms': ['WooCommerce', 'PrestaShop', 'Shopify'],
        'tools': ['Google Analytics', 'HubSpot', 'Salesforce'],
        'certifications': ['Microsoft Partner', 'Google Partner', 'AWS Partner']
    }

    return self._match_technologies(text, tech_keywords)

Wartość biznesowa: Kompetencje techniczne


🔬 ULEPSZENIA PRIORITY 3 (AI-Powered)

11. Sentiment Analysis & Brand Voice

def analyze_brand_voice(self, text):
    """
    AI analysis brand voice:
    - Formalny / nieformalny
    - Nowoczesny / tradycyjny
    - B2B / B2C oriented
    - Technical / accessible
    """

    prompt = f"""
    Przeanalizuj ton komunikacji firmy na podstawie tekstu ze strony WWW:

    {text[:3000]}

    Zwróć JSON:
    {{
        "tone": "formalny/nieformalny/hybrydowy",
        "modernity": 1-10,
        "target_audience": "B2B/B2C/both",
        "language_complexity": "simple/medium/technical",
        "emotional_appeal": 1-10,
        "trust_signals": ["konkretne przykłady"]
    }}
    """

    return self.ai_model.analyze(prompt)

Wartość biznesowa: Profil komunikacyjny firmy


12. Competitive Positioning

def analyze_competitive_position(self, company_data, all_companies_data):
    """
    AI porównuje firmę z konkurencją:
    - USP vs inne firmy
    - Zakres usług vs rynek
    - Pricing positioning
    - Geographic coverage
    """

    prompt = f"""
    Porównaj firmę {company_data['name']} z innymi firmami w kategorii
    {company_data['category']}:

    Firma: {company_data['services']}
    Konkurenci: {competitors_summary}

    Zwróć JSON z analizą pozycji konkurencyjnej.
    """

    return self.ai_model.analyze(prompt)

Wartość biznesowa: Market insights


13. Keyword & SEO Analysis

def analyze_keywords(self, text, meta_keywords):
    """
    Ekstrakcja kluczowych słów i analiza SEO:
    - Top keywords firmy
    - Long-tail keywords
    - Industry-specific terms
    - SEO optimization score
    """

    return {
        'top_keywords': self._extract_top_keywords(text, n=20),
        'industry_terms': self._extract_industry_keywords(text),
        'seo_score': self._calculate_seo_score(text, meta_keywords),
        'keyword_density': self._calculate_density(text),
        'semantic_clusters': self._cluster_keywords(text)
    }

Wartość biznesowa: SEO insights, search optimization


📋 IMPLEMENTATION ROADMAP

FAZA 1 (Tydzień 1) - Quick Wins

  • Enhanced contact extraction (email types, multiple phones)
  • Business hours extraction
  • Certifications & awards targeted extraction
  • Company history & founding year
  • Service area geographic extraction

Estimated effort: 2-3 dni Impact: HIGH - Immediate value

FAZA 2 (Tydzień 2) - Advanced Features

  • Portfolio & case studies extraction
  • Pricing indicators
  • Team & structure info
  • Content quality analysis
  • Technologies & tools detection

Estimated effort: 3-4 dni Impact: MEDIUM-HIGH

FAZA 3 (Tydzień 3) - AI-Powered Insights

  • Brand voice analysis
  • Competitive positioning
  • Keyword & SEO analysis
  • Market insights generation

Estimated effort: 4-5 dni Impact: MEDIUM - Strategic value


🗄️ DATABASE SCHEMA CHANGES

Nowe tabele:

-- Extended contact info
CREATE TABLE company_contact_details (
    id SERIAL PRIMARY KEY,
    company_id INTEGER REFERENCES companies(id),

    -- Emails
    email_general VARCHAR(255),
    email_sales VARCHAR(255),
    email_support VARCHAR(255),
    email_hr VARCHAR(255),

    -- Phones
    phone_office VARCHAR(50),
    phone_mobile VARCHAR(50),
    phone_fax VARCHAR(50),

    -- Social media (detailed)
    facebook_url VARCHAR(500),
    linkedin_url VARCHAR(500),
    instagram_url VARCHAR(500),
    youtube_url VARCHAR(500),

    -- Messaging
    whatsapp_number VARCHAR(50),
    telegram_handle VARCHAR(100),

    -- Business hours
    opening_hours JSONB,

    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Company profile enhanced
CREATE TABLE company_profile_extended (
    id SERIAL PRIMARY KEY,
    company_id INTEGER REFERENCES companies(id),

    -- History
    founded_year INTEGER,
    years_in_business INTEGER,
    employee_count_range VARCHAR(50),  -- "10-50", "50-100", etc.

    -- Geography
    service_area_local TEXT[],
    service_area_regional TEXT[],
    national_coverage BOOLEAN,
    international_markets TEXT[],

    -- Certifications
    iso_certifications TEXT[],
    industry_certifications TEXT[],
    awards TEXT[],
    memberships TEXT[],

    -- Quality indicators
    has_portfolio BOOLEAN,
    projects_count INTEGER,
    has_public_prices BOOLEAN,

    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- SEO & Marketing analysis
CREATE TABLE company_marketing_analysis (
    id SERIAL PRIMARY KEY,
    company_id INTEGER REFERENCES companies(id),

    -- Content
    has_blog BOOLEAN,
    has_news_section BOOLEAN,
    downloadable_materials TEXT[],

    -- SEO
    seo_quality_score DECIMAL(3,2),
    top_keywords TEXT[],
    meta_quality_score DECIMAL(3,2),

    -- Brand voice (AI)
    brand_tone VARCHAR(50),
    language_complexity VARCHAR(50),
    target_audience VARCHAR(50),

    analyzed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

📊 EXPECTED OUTCOMES

Metryki sukcesu:

Metryka Obecnie Po Ulepszeniach Wzrost
Dane kontaktowe 1-2 emaile/telefony 5-10 kontaktów +400%
Informacje o firmie 5-7 pól 20-25 pól +300%
AI insights Podstawowe Zaawansowane +200%
Jakość danych 85% 95%+ +12%
Pokrycie informacji 40% 85%+ +112%

Wartość biznesowa:

  1. Networking: Kompletne dane kontaktowe wszystkich firm
  2. Trust: Certyfikaty, nagrody, doświadczenie
  3. Matching: Geografia, technologie, kompetencje
  4. Intelligence: Analiza konkurencji, pozycjonowanie
  5. SEO: Keywords, optimization opportunities

🔧 TECHNICAL CONSIDERATIONS

Performance:

  • Dodatkowy czas przetwarzania: +2-3s per company
  • Dodatkowe API calls do Gemini: +1 request per company
  • Database storage: +50-100KB per company

Costs:

  • Gemini API: ~$0.04 dla 80 firm (podwojenie z $0.02)
  • Database storage: nieznaczący wzrost
  • Development time: 2-3 tygodnie

Risks:

  • ⚠️ Niektóre dane mogą nie być dostępne na stronach
  • ⚠️ Accuracy AI może być niższa dla niektórych pól
  • ⚠️ Rate limiting przy większej liczbie requestów

RECOMMENDATIONS

START WITH:

  1. Enhanced contact extraction - najwyższa wartość, low effort
  2. Certifications & awards - trust building
  3. Company history - storytelling

THEN MOVE TO: 4. Portfolio & case studies 5. Geographic coverage 6. Content quality analysis

CONSIDER LATER: 7. AI brand voice analysis 8. Competitive positioning 9. Advanced SEO insights


Next Steps:

  1. Poczekać na zakończenie obecnego scrapingu
  2. Przeanalizować quality danych z v1.0
  3. Wybrać 3-5 najważniejszych ulepszeń
  4. Implementacja w fazach
  5. Re-scraping z rozszerzoną funkcjonalnością

Author: Claude Code Date: 2025-11-27 Version: 1.0 (Proposal)