如何从晨星获取数据

2024-09-30 00:29:26 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我对网络抓取的世界还不熟悉,到目前为止,我只真正使用beautifulsoup从网站上抓取文本和图像。我想我会尝试从一张图上刮下一些数据点来测试我的理解,但我对此有点困惑

在检查了我想要提取的数据的元素之后,我看到了以下内容: <span id="TSMAIN">: 100.7490637</span> 问题是,我最初刮取数据点的想法是遍历某种包含所有不同数据点的id列表(如果有意义的话)

相反,似乎所有的数据点都包含在同一个元素中,值取决于光标在图形上的位置

我的问题是,如果我在特定元素中使用beautifulsoups find函数和type,属性为id=TSMAIN,我会得到一个none-type返回,因为我在猜测,除非我将光标放在实际图形上,否则那里不会显示任何内容

代码:

from bs4 import BeautifulSoup 
import requests
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"}
url = "https://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F0GBR050AQ&tab=13"
source=requests.get(url,headers=headers)
soup = BeautifulSoup(source.content,'lxml')
data = soup.find("span",attrs={"id":"TSMAIN"})
print(data)

输出

None

如何提取此图的所有数据点


Tags: 数据importid图形url元素typefind
1条回答
网友
1楼 · 发布于 2024-09-30 00:29:26

似乎可以从API中提取数据。唯一的问题是它返回的值是相对于有效负载中输入的开始日期的。它将开始日期的输出设置为0,然后后面的数字与该日期相关

import requests
import pandas as pd
from datetime import datetime
from dateutil import relativedelta

userInput = input('Choose:\n\t1. 3 Month\n\t2. 6 Month\n\t3. 1 Year\n\t4. 3 Year\n\t5. 5 Year\n\t6. 10 Year\n\n  >: ')
userDict = {'1':3,'2':6,'3':12,'4':36,'5':60,'6':120}


n = datetime.now()
n = n - relativedelta.relativedelta(days=1)
n = n - relativedelta.relativedelta(months=userDict[userInput])
dateStr = n.strftime('%Y-%m-%d')


url = 'https://tools.morningstar.co.uk/api/rest.svc/timeseries_cumulativereturn/t92wz0sj7c'

data = []
idDict = {
        'Schroder Managed Balanced Instl Acc':'F0GBR050AQ]2]0]FOGBR$$ALL',
        'GBP Moderately Adventurous Allocation':'EUCA000916]8]0]CAALL$$ALL',
        'Mixed Investment 40-85% Shares':'LC00000012]8]0]CAALL$$ALL',
        '':'F00000ZOR1]7]0]IXALL$$ALL',}


for k, v in idDict.items():
    payload = {
    'encyId': 'GBP',
    'idtype': 'Morningstar',
    'frequency': 'daily',
    'startDate':  dateStr,
    'performanceType': '',
    'outputType': 'COMPACTJSON',
    'id': v,
    'decPlaces': '8',
    'applyTrackRecordExtension': 'false'}
    
    
    temp_data = requests.get(url, params=payload).json()
    df = pd.DataFrame(temp_data)
    df['timestamp'] = pd.to_datetime(df[0], unit='ms')
    df['date'] = df['timestamp'].dt.date 
    df = df[['date',1]]  
    df.columns = ['date', k]
    data.append(df)         

final_df = pd.concat(
    (iDF.set_index('date') for iDF in data),
    axis=1, join='inner'
).reset_index()


final_df.plot(x="date", y=list(idDict.keys()), kind="line")

输出:

print (final_df.head(5).to_string())
         date  Schroder Managed Balanced Instl Acc  GBP Moderately Adventurous Allocation  Mixed Investment 40-85% Shares          
0  2019-12-22                             0.000000                               0.000000                        0.000000  0.000000
1  2019-12-23                             0.357143                               0.406784                        0.431372  0.694508
2  2019-12-24                             0.714286                               0.616217                        0.632422  0.667586
3  2019-12-25                             0.714286                               0.616217                        0.632422  0.655917
4  2019-12-26                             0.714286                               0.612474                        0.629152  0.664124
....

要获得这些ID,需要对请求进行一点调查。通过搜索这些,我能够找到相应的id值,并通过一点尝试和错误来找出值的含义

enter image description here

使用的那些“备用”ID。这些折线图从何处获取数据(在4请求中,请查看预览窗格,您将在其中看到数据

enter image description here

以下是最终输出/图表:

enter image description here

相关问题 更多 >

    热门问题