Не получается спарсить данные курсов валют
Пытаюсь сделать домашку,хочу вывести в консоль данные типа USD/RUB --> 69.47с сайта moex.com не могу понять почему не парсятся данные.
from bs4 import BeautifulSoup
import requests
class Parser:
raw_html = ''
html = ''
def __init__(self, url):
self.url = url
def get_html(self):
self.raw_html = requests.get(self.url)
self.html = BeautifulSoup(self.raw_html.content, 'html.parser')
def parsing(self):
charts = self.html.find_all('tr', class_='ng-scope')
for item in charts:
title = item.find('a', class_='ng-binding').get_text(strip=True)
value = item.find('strong', class_='price ng-binding').get_text(strip=True)
print(f'{title} --> {value}')
def run(self):
self.get_html()
self.parsing()
parser = Parser('https://www.moex.com/ru/data/')
parser.run()
Ответы (1 шт):
Автор решения: NykSu
→ Ссылка
Парсить не получается таким способом, потому что теги появляются только в браузере при работе JavaScripta.
Можно вычленить запросы JS к серверу, и уже парсить их. Такой запрос был найден на этой странице. Он возвращает JSON
Собственно с ним дальше и работаем (код):
import json
import requests
url = ("https://iss.moex.com/iss/engines/currency/markets/selt/securities.jsonp?"
"iss.only=securities,marketdata&"
"securities=CETS:USD000UTSTOM,CETS:EUR_RUB__TOM,CETS:CNYRUB_TOM,CETS:GBPRUB_TOM&"
"lang=ru&iss.meta=off&iss.json=extended&callback=angular.callbacks._gk")
data = requests.get(url)
# Обрежем лишнее (вызов функции и переводы строк)
text = data.text[22:len(data.text)-1:]
text = re.sub(r'\n', "", text)
json_string = json.loads(text)
for ss in json_string[1]['securities']:
print(f"Курс валюты {ss['SECNAME'].split(' - ')[1]}: {ss['PREVWAPRICE']} {ss['CURRENCYID']}")
print()
Получаем результат:
Курс валюты CNY/РУБ: 11.3687 RUB
Курс валюты EUR/РУБ: 89.6256 RUB
Курс валюты GBP/РУБ: 98.6188 RUB
Курс валюты USD/РУБ: 73.9989 RUB