Не удается очистить dataid от Morningstar - Как получить доступ к инструменту проверки сети из Python?
Я пытаюсь очистить Morningstar.com, чтобы получить финансовые данные и цены каждого фонда, доступные на сайте. К счастью, у меня нет проблем с очисткой финансовых данных (авуары, распределение активов, портфель, риск и т. Д.), Но когда нужно найти URL-адрес, на котором размещены ежедневные цены в формате JSON для каждого фонда, существует значение "dataid" это недоступно в коде HTML, и без него невозможно узнать точный URL-адрес, на котором размещены все цены.
Я пытался напечатать всю страницу в виде текста для многих фондов, и ни один из них не показывает в коде HTML значение "dataid", которое мне нужно для получения цены. URL-адрес, на котором размещены цены, также включает в себя "secid", который очень легко поддается очистке, но не имеет никакого отношения к "dataid", который мне нужно очистить.
import requests
from lxml import html
import re
import json
quote_page = "https://www.morningstar.com/etfs/arcx/aadr/quote.html"
prices1 = "https://mschart.morningstar.com/chartweb/defaultChart?type=getcc&secids="
prices2 = "&dataid="
prices3 = "&startdate="
prices4 = "&enddate="
starting_date = "2018-01-01"
ending_date = "2018-12-28"
quote_html = requests.get(quote_page, timeout=10)
quote_tree = html.fromstring(quote_html.text)
security_id = re.findall('''meta name=['"]secId['"]\s*content=['"](.*?)['"]''', quote_html.text)[0]
security_type = re.findall('''meta name=['"]securityType['"]\s*content=['"](.*?)['"]''', quote_html.text)[0]
data_id = "8225"
daily_prices_url = prices1 + security_id + ";" + security_type + prices2 + data_id + prices3 + starting_date + prices4 + ending_date
daily_prices_html = requests.get(daily_prices_url, timeout=10)
json_prices = daily_prices_html.json()
for json_price in json_prices["data"]["r"]:
j_prices = json_price["t"]
for j_price in j_prices:
daily_prices = j_price["d"]
for daily_price in daily_prices:
print(daily_price["i"] + " || " + daily_price["v"])
Приведенный выше код работает для ETF "AADR" только потому, что я вручную скопировал и вставил значение "dataid" в переменную "data_id", и без этой информации невозможно получить доступ к ежедневным ценам. Я не хотел бы использовать Selenium в качестве альтернативы для поиска "dataid", потому что это очень медленный инструмент, и я намереваюсь собрать данные для более чем 28 000 средств, поэтому я попробовал только методы веб-очистки. Есть ли у вас какие-либо предложения о том, как получить доступ к инструменту проверки сети, который является единственным источником, который я обнаружил до сих пор, который показывает "dataid"? заранее спасибо
1 ответ
Идентификатор данных может быть не таким важным. Я изменил код F00000412E, связанный с AADR, сохранив идентификатор данных постоянным.
Я получил список всех этих кодов здесь:
https://www.firstrade.com/scripts/free_etfs/io.php
Затем добавьте код выбора в ваш URL, например
[
"AIA",
"iShares Asia 50 ETF",
"FOUSA06MPQ"
]
использование FOUSA06MPQ
https://mschart.morningstar.com/chartweb/defaultChart?type=getcc&secids=FOUSA06MPQ;FE&dataid=8225&startdate=2017-01-01&enddate=2018-12-30
Вы можете проверить значения, добавив другой фонд в качестве ориентира на график, например XNAS:AIA
28 декабря имеет значение 55,32. Сравните это с полученным JSON:
Я повторил это с
[
"ALD",
"WisdomTree Asia Local Debt ETF",
"F00000M8TW"
]
https://mschart.morningstar.com/chartweb/defaultChart?type=getcc&secids=F00000M8TW;FE&dataid=8225&startdate=2017-01-01&enddate=2018-12-30
Data Id 8217 у меня работает хорошо, независимо от безопасности.