Эффективный мониторинг цен на акции в Yahoo Finance

В настоящее время я пытаюсь получить цены на акции в реальном времени, используя библиотеку BeautifulSoup и Requests с веб-сайта Yahoo Finance. В настоящее время я обнаружил, что узким местом для скорости является то, что запрос веб-страницы занимает в среднем около 0,5 секунды. Ниже мой код и вывод

from bs4 import BeautifulSoup, SoupStrainer
import requests
import time

# transform percent text into numerical (float) value
def process_percent_change(percent_text):
    processed_text = []
    for c in percent_text:
        if c == '.' or c == '+' or c == '-' or  c.isdigit():
            processed_text.append(c)
    if processed_text[0] == '-':
        return -float("".join(processed_text[1:]))
    else:
        return float("".join(processed_text[1:]))


# parse most current ticker data from beautiful soup object
def get_current_data():
    # define the page to be parsed for data
    spy_link = "https://finance.yahoo.com/quote/SPY?p=SPY&.tsrc=fin-srch" # yahoo finance link to SPY etf info
    webpage_start = time.time()
    page = requests.get(spy_link).text
    webpage_end = time.time()

    webpage_time = webpage_end-webpage_start
    print("webpage get time: {}".format(webpage_time))

    parse_start = time.time()
    strainer = SoupStrainer('div', attrs = {'data-reactid': '30'}) # only get relevant div info
    data_element = BeautifulSoup(page, 'lxml', parse_only=strainer)

    current_data = {}

    # store current data inside a dictionary
    current_data["current_price"] = float(data_element.find('span', attrs = {"data-reactid": "32"}).text)
    change = data_element.find('span', attrs = {"data-reactid": "33"}).text.split()
    current_data["value_change"] = float(change[0])
    current_data["percent_change"] = process_percent_change(change[1])
    parse_end = time.time()

    parse_time = parse_end-parse_start

    print("parse time: {}".format(parse_time))
    # return data to be used
    return current_data

if __name__ == "__main__":
    current_data = get_current_data()
webpage get time: 0.42667412757873535
parse time: 0.05974388122558594

Я хочу либо ускорить запрос, либо найти более эффективный способ отслеживания изменений на веб-сайте. Я заметил, что после загрузки веб-сайта в моем браузере цена изменится без обновления страницы. Вот пример gif для того, что я имею в виду: https://media.giphy.com/media/nZmbqDeu7rWT2vmrks/giphy.gif

Вот ссылка на конкретную финансовую страницу Yahoo: https://finance.yahoo.com/quote/SPY?p=SPY&.tsrc=fin-srch

Есть ли способ отслеживать цену акций, например, в примере с gif/веб-браузером? Если нет, есть ли способ ускорить запросы (без покупки более быстрого соединения)?

Любая помощь приветствуется.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
302
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это кажется разумным временем для того, что вы делаете (загрузка и анализ веб-страницы).

На самом деле я думаю, что 0,4 с должно быть достаточно для мониторинга, но если вам действительно нужна более высокая частота обновления (т.е. у вас есть какой-то новый сумасшедший торговый алгоритм), вы можете:

  • Попробуйте разобрать более легкую страницу. (Но вам нужно найти его!)

  • Создайте пул потоков, выполняющих множество запросов одновременно. Обратите внимание, что такое поведение может привести к нарушению Условий использования Yahoo, и могут быть применены ограничения на вашу учетную запись/IP-адрес.

  • Используйте любой рыночный API (бесплатный или платный), чтобы избежать загрузки всей веб-страницы и всех ее зависимостей, когда вы можете просто получить что-то вроде 20-байтного сообщения json (или аналогичного). Также в этом случае вы должны прочитать о максимальной частоте объединения, которую вы можете использовать.

  • Используйте Selenium и выполните всего 1 подключение к веб-странице. Когда вы обнаружите какие-либо изменения в интересующем вас div, вы получите обновленное значение.

Другие вопросы по теме