Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # coding: cp1251
- import json
- import requests
- class Aeroflot(object): # Класс для поиска цен на билеты
- def __init__(self): # Начальные значения
- self.search_url = 'https://www.aeroflot.ru/sb/booking/api/app/search/v2' # Адрес поисковых запросов
- self.code_origin = None
- self.code_destination = None
- self.date = None
- self.page = None
- self.city_to = None
- self.city_from = None
- def correct_input_info(self): # Ввод данных. Gринимается один пункт вылета и несколько целей, дат, через запятую
- self.city_from = raw_input('City origin: ')
- self.city_to = raw_input('City destination: ').split(', ')
- self.date = raw_input('Date ( yyyy-mm-dd): ').split(', ')
- def check_input(self): # Определяет, есть ли коды IATA по запрошенным городам
- with open('Library.txt', 'r') as libra: # библиотека кодов IATA (городу, аэропорту)
- for city in self.city_to: # Обход списка городов-целей
- code_destination = None
- for line in libra.readlines(): # Поиск городов в библиотеке и присваивание кодов IATA
- if self.city_from in line: # Если код аэропорта вылета найден
- self.code_origin = line[:3] # ,то сохраняется
- elif city in line: # Если код аэропорта прилета найден, то он сохраняется
- code_destination = line[:3]
- if code_destination and self.code_origin: # Когда коды двух городов найдены
- print 'Cities found' # Вывод сообщения
- for date in self.date: # Обход дат перелетов
- self.give_a_page(code_destination, date) # Запуск получения нужной информации
- self.extract_data(code_destination, date) # Извлечение информации и сохранение в файл
- libra.seek(0) # Возвращение к началу библиотеки
- break
- else:
- print 'Cities not found'
- def give_a_page(self, code_destination, date): # Формирует запрос и сохраняет страницу данных
- json_req = {"routes": [{"origin": self.code_origin, "destination": code_destination, "departure": date}],
- "cabin": "econom", "award": False, "country": "ru", "adults": 1, "children": 0, "infants": 0,
- "combined": False, "lang": "ru"}
- respond = requests.post(self.search_url, json=json_req) # JSON запрос
- if respond.status_code == 200: # Проверка кода ответа, если запрос успешен
- self.page = json.loads(respond.text) # JSON-ответ сохраняется в виде словаря
- print 'Success request'
- else:
- print 'Invalid request' # Если код ответа не 200, то JSON-ответ не сохраняется
- self.page = None
- def extract_data(self, code_destination, date): # Извлечение данных из полученной страницы и вывод в файл и консоль
- if self.page is not None:
- self.document.write('\n\nFlights from %s to %s %s\n' # Шапка списка рейсов
- 'Code Airport\Time\Price\n\n' % (self.code_origin, code_destination, date))
- try:
- for num in self.page['data']['itineraries'][0]: # Извлечение данных из словаря
- if len(num['legs'][0]['segments']) != 1: # По перелетам с пересадкой не выводится информация
- self.document.write('Complex flight\n')
- continue
- else: # Получение параметров и их запись в файл
- rescode = num['legs'][0]['segments'][0]['operating_flight_number'] # Номер рейся
- reschr = num['legs'][0]['segments'][0]['airline_code'] # Код рейса
- resfrom = num['legs'][0]['segments'][0]['origin']['airport_name'] # Аэропорт вылета
- resto = num['legs'][0]['segments'][0]['destination']['airport_name'] # Аэропорт прилета
- restravel = num['time_name'] # Время в пути
- restfrom = num['legs'][0]['segments'][0]['departure_name'] # Время вылета
- restto = num['legs'][0]['segments'][0]['arrival_name'] # Время прилета
- price = num['prices'][0]['total_amount'] # Цена, самая низкая из доступных
- city_name_to = num['legs'][0]['segments'][0]['destination']['city_name'] # Город прилета
- city_name_from = num['legs'][0]['segments'][0]['origin']['city_name'] # Город вылета
- print price, reschr + rescode, resto # Вывод части информации в консоль
- self.document.write(('%-10s %s/%-20s %-25s %-15s %s/%-20s %-25s %s\n' %
- (reschr + rescode, city_name_from, resfrom, restfrom, restravel,
- resto, city_name_to, restto, price)).encode('cp1251')) # Запись в файл
- except IndexError: # Если структуры не найдено, то рейсов по данному запросу нет
- print 'Flights not found'
- self.document.write('\n\nFlights not found!\n\n')
- def search(self): # Поиск собирается тут
- self.document = open('ResultAero.txt', 'w') # Открывает файл для записи
- self.correct_input_info() # Ввод данных
- self.check_input() # Проверка городов
- self.document.close() # Запись в файл закончилась
- if __name__ == '__main__':
- first = Aeroflot()
- first.search()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement