parse_saby/main.py

118 lines
5.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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)