Не удается очистить 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 у меня работает хорошо, независимо от безопасности.

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