Advertisement
tokarevms

New - Library

Aug 18th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.83 KB | None | 0 0
  1. # coding: cp1251
  2. #  Скрипт для получения списка кодов IATA
  3. import requests
  4. from lxml import html
  5. import threading
  6. import Queue
  7.  
  8.  
  9. def request_for_iata_codes(url, mutex):    # Запрос на получение ряда трехбуквенных кодов IATA
  10.     global result
  11.     while not url.empty():
  12.         respond = requests.get(url.get())
  13.         parsed = html.fromstring(respond.text)
  14.         codes = parsed.xpath("//*[@id='block-system-main']/div/div/table/tbody/tr/td/div/span/a/text()")
  15.         mutex.acquire()
  16.         result += codes
  17.         mutex.release()
  18.  
  19.  
  20. def threads_starting(data, target, lock):    # Запусков нескольких потоков и ожидание обработки
  21.     threads = []
  22.     for x in xrange(12):
  23.         thread = threading.Thread(target=target, args=(data, lock))
  24.         thread.start()
  25.         threads.append(thread)
  26.     for thread in threads:
  27.         thread.join()
  28.  
  29.  
  30. def library_writing(url, mutex):    # Запросы по каждому коду IATA для сбора информации об аэропортах
  31.     global libdoc, i
  32.     while not url.empty():
  33.         respond = requests.get(url.get())
  34.         parsed = html.fromstring(respond.text)
  35.         root = parsed.xpath(".//*[@id='block-system-main']/div/div[1]/div")
  36.         rescity = root[0].xpath("./div[4]/div/p/text()")[0][2:].encode(coding)    # Город аэропорта
  37.         resname = root[0].xpath("./div[5]/div/p/text()")[0][2:].encode(coding)    # Название аэропорта
  38.         rescode = root[0].xpath("./div[6]/span/p/text()")[0][2:]    # Код IATA
  39.         result_string = '%-3s\t%-50s\t%-25s\t%-s\t\n' % (rescode, rescountry,
  40.                                                       rescity, resname)    # Формирование строки для библиотеки
  41.         mutex.acquire()
  42.         libdoc.write(result_string)
  43.         mutex.release()
  44.         i += 1
  45.         print i
  46.  
  47. if __name__ == '__main__':
  48.     result = []
  49.     data = Queue.Queue()
  50.     for x in xrange(97, 123):    # Формируется общая очередь адресов запросов
  51.         data.put('http://aeroportix.ru/kod-iata/' + chr(x))
  52.     lock = threading.Lock()
  53.     threads_starting(data, request_for_iata_codes, lock)    # Организация нескольких потоков
  54.  
  55.     i = 0    # Параметр, для отслеживания выполнения запросов и их обработки
  56.     coding = 'utf-8'    # Кодировка сайта
  57.     libdoc = open('Library.txt', 'w')
  58.     data_iata = Queue.Queue()    # Общая очередь запросво
  59.     for code in result:
  60.         data_iata.put('http://aeroportix.ru/aeroport/' + code.rstrip())
  61.     threads_starting(data_iata, library_writing, lock)
  62.     libdoc.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement