Как и многие любители путешествий, координаты городских достопримечательностей я нахожу на сайте.
autotravel.ru (далее – сайт).
Под свои нужды я написал небольшую утилиту для скачивания файлов с достопримечательностями для последующей загрузки в навигатор.
Программа предельно простая, но работает именно так, как мне нужно.
Кроме того, реализовано простейшее средство экономии времени загрузки и трафика — кеширование.
Программа, которую я называю AtTrackDownloader, написана на Python 3 с использованием Beautiful Soup — библиотеки для анализа HTML-файлов.
PyQt используется для графического интерфейса — просто потому, что я знаком с Qt. Ядро программы — класс автопутешествий.
Полностью описывать его методы нет смысла (тем более в конце дам ссылку на git-репозиторий).
Я опишу основную логику.
Метод __load_towns_page загружает содержимое страницы сайта для городов, начинающихся с буквы.def __load_towns_page(self, letter): url = AutoTravelHttp + '/towns.php' params = {'l' : letter.encode('cp1251')} req = urllib2.Request(url, urllib.parse.urlencode(params).
encode('cp1251')) response = urllib2.urlopen(req) return response.read().
decode('utf-8')
Точнее, так было несколько месяцев назад, а некоторое время назад они поменяли адреса страниц и вместо буквы там указано 'а'+номер_буквы.
Например: А - 'а01', Б - 'а02', .
, Z - 'а30'.
Соответственно, чтобы загрузить города для всех букв, этот метод вызывается в цикле из метода __load_all_towns. Полученный текст веб-страницы передается методу __load_towns_from_url: def __load_towns_from_url(self, html_src):
for line in html_src.splitlines():
soup = BeautifulSoup(line, 'html.parser')
area = soup.find('font', {'class' : 'travell0'})
town= soup.find('a', {'class', 'travell5'})
if town == None:
town = soup.find('a', {'class', 'travell5c'})
if town == None:
continue
town_name = town.get_text().
strip() area_name = area.get_text().
strip()[1:-1]
town_href = town.get('href')
yield {'area' : area_name, 'town' : town_name, 'href' : town_href}
Этот метод делает всю основную работу по парсингу городов.
Разбираемые города заносятся в список словарей с ключами area — регион или страна, Town — название города, href — короткая ссылка на город (относительно сайта).
Таким образом в память загружаются все города с сайта.
На моем компьютере это занимает около 10 секунд. Естественно, это плохо, поэтому и возникла идея тайника загруженных городов.
Python позволяет сериализовать список как одну строку, в отличие от других известных мне языков, и это здорово.
Способ сохранения городов в файл кэша следующий: def __save_to_cache(self, data):
with open('attd.cache', 'wb') as f:
pickle.dump(data, f)
Загрузка из кэша осуществляется в конструкторе класса: def __init__(self):
try:
with open('attd.cache', 'rb') as f:
self.__all_towns = pickle.load(f)
except FileNotFoundError:
self.__all_towns = list(self.__load_all_towns())
self.__save_to_cache(self.__all_towns)
В результате мы получаем десятисекундную задержку только при первом запуске.
Получение ссылок на файлы треков реализовано в методе get_towns_track_links, который принимает адрес страницы с городом: def get_towns_track_links(self, href):
req = urllib2.Request(href)
response = urllib2.urlopen(req)
soup = BeautifulSoup(response.read().
decode('utf-8'), 'html.parser')
r = {}
for link in soup.findAll('a', {'class' : 'travell5m'}):
if link.get_text() == 'GPX':
r['gpx'] = AutoTravelHttp + link.get('href')
elif link.get_text() == 'KML':
r['kml'] = AutoTravelHttp + link.get('href')
elif link.get_text() == 'WPT':
r['wpt'] = AutoTravelHttp + link.get('href')
return r
Поскольку теоретически (были такие случаи и раньше) страницы городов могут не иметь формата треков, в словарь заносятся доступные типы треков и ссылки на них.
Затем это используется для фильтрации файлов в диалоговом окне сохранения файла.
Описывать создание интерфейса не вижу смысла — там все еще проще; желающие могут зайти в репозиторий.
А для тех кому не интересно вот скриншот:
Полные исходные коды находятся на Гитхаб .
Теги: #python #autotavel #красивый суп #python
-
Обзор Ноутбука Hp Pavilion Dv6 Series 3050Us
19 Oct, 24 -
Вам Тоже Надоела Реклама Билайн?
19 Oct, 24 -
Pdfvue: Аннотации Pdf Из Браузера.
19 Oct, 24 -
Хабра Изменилась
19 Oct, 24