是否有可能用美丽的汤从动态图中提取数据?

时间:2018-01-21 04:34:42

标签: javascript python html web-scraping beautifulsoup

我使用Beautifulsoup和Python根据输入的日期和时间变量,尝试并从下面网站上的图表中提取每小时定价。

该图表位于此网站上:https://coinmarketcap.com/currencies/bitcoin/

图表的工作方式是,当您沿着价格线移动鼠标时,它会更改在右上角设置的给定日期范围内的日期,时间和价格。当我查看源代码时,我能够分辨出这些细节的存储位置,但随着鼠标在图表中的移动,细节会发生变化。

我的问题是,是否可以传递日期和时间变量并从此图表中返回价格,或者它是否在源代码中动态更改值这一事实使得这不可能?

我的意思的一个例子: 我会有以下变量 Date: 2017-12-15 Time: 04:49:51 我会用这些来搜索图表中的相应价格。

下面是鼠标沿图表移动时代码部分的图片:

enter image description here

我想我可以管理如何以编程方式更改图表的日期范围,但我不知道如何设法抓住特定的时间,因为没有办法将其传递给在图表上移动鼠标。安迪的想法?

1 个答案:

答案 0 :(得分:1)

此处无需使用BeautifulSoupselenium,您可以直接从api获取图表数据(通过检查网络流量找到)。

import requests

api_url = 'https://graphs2.coinmarketcap.com/currencies/bitcoin/'
r = requests.get(api_url)
json_data = r.json()

这将从2013年到现在获得主图表,每天一件。如果您想获得每天包含更多商品的较小零件,则必须指定开始日期和结束日期。

以下示例仅获取当月的价格,每天有96件商品。

import requests
from datetime import datetime

dt1 = int(datetime(2018, 1, 1, 0, 0, 0).timestamp() * 1000)
dt2 = int(datetime(2018, 1, 21, 0, 0, 0).timestamp() * 1000)
api_url = 'https://graphs2.coinmarketcap.com/currencies/bitcoin/{}/{}/'
r = requests.get(api_url.format(dt1, dt2))
json_data = r.json()

json_data是一个字典,用于保存四个键中的所有数据:'market_cap_by_available_supply''price_btc''price_usd''volume_usd'。每个键都映射到1714项的列表。每个项目都是两个项目的列表,时间戳和实际值。

所以现在我们可以创建一个新的字典,其中日期为键,价格为值。

from datetime import datetime

data = {}
for k,v in json_data.items():
    for i in v:
        t = str(datetime.fromtimestamp(i[0]/1000.0))
        if data.get(t):
            data[t][k] = '{:,}'.format(i[1])
        else:
            data[t] = {k: '{:,}'.format(i[1])}

您可以按日期访问价格,例如

print(data.get('2018-01-01 05:59:20'))

{'market_cap_by_available_supply': '231,350,986,890', 'price_btc': '1.0', 'price_usd': '13,791.6', 'volume_usd': '11,137,400,000'}

或者您可以选择特定项目,例如美元价格。

print(data.get('2018-01-01 05:59:20', {}).get('price_usd'))

13,791.6