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

7.9 KiB

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:

# 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. 20252024)
- 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:

python3 scrape_company_news.py

Test (pierwsze 3 firmy):

python3 scrape_company_news.py --test

Konkretna firma:

python3 scrape_company_news.py --company-id 12  # WATERM

Limit firm:

python3 scrape_company_news.py --limit 10

Weryfikacja dat:

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

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

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

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:

pip install python-dateutil

Istniejące:

  • requests
  • beautifulsoup4
  • sqlalchemy

Przykłady Użycia

Scraping z walidacją dat:

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:

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:

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:

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:

# 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