Не удается очистить dataid от Morningstar - Как получить доступ к инструменту проверки сети из Python? - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь очистить Morningstar.com, чтобы получить финансовые данные и цены каждого фонда, доступные на сайте.К счастью, у меня нет проблем с очисткой финансовых данных (авуары, распределение активов, портфель, риск и т. Д.), Но когда нужно найти URL-адрес, на котором размещены ежедневные цены в формате JSON для каждого фонда, существует значение «dataid»который недоступен в коде HTML, и без него невозможно узнать точный URL, на котором размещены все цены.

enter image description here

Я пыталсяраспечатать всю страницу в виде текста для многих фондов, и ни один из них не показывает в коде HTML значение «dataid», которое мне нужно для получения цены.URL-адрес, на котором размещены цены, также включает в себя «secid», который очень легко поддается очистке, но не имеет никакого отношения к «dataid», который мне нужно очистить.

enter image description here

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 Ответ

0 голосов
/ 30 декабря 2018

Идентификатор данных может быть не таким важным.Я изменил код 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

enter image description here

28 декабря имеет значение 55,32.Сравните это с полученным JSON:

image

Я повторил это с

[
    "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
...