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

7.0 KiB

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:

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:

from sqlalchemy.dialects.postgresql import JSONB

Dodane relacje w modelu Company (linia 198-200):

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):

CompanyWebsiteContent,
CompanyAIInsights,

Zmodyfikowana funkcja company_detail() (linia 340-356):

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

from sqlalchemy.dialects.postgresql import JSONB

Weryfikacja:

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

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