Advertisement
tokarevms

Aeroscript

Jul 28th, 2017
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.64 KB | None | 0 0
  1. # coding: cp1251
  2. import json
  3. import requests
  4.  
  5.  
  6. class Aeroflot(object):  # Класс для поиска цен на билеты
  7.  
  8.     def __init__(self):  # Начальные значения
  9.         self.search_url = 'https://www.aeroflot.ru/sb/booking/api/app/search/v2'  # Адрес поисковых запросов
  10.         self.code_origin = None
  11.         self.code_destination = None
  12.         self.date = None
  13.         self.page = None
  14.         self.city_to = None
  15.         self.city_from = None
  16.  
  17.     def correct_input_info(self):  # Ввод данных. Gринимается один пункт вылета и несколько целей, дат, через запятую
  18.         self.city_from = raw_input('City origin: ')
  19.         self.city_to = raw_input('City destination: ').split(', ')
  20.         self.date = raw_input('Date ( yyyy-mm-dd): ').split(', ')
  21.  
  22.     def check_input(self):  # Определяет, есть ли коды IATA по запрошенным городам
  23.         with open('Library.txt', 'r') as libra:  # библиотека кодов IATA (городу, аэропорту)
  24.             for city in self.city_to:  # Обход списка городов-целей
  25.                 code_destination = None
  26.                 for line in libra.readlines():  # Поиск городов в библиотеке и присваивание кодов IATA
  27.                     if self.city_from in line:          # Если код аэропорта вылета найден
  28.                         self.code_origin = line[:3]     # ,то сохраняется
  29.                     elif city in line:   # Если код аэропорта прилета найден, то он сохраняется
  30.                         code_destination = line[:3]
  31.                     if code_destination and self.code_origin:   # Когда коды двух городов найдены
  32.                         print 'Cities found'   # Вывод сообщения
  33.                         for date in self.date:  # Обход дат перелетов
  34.                             self.give_a_page(code_destination, date)   # Запуск получения нужной информации
  35.                             self.extract_data(code_destination, date)   # Извлечение информации и сохранение в файл
  36.                         libra.seek(0)  # Возвращение к началу библиотеки
  37.                         break
  38.                 else:
  39.                     print 'Cities not found'
  40.  
  41.     def give_a_page(self, code_destination, date):  # Формирует запрос и сохраняет страницу данных
  42.         json_req = {"routes": [{"origin": self.code_origin, "destination": code_destination, "departure": date}],
  43.                 "cabin": "econom", "award": False, "country": "ru", "adults": 1, "children": 0, "infants": 0,
  44.                 "combined": False, "lang": "ru"}
  45.         respond = requests.post(self.search_url, json=json_req)   # JSON запрос
  46.         if respond.status_code == 200:   # Проверка кода ответа, если запрос успешен
  47.             self.page = json.loads(respond.text)   # JSON-ответ сохраняется в виде словаря
  48.             print 'Success request'
  49.         else:
  50.             print 'Invalid request'  # Если код ответа не 200, то JSON-ответ не сохраняется
  51.             self.page = None
  52.  
  53.     def extract_data(self, code_destination, date):  # Извлечение данных из полученной страницы и вывод в файл и консоль
  54.         if self.page is not None:
  55.             self.document.write('\n\nFlights from %s to %s  %s\n'  # Шапка списка рейсов
  56.                            'Code    Airport\Time\Price\n\n' % (self.code_origin, code_destination, date))
  57.             try:
  58.                 for num in self.page['data']['itineraries'][0]:  # Извлечение данных из словаря
  59.                     if len(num['legs'][0]['segments']) != 1:  # По перелетам с пересадкой не выводится информация
  60.                         self.document.write('Complex flight\n')
  61.                         continue
  62.                     else:  # Получение параметров и их запись в файл
  63.                         rescode = num['legs'][0]['segments'][0]['operating_flight_number']  # Номер рейся
  64.                         reschr = num['legs'][0]['segments'][0]['airline_code']  # Код рейса
  65.                         resfrom = num['legs'][0]['segments'][0]['origin']['airport_name']  # Аэропорт вылета
  66.                         resto = num['legs'][0]['segments'][0]['destination']['airport_name']  # Аэропорт прилета
  67.                         restravel = num['time_name']  # Время в пути
  68.                         restfrom = num['legs'][0]['segments'][0]['departure_name']  # Время вылета
  69.                         restto = num['legs'][0]['segments'][0]['arrival_name']  # Время прилета
  70.                         price = num['prices'][0]['total_amount']  # Цена, самая низкая из доступных
  71.                         city_name_to = num['legs'][0]['segments'][0]['destination']['city_name']  # Город прилета
  72.                         city_name_from = num['legs'][0]['segments'][0]['origin']['city_name']  # Город вылета
  73.                         print price, reschr + rescode, resto  # Вывод части информации в консоль
  74.                         self.document.write(('%-10s %s/%-20s %-25s %-15s %s/%-20s %-25s %s\n' %
  75.                                         (reschr + rescode, city_name_from, resfrom, restfrom, restravel,
  76.                                          resto, city_name_to, restto, price)).encode('cp1251'))  # Запись в файл
  77.             except IndexError:  # Если структуры не найдено, то рейсов по данному запросу нет
  78.                 print 'Flights not found'
  79.                 self.document.write('\n\nFlights not found!\n\n')
  80.  
  81.     def search(self):  # Поиск собирается тут
  82.         self.document = open('ResultAero.txt', 'w')  # Открывает файл для записи
  83.         self.correct_input_info()  # Ввод данных
  84.         self.check_input()  # Проверка городов
  85.         self.document.close()   # Запись в файл закончилась
  86.  
  87. if __name__ == '__main__':
  88.     first = Aeroflot()
  89.     first.search()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement