Autotravel.ruからトラックをダウンロードする

多くの旅行愛好家のように、私はサイトautotravel.ru (以下、サイトと呼びます)で都市の観光スポットの座標を見つけます。 必要に応じて、ナビゲーターにさらにアップロードするためのアトラクションを含むファイルをダウンロードするための小さなユーティリティを作成しました。 プログラムは非常にシンプルですが、必要なとおりに機能します。 さらに、ロード時間とトラフィックを節約する最も簡単な方法であるキャッシングが実装されています。



AtTrackDownloaderと呼ばれるプログラムは、HTMLファイルを解析するためのライブラリであるBeautiful Soupを使用してPython 3で記述されています。 PyQtはGUIに使用されます-Qtに精通しているからです。



プログラムの中核はautotravelクラスです。 メソッドを完全に説明することは意味がありません(特に最後に、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メソッドは、文字letterで始まる都市のサイトページのコンテンツをロードします。 より正確には、これは数か月前であり、しばらく前にページのアドレスを変更し、文字「a」の代わりに文字番号が表示されます。 例:A-'a01'、B-'a02'、...、I-'a30'。



したがって、すべての文字で都市を読み込むために、このメソッドは__load_all_townsメソッドからループで呼び出されます。 受信したWebページのテキストは、__ 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}
      
      





この方法では、都市の解析に関するすべての主要な作業が完了します。 逆アセンブルされた都市は、キーの「エリア」-地域または国、「タウン」-都市の名前、「href」-都市への短いリンク(サイトに対して)を使用して、辞書のリストに入力されます。



したがって、サイトのすべての都市がメモリにロードされます。 私のコンピューターでは10秒かかります。 当然、これは悪いので、忙しい都市のキャッシュのアイデアが浮上しました。 Pythonでは、私が知っている他の言語とは異なり、リストを1行でシリアル化できます。これは素晴らしいことです。 キャッシュファイルに都市を保存する方法は次のとおりです。



 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)
      
      





その結果、最初の開始時にのみ10秒の遅延が発生します。



ファイルを追跡するためのリンクの取得は、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
      
      





理論上(および以前は、このようなケースがあった)、都市のページにはトラック形式が存在しない可能性があるため、利用可能なタイプのトラックとそれらへのリンクが辞書に入力されます。 次に、ファイル保存ダイアログでファイルをフィルタリングするために使用されます。



インターフェースの作成について説明することには意味がありません。リポジトリにアクセスすることに興味がある人にとっては、まだ簡単です。 そして、興味がない人のために、スクリーンショットを提供します:



画像



完全なソースコードはGithubにあります。



All Articles