Files
pgz-sport/scrapers/harvesters/events_pgz.py
T
damir f07fdad919 Crisis V7 MEGA: sufinanciranje_sport + panel + CRM auth
DB:
- pgz_sport.sufinanciranje_sport.je_klub flag (RSS programi/totals false)
- pgz_sport.sufinanciranje_sport.klub_id matched

Endpoints:
- /v2/potpore/by-year: samo_klubovi=True default + davatelj filter

Frontend:
- sport2.html PANEL FORCE HIDE CSS (right:-100vw default)
- crm_v2.html: redirect to /login only on actual 401, not on page load
2026-05-05 15:02:47 +02:00

71 lines
2.8 KiB
Python

#!/usr/bin/env python3
"""Public events i festivali PGZ."""
import sys, json, time
sys.path.insert(0, "/opt/pgz-sport/scrapers/harvesters")
from _common import (fetch, extract_text, extract_title, chunk_text,
upsert_facts, find_internal_links, DSN)
from urllib.parse import urlparse
import psycopg2
EVENTS = {
"rijeka_karneval": ["https://www.rijecki-karneval.hr/", "https://rijekakarneval.hr/"],
"ljeto_kvarner": ["https://www.kvarner-ljeto.hr/"],
"rijeka_film_fest": ["https://www.riff.hr/"],
"vinski_festival_op": ["https://opatijawine.hr/"],
"festival_culture": ["https://www.festival-of-cultures.hr/"],
"muzicki_kvarner": ["https://www.kvarnermusic.hr/"],
"porto_etno": ["https://www.portoetno.eu/"],
"ri_rock": ["https://rockkonferencija.com/"],
"fjeshta_lovran": ["https://www.fjeshta.hr/"],
"njanje_zvoncari": ["https://halubajskizvoncari.hr/"],
"skoljka_festival": ["https://www.kostrena.hr/"],
"sumski_film": ["https://www.lifftrijeka.hr/"],
"zicfest": ["https://www.zicfest.hr/"],
}
def crawl(name, urls, max_pages=12):
conn = psycopg2.connect(DSN); conn.autocommit = True
visited = set(); queue = list(urls); facts = 0
while queue and len(visited) < max_pages:
url = queue.pop(0)
if url in visited: continue
visited.add(url)
html, status = fetch(url, timeout=15)
if not html or status != 200: continue
title = extract_title(html); text = extract_text(html)
if not text or len(text) < 200: continue
ff = []
if title and len(title) > 8:
ff.append({"fact": f"{name} - {title}", "url": url, "title": title})
for c in chunk_text(text, 800):
if len(c) > 100:
ff.append({"fact": c, "url": url, "title": title})
facts += upsert_facts(conn, ff, source_name=name,
category="events_pgz", confidence=0.85)
base = urlparse(url).hostname
for link in find_internal_links(html, url):
if link not in visited and (urlparse(link).hostname or "") == base and len(queue) < 30:
queue.append(link)
time.sleep(0.5)
conn.close()
return {"name": name, "visited": len(visited), "facts": facts}
def main():
results = []
for name, urls in EVENTS.items():
try:
r = crawl(name, urls, max_pages=10)
print(f" {name:25} {r['visited']:>3}p {r['facts']:>5}f")
results.append(r)
except Exception as e:
print(f" {name:25} FAIL: {str(e)[:60]}")
total = sum(r.get("facts", 0) for r in results)
print(f"=== TOTAL: {total} ===")
print(json.dumps({"events_count": len(results), "total_facts": total}))
if __name__ == "__main__":
main()