Добавление данных LyngSat в базу
This commit is contained in:
@@ -24,7 +24,8 @@ class LyngSat(models.Model):
|
|||||||
sym_velocity = models.FloatField(default=0, null=True, blank=True, verbose_name="Символьная скорость, БОД")
|
sym_velocity = models.FloatField(default=0, null=True, blank=True, verbose_name="Символьная скорость, БОД")
|
||||||
last_update = models.DateTimeField(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="Описание источника")
|
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):
|
def __str__(self):
|
||||||
return f"Ист {self.frequency}, {self.polarization}"
|
return f"Ист {self.frequency}, {self.polarization}"
|
||||||
|
|||||||
@@ -77,9 +77,11 @@ class LyngSatParser:
|
|||||||
}
|
}
|
||||||
return polarization_map.get(polarization.upper(), polarization)
|
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 = []
|
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"
|
url = f"{self.BASE_URL}/{region}.html"
|
||||||
payload = {
|
payload = {
|
||||||
"cmd": "request.get",
|
"cmd": "request.get",
|
||||||
@@ -94,9 +96,34 @@ class LyngSatParser:
|
|||||||
print(f"Обработал страницу по {region}")
|
print(f"Обработал страницу по {region}")
|
||||||
return html_regions
|
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]:
|
def get_satellites_data(self) -> dict[dict]:
|
||||||
sat_data = {}
|
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")
|
soup = BeautifulSoup(region_page, "html.parser")
|
||||||
|
|
||||||
col_table = soup.find_all("div", class_="desktab")[0]
|
col_table = soup.find_all("div", class_="desktab")[0]
|
||||||
@@ -369,3 +396,8 @@ class KingOfSatParser:
|
|||||||
}
|
}
|
||||||
|
|
||||||
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
58
dbapp/lyngsatapp/utils.py
Normal 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()
|
||||||
@@ -1021,10 +1021,8 @@
|
|||||||
const row = checkbox.closest('tr');
|
const row = checkbox.closest('tr');
|
||||||
const itemId = checkbox.value;
|
const itemId = checkbox.value;
|
||||||
|
|
||||||
// Check if item is already in the list
|
|
||||||
const itemExists = window.selectedItems.some(item => item.id === itemId);
|
const itemExists = window.selectedItems.some(item => item.id === itemId);
|
||||||
if (!itemExists) {
|
if (!itemExists) {
|
||||||
// Create an object containing the row data
|
|
||||||
const rowData = {
|
const rowData = {
|
||||||
id: itemId,
|
id: itemId,
|
||||||
name: row.cells[1].textContent,
|
name: row.cells[1].textContent,
|
||||||
|
|||||||
Reference in New Issue
Block a user