# Web Scraping Integration - Implementation Summary **Data:** 2025-11-27 **Status:** ✅ COMPLETED & DEPLOYED ## Przegląd Zintegrowano dane z web scrapingu stron internetowych firm z profilami firm na stronie nordabiznes.pl. Dane są teraz widoczne w dedykowanej sekcji "🤖 Analiza AI Strony WWW" na każdym profilu firmy. ## Zmiany w plikach ### 1. `/var/www/nordabiznes/database.py` **Dodane modele:** ```python class CompanyWebsiteContent(Base): """Scraped website content for companies""" __tablename__ = 'company_website_content' id = Column(Integer, primary_key=True) company_id = Column(Integer, ForeignKey('companies.id'), nullable=False, index=True) scraped_at = Column(DateTime, default=datetime.utcnow) url = Column(String(500)) http_status = Column(Integer) raw_html = Column(Text) raw_text = Column(Text) page_title = Column(String(500)) meta_description = Column(Text) main_content = Column(Text) email_addresses = Column(ARRAY(String)) phone_numbers = Column(ARRAY(String)) social_media = Column(JSONB) word_count = Column(Integer) company = relationship('Company', back_populates='website_content') class CompanyAIInsights(Base): """AI-generated insights from website analysis""" __tablename__ = 'company_ai_insights' id = Column(Integer, primary_key=True) company_id = Column(Integer, ForeignKey('companies.id'), nullable=False, unique=True, index=True) content_id = Column(Integer, ForeignKey('company_website_content.id')) business_summary = Column(Text) services_list = Column(ARRAY(String)) target_market = Column(Text) unique_selling_points = Column(ARRAY(String)) company_values = Column(ARRAY(String)) certifications = Column(ARRAY(String)) suggested_category = Column(String(100)) category_confidence = Column(Numeric(3, 2)) industry_tags = Column(ARRAY(String)) ai_confidence_score = Column(Numeric(3, 2)) processing_time_ms = Column(Integer) analyzed_at = Column(DateTime, default=datetime.utcnow) company = relationship('Company', back_populates='ai_insights') ``` **Dodane importy:** ```python from sqlalchemy.dialects.postgresql import JSONB ``` **Dodane relacje w modelu Company (linia 198-200):** ```python website_content = relationship('CompanyWebsiteContent', back_populates='company', cascade='all, delete-orphan') ai_insights = relationship('CompanyAIInsights', back_populates='company', uselist=False) ``` ### 2. `/var/www/nordabiznes/app.py` **Dodane importy (linia 89-90):** ```python CompanyWebsiteContent, CompanyAIInsights, ``` **Zmodyfikowana funkcja company_detail() (linia 340-356):** ```python # Load website scraping data (most recent) website_content = db.query(CompanyWebsiteContent).filter_by(company_id=company_id).order_by( CompanyWebsiteContent.scraped_at.desc() ).first() # Load AI insights ai_insights = db.query(CompanyAIInsights).filter_by(company_id=company_id).first() return render_template('company_detail.html', company=company, maturity_data=maturity_data, website_analysis=website_analysis, quality_data=quality_data, events=events, website_content=website_content, # NOWE ai_insights=ai_insights # NOWE ) ``` ### 3. `/var/www/nordabiznes/templates/company_detail.html` **Dodana sekcja (po linii 450, przed "Digital Maturity Scores"):** Kompletna sekcja wyświetlająca: - Źródło danych (URL strony) i datę scrapingu - Podsumowanie działalności z AI - Wykryte usługi (tagi) - Sugerowaną kategorię z % pewności - Rynek docelowy - Unikalne przewagi konkurencyjne (USP) - Wartości firmy - Certyfikaty i uprawnienia - Tagi branżowe - Dane kontaktowe ze strony (email, telefon, social media) - Metadane strony (title, description) - Pewność analizy AI i czas analizy **Styl:** Pink gradient (`linear-gradient(135deg, #f093fb 0%, #f5576c 100%)`) ## Dane w bazie ### Statystyki scrapingu (2025-11-27): - **73/75 firm** przetworzonych pomyślnie (97.3% sukcesu) - **Średnia długość treści:** 832 słowa - **Średnia pewność AI:** 90.5% - **Wysoka pewność (≥95%):** 62 firmy (85%) ### Przykładowe firmy z danymi: - ID 26: Chłodnictwo Klimatyzacja Tomasz Nowak (99% confidence) - ID 33: EL Professional - ID 30: Ekod - ID 36: Hotel SPA Wieniawa - ID 39: Kancelaria Rachunkowa Gawin & Wojnowska ### Tabele: - `company_website_content` - 75 rekordów - `company_ai_insights` - 73 rekordy ## Deployment ### Kroki wdrożenia: 1. Upload `database.py` → `/var/www/nordabiznes/` 2. Upload `app.py` → `/var/www/nordabiznes/` 3. Upload `company_detail.html` → `/var/www/nordabiznes/templates/` 4. Restart: `systemctl restart nordabiznes` ### Fix błędu: Pierwotnie brakowało importu JSONB: ```python from sqlalchemy.dialects.postgresql import JSONB ``` ### Weryfikacja: ```bash systemctl status nordabiznes # Status: active (running) ✅ ``` ## Jak to działa 1. **Scraper (`scrape_websites_ai.py`)** pobiera strony firm i zapisuje do: - `company_website_content` (raw data) - `company_ai_insights` (analiza AI) 2. **Backend (`app.py`)** przy każdym otwarciu profilu firmy: - Ładuje najnowszy `website_content` dla firmy - Ładuje `ai_insights` dla firmy - Przekazuje dane do template 3. **Frontend (`company_detail.html`)** wyświetla: - Sekcję tylko jeśli dane istnieją (`{% if ai_insights or website_content %}`) - Formatowane dane w czytelnej formie - Linki do źródeł (URL strony, mailto:, tel:) ## Linki do testowania - https://nordabiznes.pl/company/26 (Chłodnictwo Klimatyzacja) - https://nordabiznes.pl/company/33 (EL Professional) - https://nordabiznes.pl/company/30 (Ekod) ## Związane dokumenty - `/var/www/nordabiznes/SCRAPING_IMPROVEMENTS_PLAN.md` - plan ulepszeń scrapera - `/var/www/nordabiznes/scrape_websites_ai.py` - główny skrypt scrapera - `/var/www/nordabiznes/database/` - schematy SQL ## Notatki techniczne ### PostgreSQL JSONB: - Używane dla `social_media` w `company_website_content` - Wymaga importu: `from sqlalchemy.dialects.postgresql import JSONB` - Format danych: `{"facebook": "url", "linkedin": "url"}` ### ARRAY columns: - `email_addresses`, `phone_numbers` - PostgreSQL ARRAY(String) - `services_list`, `unique_selling_points`, etc. - PostgreSQL ARRAY(String) - Konwersja z Python list automatyczna przez SQLAlchemy ### Relationships: - `Company.website_content` - One-to-Many (wiele scrapingów w czasie) - `Company.ai_insights` - One-to-One (tylko ostatnia analiza) - Cascade delete: `cascade='all, delete-orphan'` ## Możliwe ulepszenia (przyszłość) Zgodnie z `SCRAPING_IMPROVEMENTS_PLAN.md`: ### Priority 1: - Enhanced contact extraction - Business hours detection - Certifications & awards - Company history timeline - Geographic scope detection ### Priority 2: - Portfolio/case studies extraction - Pricing information - Team structure - Content quality scoring - Technologies & tools detection ### Priority 3: - Brand voice analysis - Competitive positioning - SEO analysis ## Kontakt Implementacja zrealizowana: 2025-11-27 Serwer produkcyjny: NORDABIZ-01 (VM 249, IP 10.22.68.249) Domena: https://nordabiznes.pl