我正在尝试爬取 Morningstar.com 以获取网站上可用的每个基金的财务数据和价格。幸运的是,我在抓取财务数据(持股、资产配置、投资组合、风险等)方面没有问题,但是当找到以 JSON 格式为每个基金提供每日价格的 URL 时,有一个“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"])
上面的代码只适用于“AADR”ETF,因为我手动将“dataid”值复制并粘贴到“data_id”变量中,如果没有这条信息,就无法访问每日价格。我不想使用 Selenium 作为查找“dataid”的替代方法,因为它是一个非常慢的工具,我的目的是为超过 28k 的资金抓取数据,所以我只尝试了机器人网络抓取方法。您对如何访问网络检查工具有任何建议,这是迄今为止我发现的唯一显示“dataid”的来源?提前致谢