суббота, 19 мая 2018 г.

Как быстро скачать котировки с IEX

Как быстро скачать котировки с IEX
# -*- coding: utf-8 -*-
import pycurl
import requests
import json
import time
import os

#def performMyMulti(tools_, time_frame = '1m'):
def performMyMulti(tools_, time_frame = '5y'):
    '''
    Функция многопоточного скачивания. Принимает на вход список
    кодов инструментов для скачивания. Количество инструментов в этом
    списке не должно превышать 100шт.
    '''
    m = pycurl.CurlMulti()
    m.handles = []
    files = [] # список файлов для сохранения результатов

    start_ = time.time() # замер времени для расчета скорости, начальная точка
    # создание и настройка curl-объектов
    for tool_ in tools_:
        c = pycurl.Curl()

        # имя файла для сохранения результатов; файлы сохраняются в каталог data
        fileName = "data%s%s_%s.txt" % (os.sep, tool_, time_frame)
        fileName = fileName.replace('*', '_')
        f = open(fileName, "wb")
        files.append(f) # файл добавляется в список, чтобы потом закрыть его
        c.setopt(c.WRITEDATA, f) # кроме файла здесь можно указывать функцию, но файл нам наиболее удобен
        url = "https://api.iextrading.com/1.0/stock/%s/chart/%s" % (tool_, time_frame)
        c.setopt(pycurl.URL, url)

        m.add_handle(c)
        m.handles.append(c)

    num_handles = len(m.handles)
    while num_handles:
        while 1:
            # выполнить запросы
            ret, num_handles = m.perform()
            if ret != pycurl.E_CALL_MULTI_PERFORM:
                break
        m.select(1.0)

    # очистка
    for c in m.handles:
        c.close()
        m.remove_handle(c)

    for f in files:
        f.close()

    m.close()
    del m.handles
    end_ = time.time() # замер времени для расчета скорости, конечная точка

    return len(tools_) / (end_-start_) # скорость в секунду

# скачиваем список инструментов
r = requests.get('https://api.iextrading.com/1.0/ref-data/symbols')
data = json.loads(r.text)
tools = [] #список кодов инструментов
# выбираем коды инструментов в отдельный массив
for tool in data:
    try:
        if tool['isEnabled'] is True:
            tools.append(tool['symbol'])
    except:
        continue

block = 80 #количество параллельных запросов (не более 100шт)

tools_count = len(tools)
print(u"Всего инструментов для скачивания: %d" % tools_count)
loops = tools_count / block # количество полных циклов (циклов по block запросов)
loops =int(loops)
print('loops = ', loops)
tail = tools_count % block # количество оставшихся запросов
tools_ok = 0 # общее количество выполненных запросов
start = time.time() # замер общего времени, начальная точка
for i in range(loops): # в цикле по всем полным циклам
    srez = tools[i*block:i*block+block:1] # формируем выборку из следующих block инструментов
    speed = performMyMulti(srez) # выполняем параллельное скачивание
    tools_ok += block
    print(u"готово %d из %d, скорость %f в сек" % (tools_ok, tools_count, speed))
if tail > 0: # "докачиваем" оставшиеся инструменты
    i += 1
    srez = tools[block*i:block*i+tail]
    speed = performMyMulti(srez)
    tools_ok += tail
    print(u"готово %d из %d, скорость %f в сек" % (tools_ok, tools_count, speed))
end = time.time() # замер общего времени, конечная точка
print(u"Всё скачали! Ушло %f сек" % (end-start))

Комментариев нет:

Отправить комментарий