118 lines
5.1 KiB
Python
118 lines
5.1 KiB
Python
import requests
|
||
from bs4 import BeautifulSoup
|
||
from pprint import pprint
|
||
import os
|
||
|
||
URL_FNS = "https://formats.saby.ru/report/fns"
|
||
URL_FORMATS = 'https://formats.saby.ru'
|
||
response = requests.get(URL_FNS)
|
||
filename_report_fns = 'report fns.txt'
|
||
if 200 <= response.status_code <= 299:
|
||
pass
|
||
else:
|
||
print("Ошибка при запросе:", response.status_code)
|
||
|
||
# Парсинг HTML
|
||
soup = BeautifulSoup(response.text, 'html.parser')
|
||
# Содрежит url всех записей
|
||
list_report_fns = []
|
||
# Содержит URL и имя всех записей
|
||
list_for_user = []
|
||
# Цикл в котором добавляем в лист url ввида:
|
||
# https://formats.saby.ru/report/fns/116682
|
||
for link in soup.find_all('a'):
|
||
href = link.get('href')
|
||
pprint(href)
|
||
if '/report/fns/' in href:
|
||
list_report_fns.append(f'{URL_FORMATS}{href}')
|
||
link = soup.find('a', href=href)
|
||
span = link.find('span', class_="ProxySbisRu__registry-BrowserItem_typeName")
|
||
list_for_user.append(f'{URL_FORMATS}{href} {span.text}')
|
||
|
||
def write_report_fns(filename, dict_name = dict):
|
||
"""
|
||
Сохраняем запись:
|
||
https://formats.saby.ru/report/fns/106013 Действующий формат (с 26.02.24) 5.04
|
||
"""
|
||
with open(filename, 'w', encoding='utf-8') as f:
|
||
for key, value in dict_name.items():
|
||
str_k_v = f'{key}: {value}\n'
|
||
f.write(str_k_v)
|
||
|
||
def date_report_fns(list_fns = list):
|
||
"""
|
||
Функия ожидает list из URL
|
||
Заходит на каждый URL, запоминает дату.
|
||
Возвращает словарь ввида:
|
||
{'https://formats.saby.ru//report/fns/99219': 'Действующий формат (с 01.01.16) 5.05', ...}
|
||
"""
|
||
# Итоговый словарь
|
||
dict_result = {}
|
||
# Перебераем URL из аргумента функции
|
||
for url_fns in list_fns:
|
||
# Запрос страницы:
|
||
response_fns = requests.get(url_fns)
|
||
print(response_fns.status_code)
|
||
# Парсинг в HTML
|
||
soup_fns = BeautifulSoup(response_fns.text, 'html.parser')
|
||
# Поиск в HTML строки ввида: Действующий формат (с 10.01.23) 5.01
|
||
div_element = soup_fns.find('div', class_='controls-Dropdown__text')
|
||
# Извлекаем текст из элемента
|
||
text = div_element.get_text()
|
||
# Создаем словарь из URL и строки содрежащий актуальность записи
|
||
dict_appen = {url_fns: text}
|
||
# Добавляем в итоговый словарь
|
||
dict_result.update(dict_appen)
|
||
return dict_result
|
||
|
||
def actual_report_fns(dict_open, dict_new):
|
||
"""
|
||
Функция принимает два словаря:
|
||
- dict_open из файла.
|
||
- dict_new из HTML
|
||
Ищет изменения в словарях
|
||
Возвращает один актуальный словарь.
|
||
"""
|
||
dict_result = {}
|
||
# Ключи, которые есть в dict_open, но нет в dict_new
|
||
missing_in_new_dict_fns = {k: dict_open[k] for k in dict_open if k not in dict_new}
|
||
# Ключи, которые есть в new_dict_fns, но нет в dict_open
|
||
missing_in_dict_open_report_fns = {k: dict_new[k] for k in dict_new if k not in dict_open}
|
||
# Ключи с разными значениями
|
||
# value_diff = {k: (dict_open[k], dict_new[k]) for k in dict_open if k in dict_new and dict_open[k] != dict_new[k]}
|
||
value_diff = {k: dict_open[k] for k in dict_open if k in dict_new and dict_open[k] != dict_new[k]}
|
||
print('Запись не существует', missing_in_dict_open_report_fns)
|
||
print('Новые записи: ', missing_in_new_dict_fns)
|
||
print('Изменение записи', value_diff)
|
||
#Словарь с записями котоыре нужно удалить
|
||
dict_del = {}
|
||
dict_del.update(missing_in_dict_open_report_fns)
|
||
dict_del.update(value_diff)
|
||
# Удаляем из словря(который записан в файле) данные, записи которых больше не существует:
|
||
dict_result = {k: v for k, v in dict_open.items() if k not in dict_del}
|
||
# Добаляем новые записи
|
||
dict_result.update(missing_in_new_dict_fns)
|
||
dict_result.update(value_diff)
|
||
write_report_fns(filename_report_fns, dict_result)
|
||
|
||
|
||
|
||
new_dict_fns = date_report_fns(list_report_fns)
|
||
|
||
# Проверка есть ли файл
|
||
if os.path.exists(filename_report_fns):
|
||
dict_open_report_fns = {}
|
||
with open(filename_report_fns, 'r', encoding='utf-8') as f:
|
||
for line in f:
|
||
line = line.strip().split(': ')
|
||
dict_line = {line[0]:line[1]}
|
||
dict_open_report_fns.update(dict_line)
|
||
if dict_open_report_fns == new_dict_fns:
|
||
print('равны')
|
||
else:
|
||
print('не равны')
|
||
actual_report_fns(dict_open_report_fns, new_dict_fns)
|
||
else:
|
||
write_report_fns(filename_report_fns, new_dict_fns)
|
||
|