В настоящее время я пытаюсь получить цены на акции в реальном времени, используя библиотеку 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/веб-браузером? Если нет, есть ли способ ускорить запросы (без покупки более быстрого соединения)?
Любая помощь приветствуется.
Это кажется разумным временем для того, что вы делаете (загрузка и анализ веб-страницы).
На самом деле я думаю, что 0,4 с должно быть достаточно для мониторинга, но если вам действительно нужна более высокая частота обновления (т.е. у вас есть какой-то новый сумасшедший торговый алгоритм), вы можете:
Попробуйте разобрать более легкую страницу. (Но вам нужно найти его!)
Создайте пул потоков, выполняющих множество запросов одновременно. Обратите внимание, что такое поведение может привести к нарушению Условий использования Yahoo, и могут быть применены ограничения на вашу учетную запись/IP-адрес.
Используйте любой рыночный API (бесплатный или платный), чтобы избежать загрузки всей веб-страницы и всех ее зависимостей, когда вы можете просто получить что-то вроде 20-байтного сообщения json (или аналогичного). Также в этом случае вы должны прочитать о максимальной частоте объединения, которую вы можете использовать.
Используйте Selenium и выполните всего 1 подключение к веб-странице. Когда вы обнаружите какие-либо изменения в интересующем вас div, вы получите обновленное значение.