7.9 KiB
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. 2025→2024)
- 0.5 = podejrzana data, wymaga weryfikacji
- 0.0 = odrzucona
Źródła dat (próbowane po kolei):
- Meta tagi -
<time datetime>,<meta property="article:published_time"> - URL pattern -
/2024/10/21/ - Elementy z klasą -
.date,.published,.time - 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.0date_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