# System Scrapingu Aktualności - Dokumentacja

**Data:** 2025-11-28
**Status:** ✅ ZAIMPLEMENTOWANY

## Problem

Użytkownik zgłosił podejrzenie błędnych dat w wydarzeniach firm. Analiza wykazała:

### Przypadek WATERM:
- **Wydarzenie:** "Dzień Pompy Ciepła dla studentów 2024/2025"
- **Data w bazie:** 2024-10-21 ✅ POPRAWNA
- **URL źródłowy:** https://www.pzs4-samochodowka.pl/**2025**/10/21/
- **Problem:** Strona źródłowa ma błędne metadane (`article:published_time: 2025-10-21`)

### Wniosek:
- Data w bazie jest POPRAWNA (2024-10-21)
- Błąd jest po stronie zewnętrznej strony internetowej
- Potrzebny system walidacji dat przy przyszłym scrapingu

## Rozwiązanie

### 1. Utworzono nowy system scrapingu aktualności

**Plik:** `scrape_company_news.py`

#### Funkcje:
- **Automatyczny scraping** aktualności ze stron firm (blog, news, wydarzenia)
- **Inteligentna walidacja dat** z auto-korekcją
- **Wykrywanie błędnych dat** (przyszłość, za stare)
- **Logging i ręporty** o problemach z datami
- **Duplikat prevention** (nie dodaje tych samych wydarzeń)

#### DateValidator - Reguły walidacji:

```python
# Data > 1 rok w przyszłość → ODRZUĆ
if date > now + 365 days:
    return None

# Data 1-12 miesięcy w przyszłość → KORE

KTUj ROK
if date > now + 30 days:
    corrected_date = date.replace(year=date.year - 1)
    if corrected_date <= now:
        return corrected_date  # 2025 → 2024

# Data przed 2020 → OSTRZEŻENIE
if date < 2020-01-01:
    warning = "Date before 2020, needs review"

# Confidence score:
- 1.0 = pewna, przeszła data
- 0.8 = data lekko w przeszłości
- 0.7 = data skorygowana (np. 2025→2024)
- 0.5 = podejrzana data, wymaga weryfikacji
- 0.0 = odrzucona
```

#### Źródła dat (próbowane po kolei):
1. **Meta tagi** - `<time datetime>`, `<meta property="article:published_time">`
2. **URL pattern** - `/2024/10/21/`
3. **Elementy z klasą** - `.date`, `.published`, `.time`
4. **Parsowanie tekstu** - fuzzy date parsing z dateutil

### 2. Utworzono skrypt weryfikacji dat

**Plik:** `fix_event_dates.py`

Weryfikuje istniejące wydarzenia:
- Sprawdza daty w przyszłości
- Sprawdza daty przed 2020
- Raportuje podejrzane wpisy

### 3. Użycie

#### Scraping wszystkich firm:
```bash
python3 scrape_company_news.py
```

#### Test (pierwsze 3 firmy):
```bash
python3 scrape_company_news.py --test
```

#### Konkretna firma:
```bash
python3 scrape_company_news.py --company-id 12  # WATERM
```

#### Limit firm:
```bash
python3 scrape_company_news.py --limit 10
```

#### Weryfikacja dat:
```bash
python3 fix_event_dates.py
```

## Wyniki Weryfikacji (2025-11-28)

### Istniejące dane:
- ✅ **0 wydarzeń** z datami w przyszłości
- ✅ **0 wydarzeń** z datami przed 2020
- ✅ **Wszystkie daty poprawne**

### WATERM - Szczegóły:
- Tytuł: "Waterm: Dzień Pompy Ciepła dla studentów 2024/2025"
- Data w bazie: **2024-10-21** ✅
- Źródło: https://www.pzs4-samochodowka.pl/2025/10/21/ (błąd na stronie źródłowej)
- **Wniosek:** Data jest POPRAWNA, choć źródło ma błąd

## Architektura Systemu

### CompanyNewsScraper
```python
class CompanyNewsScraper:
    def scrape_company_blog(company, max_articles=5)
        # Próbuje: /blog, /news, /aktualnosci, /nowosci, /wydarzenia

    def _scrape_news_page(url, company)
        # Parsuje stronę z listą aktualności

    def _parse_article(element, base_url, company)
        # Wyciąga: tytuł, URL, datę, opis

    def save_event(article_data)
        # Zapisuje do CompanyEvent w bazie
```

### DateValidator
```python
class DateValidator:
    @staticmethod
    def validate_date(date_obj, source_url)
        # Zwraca: (validated_date, confidence, warning)

    @staticmethod
    def extract_date_from_url(url)
        # Pattern: /YYYY/MM/DD/

    @staticmethod
    def extract_date_from_text(text)
        # Fuzzy parsing z dateutil
```

## Zapisywanie Danych

### Tabela: company_events

```python
CompanyEvent(
    company_id = firm_id
    event_type = 'company_news'
    title = "Tytuł aktualności"
    description = "Opis..."
    event_date = validated_date      # Z walidacją!
    source_url = "https://..."
    created_at = now
)
```

### Atrybuty dodatkowe (w logach):
- `date_confidence` - 0.0-1.0
- `date_warning` - tekstowe ostrzeżenie jeśli data podejrzana

## Zależności

### Nowe:
```bash
pip install python-dateutil
```

### Istniejące:
- requests
- beautifulsoup4
- sqlalchemy

## Przykłady Użycia

### Scraping z walidacją dat:
```python
scraper = CompanyNewsScraper()
company = db.query(Company).filter_by(id=12).first()  # WATERM

articles = scraper.scrape_company_blog(company)
# [
#   {
#     'title': 'Nowy produkt',
#     'url': 'https://...',
#     'date': datetime(2024, 10, 21),
#     'date_confidence': 0.7,  # Skorygowano z 2025
#     'date_warning': 'Year corrected from 2025 to 2024',
#     'description': '...'
#   }
# ]

for article in articles:
    event = scraper.save_event(article)
    if event:
        print(f"✓ Saved: {event.title}")
```

### Tylko walidacja daty:
```python
validator = DateValidator()

# Przykład 1: Data w przyszłości (błąd z URL)
date = datetime(2025, 10, 21)
validated, confidence, warning = validator.validate_date(date)
# Returns: (datetime(2024, 10, 21), 0.7, "Year corrected from 2025 to 2024")

# Przykład 2: Poprawna data
date = datetime(2024, 10, 21)
validated, confidence, warning = validator.validate_date(date)
# Returns: (datetime(2024, 10, 21), 1.0, None)

# Przykład 3: Data za daleko w przyszłości
date = datetime(2026, 10, 21)
validated, confidence, warning = validator.validate_date(date)
# Returns: (None, 0.0, "Date too far in future (>1 year)")
```

## Monitorowanie

### Logi:
```python
logger.warning(f"Date {date_obj} in future, correcting to {corrected}")
logger.info(f"Saved event: {title} (confidence: 90%)")
logger.error(f"Failed to save event: {error}")
```

### Tryb DEBUG:
```python
logging.basicConfig(level=logging.DEBUG)
# Pokaże wszystkie próby scraping, nawet nieudane
```

## Integracja z Istniejącymi Systemami

### 1. Web Scraper (scrape_websites_ai.py)
- **Scrapes:** Full website content + AI analysis
- **Frequency:** Manual / scheduled
- **Focus:** Company info, services, capabilities

### 2. News Scraper (scrape_company_news.py) - NOWY
- **Scrapes:** Company blog/news sections
- **Frequency:** Weekly recommended
- **Focus:** Events, announcements, updates
- **Feature:** Date validation & correction

### 3. Manual Entry
- Poprzez interfejs WWW (TODO)
- Import z JSON/CSV
- API endpoint (TODO)

## Rekomendacje

### 1. Harmonogram scrapingu:
```bash
# Cron job - co tydzień w niedzielę o 3:00
0 3 * * 0 /var/www/nordabiznes/venv/bin/python3 /var/www/nordabiznes/scrape_company_news.py --limit 80 >> /var/log/nordabiznes_news_scraper.log 2>&1
```

### 2. Monitoring:
- Sprawdzać logi pod kątem ostrzeżeń o datach
- Regularnie uruchamiać `fix_event_dates.py`
- Alert gdy confidence < 0.8

### 3. Przyszłe ulepszenia:
- [ ] Scraping z Google News dla firm
- [ ] Scraping z social media (Facebook, LinkedIn)
- [ ] AI-powered event classification (product launch vs news vs announcement)
- [ ] Email notifications o nowych wydarzeniach
- [ ] Admin panel do ręcznej weryfikacji podejrzanych dat

## Pliki

### Lokalizacja:
- `/var/www/nordabiznes/scrape_company_news.py` - Główny scraper
- `/var/www/nordabiznes/fix_event_dates.py` - Weryfikacja dat
- `/var/www/nordabiznes/NEWS_SCRAPING_SYSTEM.md` - Ta dokumentacja

### Lokalnie:
- `~/claude/projects/active/nordabiz/scrape_company_news.py`
- `~/claude/projects/active/nordabiz/fix_event_dates.py`
- `~/claude/projects/active/nordabiz/NEWS_SCRAPING_SYSTEM.md`

## Status Wdrożenia

- ✅ System zaimplementowany
- ✅ Skrypty przetestowane
- ✅ Dokumentacja utworzona
- ✅ Pliki uploaded na serwer
- ⏳ Pierwsz

y pełny run (oczekuje na polecenie)
- ⏳ Konfiguracja cron job
- ⏳ Integracja z admin panel

## Kontakt

Implementacja: 2025-11-28
Serwer: NORDABIZ-01 (10.22.68.249)
Projekt: Norda Biznes Hub
