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ówcompany_ai_insights- 73 rekordy
Deployment
Kroki wdrożenia:
- Upload
database.py→/var/www/nordabiznes/ - Upload
app.py→/var/www/nordabiznes/ - Upload
company_detail.html→/var/www/nordabiznes/templates/ - 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
-
Scraper (
scrape_websites_ai.py) pobiera strony firm i zapisuje do:company_website_content(raw data)company_ai_insights(analiza AI)
-
Backend (
app.py) przy każdym otwarciu profilu firmy:- Ładuje najnowszy
website_contentdla firmy - Ładuje
ai_insightsdla firmy - Przekazuje dane do template
- Ładuje najnowszy
-
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:)
- Sekcję tylko jeśli dane istnieją (
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_mediawcompany_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