# 🚀 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

```python
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

```python
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

```python
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

```python
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

```python
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**

```python
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**

```python
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**

```python
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**

```python
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**

```python
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**

```python
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**

```python
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**

```python
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:

```sql
-- 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)
