Захотелось реализовать несколько идей для быстрого расчета по позициям акций и для этого мне нужно было чтобы скрипт на
python постоянно получал обновленное значение цены. Например раз в три секунды. Искал решение и нашел похожий пример с парсингом любой информации в интернете на python с применением блиотек
requests и
beautiful soup, (bs4).
На примере
тикера GAZP продемонстрирую как можно спарсить текущий курс (например с гугла.)
Кому лень читать всё что я тут написал можно скопипастить полный код в конце статьи :)
Для начала нужно установить нужные библиотеки, в консоли пишем :
pip install requests bs4
Теперь перейдем к коду.
Импортируем то, что установилось. Также нам понадобится библиотека time для задержки запросов по времени.
import requests # для URL запроса
from bs4 import BeautifulSoup # для работы с HTML
import time # для установки задержки в цикле программы
Можно сразу задержку вынести в отдельную переменную, для экспериментов.
sleep = 3 # время задержки
Идем на сайт гугл финансы и копируем ссылку,
Ссылка помещается в переменную
GAZP
(для удобства читаемости кода я переносил строку ссылки через "\".)
# ссылка на тикер (Я использовал сайт google finance)
GAZP = "https://www.google.com/" \
"finance/quote/" \
"GAZP:MCX?sa=X&ved=2ahUKEwjK5-z-yJLyAhUhpIsKHXbMBh0Q_AUoAXoECAEQAw"
Для формирования
URL запроса нам потребуются заголовки
my user agent, чтобы запрос не был воспринят гуглом как БОТ- запрос.
Эту строчку можно получить набрав в гугле поисковый запрос my user agent и скопировать то что будет сверху
Сохраняем эту строку в переменную
headers
# заголовки для URL запроса.(добавляется к ссылке при URL запросе)
headers = {
'user agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/91.0.4472.135 Safari/537.36"}
Теперь у нас есть всё для того чтобы сформировать запрос. Результат запроса помещается в переменную, которая будет содержать всю
HTML разметку данной страницы.
# запрашиваем страницу по ссылке и помещаем в переменную html
html = requests.get(GAZP, headers)
Воспользуемся библиотекой
BeautifulSoup чтобы спарсить все тэги из
html, который был получен строчкой выше.
# парсим данные в переменную soup
soup = BeautifulSoup(html.content, 'html.parser')
Воспользуемся фильтром и найдем все тэги с признаком, который нам нужен. Для того, чтобы понять, какие именно тэги нужно искать, в браузере можно воспользоваться инструментами разработчика, чтобы посмотреть
html разметку нужного элемента. В нашем случае наводим курсор мыши на цену бумаги, кликаем правой кнопкой и выбираем исследовать элемент, посмотреть код элемента или что-то в этом роде.
Мы видим что наш объект помещен в тэг
div с признаком
class=«YMlKec fxKbKc» вот по этому признаку и найдем интересующий нас фрагмент страницы. Результат поиска записываем в переменную
convert
# находим интересующий нас тэг с текущей ценой акции
# (В браузере используем просмотр кода элемента для того чтобы найти это значение)
convert = soup.findAll('div', {'class': 'YMlKec fxKbKc'})
После того как мы получили нужную нам строчку берем её первый элемент (первый считается с индексом
[0]) и записываем полученную строку в переменную
price. Но нужно еще сделать пару преобразований. Если мы распечатаем значение
price то напечатается строка вида
₽286.05
Для начала избавимся от символа рубля в начале строки срезом этой строки
[1:]
И также нам нужно конвертировать эту строку в число в формате
float, так как сейчас она является текстом.
# считываем 1й элемент как текст.
# Делаем срез и избавляемся от знака ₽ в начале строки,
# конвертируем строку в число типа float
price = float(convert[0].text[1:])
Теперь мы можем работать с полученным значением. price :)
Для проверки выведем на печать
print("Цена акции Газпром: ", price)
Создадим функцию
update_ticker(): и поместим туда весь код, который мы написали выше. В конце функции укажем задержку по времени. Воспользуемся функцией
sleep библиотеки
time и передадим ей одноименный аргумент
sleep, который мы объявили вначале программы.
Для того чтобы функция повторялась вызовем её повторно прямо из этой же функции .
# устанавливаем задержку
time.sleep(sleep)
update_ticker() # вызываем эту же функцию снова
Можно сделать и по другому, но это не боевой вариант а прототип, демонстрирующий возможности парсера с повторением запроса по таймеру.
Функция готова и чтобы всё заработало вызываем её один раз в начале программы. Далее она вызывает сама себя с интервалом в sleep, 3 секунды.
Полный код этого примера :
import requests # для URL запроса
from bs4 import BeautifulSoup # для работы с HTML
import time # для установки задержки в цикле программы
sleep = 3 # время задержки
def update_ticker():
# ссылка на тикер (Я использовал сайт google finance)
GAZP = "https://www.google.com/" \
"finance/quote/" \
"GAZP:MCX?sa=X&ved=2ahUKEwjK5-z-yJLyAhUhpIsKHXbMBh0Q_AUoAXoECAEQAw"
# заголовки для URL запроса.(добавляется к ссылке при URL запросе)
headers = {
'user agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/91.0.4472.135 Safari/537.36"}
# запрашиваем страницу по ссылке и помещаем в переменную html
html = requests.get(GAZP, headers)
# парсим данные в переменную soup
soup = BeautifulSoup(html.content, 'html.parser')
# находим интересующий нас тэг с текущим курсом
# (В браузере используем просмотр кода элемента для того чтобы найти это значение)
convert = soup.findAll('div', {'class': 'YMlKec fxKbKc'})
# считываем 1й элемент как текст.
# Делаем срез и избавляемся от знака ₽ в начале строки,
# конвертируем строку в число типа float
price = float(convert[0].text[1:])
print("Цена акции Газпром: ", price)
# устанавливаем задержку
time.sleep(sleep)
update_ticker() # вызываем эту же функцию снова
update_ticker()
если уж хочется, то лучше разобрать xml с yahoo finance.
Вот первая ссылка.
support.google.com/docs/answer/3093281?hl=ru
попробую использовать :)
Что касается pandas, то через библиотеку можно выгружать csv данные по инструментам через moex api. Но там придется много обработок делать.
Тут сравнил два способа smart-lab.ru/blog/713434.php
Написал пример ТУТ