Скачивание Треков С Autotravel.ru

Как и многие любители путешествий, координаты городских достопримечательностей я нахожу на сайте.

autotravel.ru (далее – сайт).

Под свои нужды я написал небольшую утилиту для скачивания файлов с достопримечательностями для последующей загрузки в навигатор.

Программа предельно простая, но работает именно так, как мне нужно.

Кроме того, реализовано простейшее средство экономии времени загрузки и трафика — кеширование.

Программа, которую я называю AtTrackDownloader, написана на Python 3 с использованием Beautiful Soup — библиотеки для анализа HTML-файлов.

PyQt используется для графического интерфейса — просто потому, что я знаком с Qt. Ядро программы — класс автопутешествий.

Полностью описывать его методы нет смысла (тем более в конце дам ссылку на git-репозиторий).

Я опишу основную логику.

  
  
  
  
   

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')

Метод __load_towns_page загружает содержимое страницы сайта для городов, начинающихся с буквы.

Точнее, так было несколько месяцев назад, а некоторое время назад они поменяли адреса страниц и вместо буквы там указано 'а'+номер_буквы.

Например: А - 'а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

Поскольку теоретически (были такие случаи и раньше) страницы городов могут не иметь формата треков, в словарь заносятся доступные типы треков и ссылки на них.

Затем это используется для фильтрации файлов в диалоговом окне сохранения файла.

Описывать создание интерфейса не вижу смысла — там все еще проще; желающие могут зайти в репозиторий.

А для тех кому не интересно вот скриншот:

Скачивание треков с Autotravel.ru

Полные исходные коды находятся на Гитхаб .

Теги: #python #autotavel #красивый суп #python

Вместе с данным постом часто просматривают: