Блог им. tomas_b88
ticker_list = {'gazp': 'GAZP.ME',
'sber': 'SBER.ME',
'tatn': 'TATN.ME',
'moex': 'MOEX.ME',
'rosn': 'ROSN.ME',
'lkoh': 'LKOH.ME',
'yndx': 'YNDX.ME',
'nlmk': 'NLMK.ME',
'alrs': 'ALRS.ME',
'rual': 'RUAL.ME',
'magn': 'MAGN.ME'} 
import requests from dpath.util import values as path_val
class Ticker:
# -------- URL запрос будет через открытие сессии
session = requests.session()
# -------- заголовки для URL запроса
headers = 'Mozilla/5.0 ' \
'(Windows NT 10.0; WOW64) ' \
'AppleWebKit/537.36' \
' (KHTML, like Gecko) ' \
'Chrome/91.0.4472.135 ' \
'Safari/537.36'
# -------- Запрашиваемые поля
value = {'price': 'regularMarketPrice',
'percent': 'regularMarketChangePercent',
'change': 'regularMarketChange',
'volume': 'regularMarketVolume'}# -------- конструктор
def __init__(self, name):
# -------- определим первоначальные значения
self.name = name
self.price = 0.00
self.change = 0.00
self.percent = 0.0
self.volume = 0.0def __get_update(self):
"""
Отправляет URL запрос, получает JSON
возвращает список со значениями float
"""
# -------- ссылка для URL запроса
link = f"https://query2.finance.yahoo.com/v10/" \
f"finance/quoteSummary/{self.name}?modules=price"# -------- отправляем запрос и получаем результат в response
response = self.session.get(link, headers={'User-Agent': self.headers})response теперь содержит в себе полученный массив данных. Для того чтобы с этим можно было работать запишем его в виде словаряarray = response.json()Данные получены, осталось только вытащить те поля, которые нам нужны. Объявим список return_value для наполнения его искомыми значениями.
# ---- создадим список, в который будут помещаться возвращаемые значения
return_value = []
# -------- перебором ключей словаря получим все нужные строки,
# и сконвертируем их в числа типа float
for key in self.value:
return_value.append(float(path_val(array, f"/**/{self.value[key]}/raw")[0]))
# -------- возвращаем список из всех элементов по ключам из value
return return_valuedef update(self):
"""
Устанавливает обновленные значения
полученные в результате работы _get_update
"""
# присвоим возвращенный кортеж из функции _ger_update
self.price, self.percent, self.change, self.volume = self.__get_update()from yahooparser import Ticker from prettytable import PrettyTable
# ----------------------------------------------------
# в этот словарь можно добавить любые бумаги
# после запуска скрипта создадутся объекты с
# именами по индексам
# ----------------------------------------------------
ticker_list = {'gazp': 'GAZP.ME',
'sber': 'SBER.ME',
'tatn': 'TATN.ME',
'moex': 'MOEX.ME',
'rosn': 'ROSN.ME',
'lkoh': 'LKOH.ME',
'yndx': 'YNDX.ME',
'nlmk': 'NLMK.ME',
'alrs': 'ALRS.ME',
'rual': 'RUAL.ME',
'magn': 'MAGN.ME'}
# ----------------------------------------------------def get_tickers(ticker_list):
"""
Создает экземпляры класса Ticker из полученного списка
:param ticker_list: получает список тикеров
:return: возвращает список с экземплярами класса Ticker
"""
tickers = []
for element in ticker_list:
name = ticker_list[element]
tickers.append(Ticker(name))
for name in range(len(tickers)):
tickers[name].update()
return tickers# -------- создаем объекты тикеров tickers = get_tickers(ticker_list)Далее эти объекты и данные из них, вы можете использовать как вашей душе угодно. Полет фантазии не ограничен.
def show_table():
"""
Демонстрация полученных данных в ходе работы скрипта
:return: ничего не возвращает
"""
# ----- считаем знрачения из класса в переменные
show_list = []
for ticker in tickers:
name = ticker.name
price = round(ticker.price, 2)
change = round(ticker.change, 2)
percent = round(ticker.percent * 100, 2)
volume = round(ticker.volume, 2)
# ----- создадим словарь со списком внутри
show_list.append({name: [price, change, percent, volume]})Данные отформатированы как нам нужно и теперь их можно распечатать# ----- простая табличка - очень крутая вещь
myTable = PrettyTable()
# ----- создаем заголовки таблицы
myTable.field_names = ["Name", "Price", "Change", "Perc. change", "Volume"]# ----- добавляем строки в таблицу
for string in show_list:
for key in string:
myTable.add_row([key, string[key][0], string[key][1], string[key][2], string[key][3]])
# печатаем таблицу с полученными значениями.
print(myTable)# -------- распечатаем для примера show_table(tickers)
import requests
from dpath.util import values as path_val
class Ticker:
# -------- URL запрос будет через открытие сессии
session = requests.session()
# -------- заголовки для URL запроса
headers = 'Mozilla/5.0 ' \
'(Windows NT 10.0; WOW64) ' \
'AppleWebKit/537.36' \
' (KHTML, like Gecko) ' \
'Chrome/91.0.4472.135 ' \
'Safari/537.36'
# -------- Запрашиваемые поля
value = {'price': 'regularMarketPrice',
'percent': 'regularMarketChangePercent',
'change': 'regularMarketChange',
'volume': 'regularMarketVolume'}
# -------- конструктор
def __init__(self, name):
# -------- определим первоначальные значения
self.name = name
self.price = 0.00
self.change = 0.00
self.percent = 0.0
self.volume = 0.0
def update(self):
"""
Устанавливает обновленные значения
полученные в результате работы _get_update
"""
# присвоим возвращенный кортеж из функции _ger_update
self.price, self.percent, self.change, self.volume = self.__get_update()
def __get_update(self):
"""
Отправляет URL запрос, получает JSON
возвращает список со значениями float
"""
# -------- ссылка для URL запроса
link = f"https://query2.finance.yahoo.com/v10/" \
f"finance/quoteSummary/{self.name}?modules=price"
# -------- отправляем запрос и получаем результат в response
response = self.session.get(link, headers={'User-Agent': self.headers})
# -------- получаем json массив
array = response.json()
# ---- создадим список, в который будут помещаться возвращаемые значения
return_value = []
# -------- перебором ключей словаря получим все нужные строки,
# и сконвертируем их в числа типа float
for key in self.value:
return_value.append(float(path_val(array, f"/**/{self.value[key]}/raw")[0]))
# -------- возвращаем список из всех элементов по ключам из value
return return_value
from yahooparser import Ticker
from prettytable import PrettyTable
def get_tickers(ticker_list):
"""
Создает экземпляры класса Ticker из полученного списка
:param ticker_list: получает список тикеров
:return: возвращает список с экземплярами класса Ticker
"""
tickers = []
for element in ticker_list:
name = ticker_list[element]
tickers.append(Ticker(name))
for name in range(len(tickers)):
tickers[name].update()
return tickers
def show_table(tickers):
"""
Демонстрация полученных данных в ходе работы скрипта
:return: ничего не возвращает
"""
# ----- считаем знрачения из класса в переменные
show_list = []
for ticker in tickers:
name = ticker.name
price = round(ticker.price, 2)
change = round(ticker.change, 2)
percent = round(ticker.percent * 100, 2)
volume = round(ticker.volume, 2)
# ----- создадим словарь со списком внутри
show_list.append({name: [price, change, percent, volume]})
# ----- эта простая табличка - очень крутая вещь
myTable = PrettyTable()
# ----- создаем заголовки таблицы
myTable.field_names = ["Name", "Price", "Change", "Perc. change", "Volume"]
# ----- добавляем строки в таблицу
for string in show_list:
for key in string:
myTable.add_row([key, string[key][0], string[key][1], string[key][2], string[key][3]])
# печатаем таблицу с полученными значениями.
print(myTable)
# ----------------------------------------------------
# в этот словарь можно добавить любые бумаги
# после запуска скрипта создадутся объекты с
# аналогичными именами, для которых будут запрошены
# значения, после чего их можно использовать или распечатать
# ----------------------------------------------------
ticker_list = {'gazp': 'GAZP.ME',
'sber': 'SBER.ME',
'tatn': 'TATN.ME',
'moex': 'MOEX.ME',
'rosn': 'ROSN.ME',
'lkoh': 'LKOH.ME',
'yndx': 'YNDX.ME',
'nlmk': 'NLMK.ME',
'alrs': 'ALRS.ME',
'rual': 'RUAL.ME',
'magn': 'MAGN.ME'}
# ----------------------------------------------------
# -------- создаем экземпляры класса
tickers = get_tickers(ticker_list)
# -------- распечатаем для примера
show_table(tickers)
response = self.session.get(link, headers={'User-Agent': self.headers})
array = response.json()
return_value = []
for key in self.value:
return_value.append(float(path_val(array, f"/**/{self.value[key]}/raw")[0]))
return return_value
Тут же я завернул это в нормальный доработанный подключаемый класс. и код по факту вырос до 40 строк. без комментов.