Добавление данных LyngSat в базу

This commit is contained in:
2025-11-10 17:59:35 +03:00
parent 0858961410
commit b24ef940ce
4 changed files with 96 additions and 7 deletions

View File

@@ -24,7 +24,8 @@ class LyngSat(models.Model):
sym_velocity = models.FloatField(default=0, null=True, blank=True, verbose_name="Символьная скорость, БОД")
last_update = models.DateTimeField(null=True, blank=True, verbose_name="Время")
channel_info = models.CharField(max_length=20, blank=True, null=True, verbose_name="Описание источника")
# url = models.URLField(max_length = 200, blank=True, null=True, verbose_name="Ссылка на страницу")
fec = models.CharField(max_length=30, blank=True, null=True, verbose_name="Коэффициент коррекции ошибок")
url = models.URLField(max_length = 200, blank=True, null=True, verbose_name="Ссылка на страницу")
def __str__(self):
return f"Ист {self.frequency}, {self.polarization}"

View File

@@ -77,9 +77,11 @@ class LyngSatParser:
}
return polarization_map.get(polarization.upper(), polarization)
def get_region_pages(self) -> list[str]:
def get_region_pages(self, regions: list[str] | None = None) -> list[str]:
html_regions = []
for region in self.regions:
if regions is None:
regions = self.regions
for region in regions:
url = f"{self.BASE_URL}/{region}.html"
payload = {
"cmd": "request.get",
@@ -94,9 +96,34 @@ class LyngSatParser:
print(f"Обработал страницу по {region}")
return html_regions
def get_satellite_urls(self, html_regions: list[str]):
sat_names = []
sat_urls = []
for region_page in html_regions:
soup = BeautifulSoup(region_page, "html.parser")
col_table = soup.find_all("div", class_="desktab")[0]
tables = col_table.find_next_sibling('table').find_all('table')
trs = []
for table in tables:
trs.extend(table.find_all('tr'))
for tr in trs:
sat_name = tr.find('span').text
if self.target_sats is not None:
if sat_name.strip().lower() not in self.target_sats:
continue
try:
sat_url = tr.find_all('a')[2]['href']
except IndexError:
sat_url = tr.find_all('a')[0]['href']
sat_names.append(sat_name)
sat_urls.append(sat_url)
return sat_names, sat_urls
def get_satellites_data(self) -> dict[dict]:
sat_data = {}
for region_page in self.get_region_pages():
for region_page in self.get_region_pages(self.regions):
soup = BeautifulSoup(region_page, "html.parser")
col_table = soup.find_all("div", class_="desktab")[0]
@@ -368,4 +395,9 @@ class KingOfSatParser:
'metadata': data['ini_data']['metadata']
}
return satellite_dict
return satellite_dict
from pprint import pprint
lyngsat = LyngSatParser(regions=['europe'], target_sats=['Türksat 3A', 'Intelsat 22'])
html_regions = lyngsat.get_region_pages()
pprint(lyngsat.get_satellite_urls(html_regions))

58
dbapp/lyngsatapp/utils.py Normal file
View File

@@ -0,0 +1,58 @@
from .parser import LyngSatParser
from .models import LyngSat
from mainapp.models import Polarization, Standard, Modulation, Satellite
def fill_lyngsat_data(target_sats: list[str]):
parser = LyngSatParser(
target_sats=target_sats,
)
lyngsat_data = parser.get_satellites_data()
for sat_name, data in lyngsat_data.items():
url = data['url']
sources = data['sources']
for source in sources:
try:
freq = float(source['freq'])
except Exception as e:
freq = -1.0
print("Беда с частотой")
last_update = source['last_update']
fec = source['metadata']['fec']
modulation = source['metadata']['modulation']
standard = source['metadata']['standard']
symbol_velocity = source['metadata']['symbol_rate']
polarization = source['pol']
channel_info = source['provider_name']
pol_obj, _ = Polarization.objects.get_or_create(
name=polarization
)
mod_obj, _ = Modulation.objects.get_or_create(
name=modulation
)
standard_obj, _ = Standard.objects.get_or_create(
name=standard
)
sat_obj, _ = Satellite.objects.get(
name__contains=sat_name
)
lyng_obj, _ = LyngSat.objects.get_or_create(
id_satellite=sat_obj,
frequency=freq,
polarization=pol_obj,
defaults={
"modulation": mod_obj,
"standard": standard_obj,
"sym_velocity": symbol_velocity,
"channel_info": channel_info,
"last_update": last_update,
"fec": fec,
"url": url
}
)
lyng_obj.objects.update_or_create()
# TODO: сделать карточку и форму для действий и выбора спутника
lyng_obj.save()