вроде как откатился на ошибки парсеров без веб интерфейс
This commit is contained in:
2
app.py
2
app.py
@@ -29,7 +29,7 @@ import contextlib
|
|||||||
import os
|
import os
|
||||||
from parsers.parser_game import run_parser_game
|
from parsers.parser_game import run_parser_game
|
||||||
from parsers.parser_players import run_parser_players
|
from parsers.parser_players import run_parser_players
|
||||||
from parsers.parser_schedule import run_parser_schedule
|
from parsers.parser_schedule import run_parser_schedule, SiteUnavailableError
|
||||||
from parsers.parser_standings import run_parser_standings
|
from parsers.parser_standings import run_parser_standings
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -7,18 +7,10 @@ BASE_MATCH_URL = "https://wfl.rfs.ru/match/"
|
|||||||
|
|
||||||
|
|
||||||
def fetch_html(url: str) -> str:
|
def fetch_html(url: str) -> str:
|
||||||
headers = {
|
headers = {"User-Agent": "Mozilla/5.0", "Accept": "*/*"}
|
||||||
"User-Agent": "Mozilla/5.0",
|
r = requests.get(url, headers=headers, timeout=20)
|
||||||
"Accept": "*/*"
|
r.raise_for_status()
|
||||||
}
|
return r.text
|
||||||
|
|
||||||
try:
|
|
||||||
r = requests.get(url, headers=headers, timeout=20)
|
|
||||||
r.raise_for_status()
|
|
||||||
return r.text
|
|
||||||
|
|
||||||
except requests.exceptions.RequestException as e:
|
|
||||||
return f"Сайт недоступен: {e}"
|
|
||||||
|
|
||||||
|
|
||||||
def extract_player_id_from_href(href: str) -> str:
|
def extract_player_id_from_href(href: str) -> str:
|
||||||
|
|||||||
@@ -17,18 +17,10 @@ AMPLUA_FULL = {
|
|||||||
|
|
||||||
|
|
||||||
def fetch_html(url: str) -> str:
|
def fetch_html(url: str) -> str:
|
||||||
headers = {
|
headers = {"User-Agent": "Mozilla/5.0", "Accept": "*/*"}
|
||||||
"User-Agent": "Mozilla/5.0",
|
r = requests.get(url, headers=headers, timeout=20)
|
||||||
"Accept": "*/*"
|
r.raise_for_status()
|
||||||
}
|
return r.text
|
||||||
|
|
||||||
try:
|
|
||||||
r = requests.get(url, headers=headers, timeout=20)
|
|
||||||
r.raise_for_status()
|
|
||||||
return r.text
|
|
||||||
|
|
||||||
except requests.exceptions.RequestException as e:
|
|
||||||
return f"Сайт недоступен: {e}"
|
|
||||||
|
|
||||||
|
|
||||||
def get_links(html: str) -> list[dict]:
|
def get_links(html: str) -> list[dict]:
|
||||||
|
|||||||
@@ -50,44 +50,12 @@ def parse_russian_date(date_str: str, year: int | None = None) -> datetime:
|
|||||||
return datetime(year, month, int(day), int(hh), int(mm), tzinfo=TZ)
|
return datetime(year, month, int(day), int(hh), int(mm), tzinfo=TZ)
|
||||||
|
|
||||||
|
|
||||||
class SiteUnavailableError(Exception):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def fetch_html(url: str) -> str:
|
def fetch_html(url: str) -> str:
|
||||||
headers = {
|
headers = {"User-Agent": "Mozilla/5.0", "Accept": "*/*"}
|
||||||
"User-Agent": "Mozilla/5.0",
|
response = requests.get(url, headers=headers, timeout=20)
|
||||||
"Accept": "*/*"
|
response.raise_for_status()
|
||||||
}
|
return response.text
|
||||||
|
|
||||||
try:
|
|
||||||
response = requests.get(url, headers=headers, timeout=20)
|
|
||||||
response.raise_for_status()
|
|
||||||
return response.text
|
|
||||||
|
|
||||||
except requests.exceptions.Timeout:
|
|
||||||
raise SiteUnavailableError("Сайт слишком долго отвечает")
|
|
||||||
|
|
||||||
except requests.exceptions.ConnectionError:
|
|
||||||
raise SiteUnavailableError("Не удалось подключиться к сайту")
|
|
||||||
|
|
||||||
except requests.exceptions.HTTPError as e:
|
|
||||||
raise SiteUnavailableError(f"Ошибка HTTP: {e.response.status_code}")
|
|
||||||
|
|
||||||
except requests.exceptions.TooManyRedirects:
|
|
||||||
raise SiteUnavailableError("Слишком много редиректов")
|
|
||||||
|
|
||||||
except requests.exceptions.InvalidURL:
|
|
||||||
raise SiteUnavailableError("Неверный URL")
|
|
||||||
|
|
||||||
except requests.exceptions.MissingSchema:
|
|
||||||
raise SiteUnavailableError("Отсутствует схема URL, например https://")
|
|
||||||
|
|
||||||
except requests.exceptions.SSLError:
|
|
||||||
raise SiteUnavailableError("Ошибка SSL сертификата")
|
|
||||||
|
|
||||||
except requests.exceptions.RequestException as e:
|
|
||||||
raise SiteUnavailableError(f"Неизвестная ошибка запроса: {e}")
|
|
||||||
|
|
||||||
def normalize_status(score1: str | None, score2: str | None, dt: datetime) -> str:
|
def normalize_status(score1: str | None, score2: str | None, dt: datetime) -> str:
|
||||||
now = datetime.now(TZ)
|
now = datetime.now(TZ)
|
||||||
@@ -194,29 +162,11 @@ def parse_schedule(html: str) -> list[dict]:
|
|||||||
return matches_data
|
return matches_data
|
||||||
|
|
||||||
|
|
||||||
def run_parser_schedule() -> dict:
|
def run_parser_schedule() -> None:
|
||||||
try:
|
html = fetch_html(URL_SCHEDULE)
|
||||||
html = fetch_html(URL_SCHEDULE)
|
matches_data = parse_schedule(html)
|
||||||
matches_data = parse_schedule(html)
|
sync_matches(matches_data)
|
||||||
sync_matches(matches_data)
|
print(f"[parser_schedule] Matches synced: {len(matches_data)}")
|
||||||
|
|
||||||
return {
|
|
||||||
"success": True,
|
|
||||||
"message": f"Матчи синхронизированы: {len(matches_data)}",
|
|
||||||
"count": len(matches_data),
|
|
||||||
}
|
|
||||||
|
|
||||||
except SiteUnavailableError as e:
|
|
||||||
return {
|
|
||||||
"success": False,
|
|
||||||
"message": f"Сайт недоступен: {e}",
|
|
||||||
}
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
return {
|
|
||||||
"success": False,
|
|
||||||
"message": f"Ошибка парсера: {e}",
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -8,18 +8,10 @@ SEASON = "2025/2026"
|
|||||||
|
|
||||||
|
|
||||||
def fetch_html(url: str) -> str:
|
def fetch_html(url: str) -> str:
|
||||||
headers = {
|
headers = {"User-Agent": "Mozilla/5.0", "Accept": "*/*"}
|
||||||
"User-Agent": "Mozilla/5.0",
|
r = requests.get(url, headers=headers, timeout=20)
|
||||||
"Accept": "*/*"
|
r.raise_for_status()
|
||||||
}
|
return r.text
|
||||||
|
|
||||||
try:
|
|
||||||
r = requests.get(url, headers=headers, timeout=20)
|
|
||||||
r.raise_for_status()
|
|
||||||
return r.text
|
|
||||||
|
|
||||||
except requests.exceptions.RequestException as e:
|
|
||||||
return f"Сайт недоступен: {e}"
|
|
||||||
|
|
||||||
|
|
||||||
def parse_standings(html: str) -> list[dict]:
|
def parse_standings(html: str) -> list[dict]:
|
||||||
|
|||||||
@@ -9,18 +9,10 @@ TEAMS_URL = "https://wfl.rfs.ru/tournament/1061879/teams"
|
|||||||
|
|
||||||
|
|
||||||
def fetch_html(url: str) -> str:
|
def fetch_html(url: str) -> str:
|
||||||
headers = {
|
headers = {"User-Agent": "Mozilla/5.0", "Accept": "*/*"}
|
||||||
"User-Agent": "Mozilla/5.0",
|
response = requests.get(url, timeout=30, headers=headers)
|
||||||
"Accept": "*/*"
|
response.raise_for_status()
|
||||||
}
|
return response.text
|
||||||
|
|
||||||
try:
|
|
||||||
r = requests.get(url, headers=headers, timeout=20)
|
|
||||||
r.raise_for_status()
|
|
||||||
return r.text
|
|
||||||
|
|
||||||
except requests.exceptions.RequestException as e:
|
|
||||||
return f"Сайт недоступен: {e}"
|
|
||||||
|
|
||||||
|
|
||||||
def get_links(html) -> list:
|
def get_links(html) -> list:
|
||||||
|
|||||||
Reference in New Issue
Block a user