互联网上海量的加密货币数据是进一步进行加密货币投资研究的丰富资源。拥有管理和利用这些数据的能力将使我们在加密投资方面具有优势。
网页抓取是指从网站下载数据并从这些数据中提取有价值的信息的过程(因此得名抓取)。出于我们的目的,我们对网页抓取加密货币数据感兴趣。
在本系列文章中,我们将从概念开始,并在此基础上慢慢构建。到最后,网页抓取加密货币数据应该成为你的第二天性!
网页抓取是一项重要的技能。通过收集和分析来自多个来源的数据,我们可以提高我们的投资情报。
既然有这么多网站提供免费的工具,为什么还会有人想要收集你自己的数据呢?大多数用户将使用网站,如CoinMarketCap, CoinGecko, Live Coin Watch来获取他们的数据并建立他们的观察名单。那样不是更方便吗?
在我看来,我们应该两者都用,从新手(使用典型加密网站的标准功能)到我们自己的数据分析(网页抓取和构建我们自己的智能数据)。
根据我的经验,发现了以下好处:
例如,当我们在电子表格中拥有数据时,我们可以在Solana和游戏中搜索币:
过滤我们的数据与包含这两个标签 索拉纳 和 游戏
有两种币符合此标准:ATLAS 和 POLIS。我们来自网页抓取的数据集还将包含更多投资研究的附加信息(市值、网站、推特链接等)
寻找既适用于polkadot又适用于游戏的币怎么样:
四种币在 Polkadot 和 Gaming 中:EFI、SAITO、RING、CHI
作为比较,大多数网站只支持一级过滤。例如,CoinMarketCap可以列出Polkadot生态系统中的所有币:
CoinMarketCap也可以列出所有游戏代币,但不能同时列出Polkadot和游戏。
一般来说,这些网站不能超过两个或三个级别的过滤,例如列出所有与Polkadot相关的游戏币。
从表面上看,高级过滤似乎不是一个大问题,但市场上有成千上万的币,拥有这种自动化的能力并保持我们的专注是成功的关键。
我们将在Python中使用两个库:
我也在谷歌云平台上使用Jupyter Notebook来运行,但是下面的Python代码可以在任何平台上运行。
根据各自的Python设置,可能需要pip install beautifulsoup4。
我们将从网页抓取的“Hello World”开始,通过抓取什么是币安币(BNB)的介绍文本,如下面的绿色框所示。
访问BNB页面与你的Chrome浏览器,然后右键单击页面,然后单击检查以检查元素:
点击屏幕中间的小箭头,然后点击相应的网页元素,如下图所示。
从检查,我们看到网页元素是
from bs4 import BeautifulSoupimport requestsmainpage = requests.get('https://coinmarketcap.com/currencies/binance-coin/')soup = BeautifulSoup(mainpage.content, 'html.parser')whatis = soup.find_all("div", {"class" : "sc-2qtjgt-0 eApVPN"})title = whatis[0].find_all("h2")print(title[0].text.strip() + "\n")for p in whatis[0].find_all('p'):
print(p.text.strip() + "\n")
在这个例子中,我们将使用BNB的统计数据,即市值、完全稀释市值、成交量(24小时)、流通供应量、成交量/市值。
在相同的BNB币页面上,去页面的顶部,点击Market Cap的网页元素。观察整个区块被调用
每个统计数据都有类型:
我们要找到
这将检索五个统计数字。(由于加密货币是 24x7 交易,这些数字一直在变化,与之前的屏幕截图略有不同。)
statsContainer = soup.find_all("div", {"class" : "hide statsContainer"})statsValues = statsContainer[0].find_all("div", {"class" : "statsValue"})statsValue_marketcap = statsValues[0].text.strip()print(statsValue_marketcap)statsValue_fully_diluted_marketcap = statsValues[1].text.strip()print(statsValue_fully_diluted_marketcap)statsValue_volume = statsValues[2].text.strip()print(statsValue_volume)statsValue_volume_per_marketcap = statsValues[3].text.strip()print(statsValue_volume_per_marketcap)statsValue_circulating_supply = statsValues[4].text.strip()
print(statsValue_circulating_supply)
输出如下(结果随时间变化,价格随时间变化)。
$104,432,294,030 $104,432,294,030 $3,550,594,245 0.034 166,801,148.00 BNB
作为练习,使用前两个部分的知识并检查是否可以为BNB和ADA (Cardano)提取最大供应和总供应的数据。
其他替代品有Scrapy和Selenium。
Scrapy和Selenium比用于获取HTML数据的Request和用作HTML解析器的BeautifulSoup有更陡峭的学习曲线。
任何网页抓取的主要挑战是代码的寿命。CoinMarketCap等网站的开发人员正在不断更新他们的网站,旧代码可能在一段时间后就不能工作了。
一个可能的解决方案是使用各种网站和平台提供的应用程序编程接口(API)。然而,API的免费版本是有限的。使用API时,数据的格式不同于通常的网页抓取,即JSON或XML,而在标准的网页抓取中,我们主要处理的是HTML格式的数据。