文章目录
- 写在前面
- 实验环境
- 实验描述
- 实验内容
- 写在后面
写在前面
本期内容:基于requests爬取比特币信息并绘制价格走势图
下载地址:https://download.csdn.net/download/m0_68111267/88734451
实验环境
- anaconda丨pycharm
- python3.11.4
- requests
安装requests库的命令:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
实验描述
- 学习网络爬虫相关技术,熟悉爬虫基本库requests的使用。
- 熟悉网络爬虫相关基础知识。
实验内容
1. 尝试爬取网站数据
编写实例文件"bt01.py", 抓取网站中BTC和ETH的报价数据并打印输出BTC和ETH的实时价格:
程序设计
"""
作者:Want595
微信号:Want_595
公众号:Want595
"""
import requests
def price(symbol, comparison_symbols=['USD'], exchange=''):
url = 'https://min-api.cryptocompare.com/data/price?fsym={}&tsyms={}' \
.format(symbol.upper(), ','.join(comparison_symbols).upper())
if exchange:
url += '&e={}'.format(exchange)
print(url)
page = requests.get(url)
data = page.json()
return data
print("当前BTC的美元价格为:" + str(price('BTC')))
print("当前ETH的美元价格为:" + str(price('ETH')))
程序分析
这段代码使用了Python的requests库来获取加密货币的价格信息。它定义了一个名为price的函数,该函数接受一个代币符号作为参数,并可选地接受比较货币符号列表和交易所名称。
函数的逻辑是先构建一个url,然后使用requests库发送GET请求获取到加密货币的价格数据。该url使用了Cryptocompare的API,通过拼接符号和比较货币来构建特定的API请求。
在主函数中,它使用price函数分别获取了BTC和ETH的美元价格,然后将结果打印出来。
要对这段代码进行详细分析,可以从以下几个方面入手:
-
函数的参数和返回值:函数接受一个代币符号作为参数,可选地接受比较货币符号列表和交易所名称。它返回一个包含价格信息的字典对象。
-
API请求:函数构建了一个特定的API请求url,然后使用requests库发送GET请求获取到加密货币的价格数据。这个请求使用了Cryptocompare的API,可以根据代币符号和比较货币获取实时价格信息。
-
数据解析和处理:函数获取到API返回的数据后,使用json()方法将其转换为Python字典对象。然后,将价格信息提取出来并返回。
-
主函数的使用:主函数调用了price函数来获取BTC和ETH的美元价格,并将结果打印出来。
总体来说,这段代码是一个简单的加密货币价格获取程序。它使用了Cryptocompare的API来获取实时价格数据,并将结果返回。可以根据需要进一步扩展和修改该代码,以适应更多的加密货币和交易所。
运行结果
2. 简单绘制一下比特/美元价格曲线
编写实例文件"bt02.py", 使用matplotlib库绘制比特/美元的价格曲线:
程序设计
"""
作者:Want595
微信号:Want_595
公众号:Want595
"""
from bt01 import price
import datetime
import matplotlib.pyplot as plt
x = [0]
y = [0]
fig = plt.gcf()
fig.show()
fig.canvas.draw()
i = 0
while(True):
data = price('BTC')
i += 1
x.append(i)
y.append(data['USD'])
plt.ylim([0, 100000])
plt.title("BTC vs USD, Last Update is: " + str(datetime.datetime.now()))
plt.plot(x, y)
fig.canvas.draw()
plt.pause(10)
程序分析
这段代码是一个用于实时绘制比特币价格走势图的程序。它导入了一个名为price的函数,该函数在之前的代码中已经定义了,用于获取比特币的价格信息。同时,它还导入了一些必要的库,例如datetime和matplotlib.pyplot。
代码中定义了两个空列表x和y,用于存储时间和比特币价格。接下来,创建一个图形容器fig,并使用plt.gcf()方法初始化。然后,显示图形容器fig,并通过fig.canvas.draw()绘制空图。
使用一个while循环不断获取比特币的价格信息,并像之前一样调用price函数。然后,将时间和价格分别添加到x和y列表中。接下来,通过plt.ylim()设置y轴的范围,plt.title()设置图表标题,并使用plt.plot()方法绘制x和y的曲线。最后,使用fig.canvas.draw()绘制更新后的图形,并使用plt.pause()方法暂停10秒钟。
总体来说,这段代码可以不断获取比特币的实时价格,并以折线图的形式展示出来。通过不断更新图形容器,可以实时查看比特币价格的变化。可以根据需要调整代码中的参数,以适应不同的需求和交易所。
运行结果
3. 绘制BTC和ETH的历史价格曲线图
编写实例文件"bt03.py", 首先抓取网站中BTC和ETH的历史价格数据,然后使用matplotlib和pandas绘制BTC和ETH的历史价格曲线图:
程序设计
"""
作者:Want595
微信号:Want_595
公众号:Want595
"""
import requests
import datetime
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
def hourly_price_historical(symbol, comparison_symbol, limit, aggregate, exchange=''):
url = 'https://min-api.cryptocompare.com/data/histohour?fsym={}&tsym={}&limit={}&aggregate={}' \
.format(symbol.upper(), comparison_symbol.upper(), limit, aggregate)
if exchange:
url += '&e={}'.format(exchange)
print(url)
page = requests.get(url)
data = page.json()['Data']
df = pd.DataFrame(data)
df['timestamp'] = [datetime.datetime.fromtimestamp(d) for d in df.time]
return df
……请下载代码后查看哦
程序分析
这段代码是一个获取比特币和以太坊近期小时价格历史数据,并绘制折线图的程序。
首先,代码中定义了两个函数,hourly_price_historical和plotchart。hourly_price_historical函数用于获取指定货币对的历史小时价格数据,它接收参数symbol(货币符号)、comparison_symbol(对比货币符号)、limit(获取的小时数量)、aggregate(聚合参数,指定每个数据点的时间间隔)以及exchange(交易所,可选)。该函数首先构建了API请求的URL,并发送请求获取数据。然后,使用pandas库将返回的数据转换为DataFrame格式,并添加一个timestamp列,表示时间。最后,返回DataFrame。
plotchart函数用于绘制折线图,它接收参数axis(子图坐标轴)、df(包含价格数据的DataFrame)、symbol(货币符号)和comparison_symbol(对比货币符号)。该函数使用plot方法绘制数据中的close列(表示收盘价)与时间戳列(timestamp)。
在主程序中,首先调用hourly_price_historical函数获取比特币和以太坊的历史小时价格数据,分别存储在df1和df2中。然后,使用plt.subplots()创建一个包含两个子图的图形。接下来,调用plotchart函数分别绘制比特币和以太坊的折线图,并传入对应的数据和货币对信息。最后,调用plt.show()显示图形。
总体来说,这段代码可以获取指定货币对的历史小时价格数据,并以折线图的形式展示出来。通过使用pandas和matplotlib库,可以方便地处理和可视化数据,以便进行技术分析和趋势观察。可以根据需要调整代码中的参数,以获取不同货币对的历史价格数据。
运行结果
写在后面
我是一只有趣的兔子,感谢你的喜欢!