我使用Beautifulsoup和Python根据输入的日期和时间变量,尝试并从下面网站上的图表中提取每小时定价。
该图表位于此网站上:https://coinmarketcap.com/currencies/bitcoin/
图表的工作方式是,当您沿着价格线移动鼠标时,它会更改在右上角设置的给定日期范围内的日期,时间和价格。当我查看源代码时,我能够分辨出这些细节的存储位置,但随着鼠标在图表中的移动,细节会发生变化。
我的问题是,是否可以传递日期和时间变量并从此图表中返回价格,或者它是否在源代码中动态更改值这一事实使得这不可能?
我的意思的一个例子:
我会有以下变量
Date: 2017-12-15
Time: 04:49:51
我会用这些来搜索图表中的相应价格。
下面是鼠标沿图表移动时代码部分的图片:
我想我可以管理如何以编程方式更改图表的日期范围,但我不知道如何设法抓住特定的时间,因为没有办法将其传递给在图表上移动鼠标。安迪的想法?
答案 0 :(得分:1)
此处无需使用BeautifulSoup
或selenium
,您可以直接从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