📜  Web Scraping CryptoCurrency 价格并使用Python将其存储在 MongoDB 中

📅  最后修改于: 2022-05-13 01:55:43.392000             🧑  作者: Mango

Web Scraping CryptoCurrency 价格并使用Python将其存储在 MongoDB 中

让我们看看如何使用Santiment API 获取以美元或 BTC 为单位的历史价格、交易量和市值,并将数据存储到 MongoDB 集合中。

Python是一种成熟的语言,并且在加密货币领域得到了大量使用。 MongoDB 是一个 NoSQL 数据库,在许多项目中与Python配对,这有助于保存从Python程序中检索到的详细信息。 PyMongo 是一个Python发行版,包含使用 MongoDB 的工具,它是一种非常方便的方式,可以从Python使用 MongoDB 轻松执行创建/更新/删除/读取操作。

让我们看看使用 Santiment 的 API 获取给定日期范围内的加密货币价格的代码

加密货币的几个例子是:

bitcoin
ethereum
ripple
bitcoin-cash
litecoin
eos
cardano
stellar
neo
iota
  1. 在 id 的位置,我们可以传递比特币/以太坊或以下代码可以解析并获取数据的任何加密货币名称
  2. 对于有效的加密货币名称,数据将被正确检索
  3. 需要给出 yyyy-mm-dd 模式中有效日期格式中的 from_date 和 to_date 有效日期。为便于理解,给出了需要 7 天的数据。我们也可以获得 1 个月前的数据。 API 调用可以获取给定日期范围内给定加密货币的数据,否则如果不可用(由于无效的加密货币名称/无效的日期范围规范),我们可以捕获错误
  4. 在下面的程序中,为了更容易理解,在“IndexCoins.idx”文件中取比特币和以太坊,因此在id的位置,它们被传递

例子 :

对于以下输入

对于API调用之上的比特币,返回数据如下

同样对于以太坊,我们也将获得价值

检索到的值必须存储在 MongoDB 中

由于我们将需要 7 天的数据,因此必须在循环中给出

在 MongoDB 中,_id 是可以通过 ObjectId() 获取的默认列。我们的流程有多行,其中每一行都通过“cryptocurrencyname”和“time”来标识。在我们的代码中,我们分别将其作为“id”和“time”。

首先创建“Col_santiment_Price”,其中包含 3 列,即 _id、id 和 time。然后在成功执行 API 调用后,对于 id 和时间,让 API 调用输出即(从 bitcoinprice.png 验证列名)'priceBtc'、'priceUsd'、'volume' 和 'marketcap' 循环更新。

Python中的代码实现

Python3
# importing the modules
from datetime import date, timedelta, datetime
from pymongo import MongoClient
import san
from bson.objectid import ObjectId
  
client = MongoClient('mongodb://localhost:27017/')
db1 = client.geeksforgeeks
data = {}
  
with open("IndexCoins.idx") as openfileobject:
    for line in openfileobject:
          
        # One by one File's cryptocurrency names are read
        id = line.strip() 
        try:
            print(id)
              
            # Collecting the data for 7 days and hence range(7) is taken
            for idx in range(7):
                daystr = str(date.today() - timedelta(days = idx))
  
                # Coll_santiment_Price collection documents need to be created
                # It will have columns namely "_id", "time", "id",
                # "priceBtc", "priceUsd", "volume", "marketcap"
                data['id'] = id
                data['time'] = daystr
  
                # _id column for unique key and can be generated by using ObjectId()
                data['_id'] = ObjectId()
                  
                # Initially create 3 columns in collection as rest of the
                # columns are updated after running santiment api call              
                db1.Coll_santiment_Price.insert(data) 
            try:
                # Santiment API call to get Cryptocurrency prices
                daa = san.get("prices/" + id,
                              from_date = "2020-08-20",
                              to_date = "2020-08-27",
                              interval = "1d")
                  
                # API call output and for bitcoin it is given in
                # https://media.geeksforgeeks.org/wp-content/uploads/20200827191739/bitcoinprice.png
                print(daa)
                  
            except:
                print("URL error")
                continue;                
  
            # 7 days output
            for idx in range(7):
                  
                daystr = str(date.today() - timedelta(days=idx))
  
                # API call output for the above chosen date
                row = daa.loc[daystr]
                  
                # priceBtc, priceUsd, volume and marketcap are
                # collected and stored in seperate variables
                priceBtc = row['priceBtc']
                priceUsd = row['priceUsd']
                volume = row['volume']
                marketcap = row['marketcap']
                print(id, daystr, priceBtc, priceUsd, volume, marketcap)
                try:
                    # Update the collection with above details against
                    # cryptocurrency id and time  i.e. bitcoin and 2020-08-27
                    db1.Coll_santiment_Price.update(
                        {'time': daystr, 'id': id},
                        {"$set": {"priceBtc": priceBtc,
                                  "priceUsd": priceUsd,
                                  "volume": volume,
                                  "marketcap": marketcap,
                                  }
                         },
                        upsert = True
                        )
                except Exception as e:
                    print(e)
        except:
            print("Error")


示例输出:(对于比特币)

示例输出:(对于以太坊)

用于获取价格的 Santiment API 调用在加密货币项目中得到了大量使用。由于我们正在获取历史数据,因此对于数据分析而言,这非常有用。此外,它可以免费访问,因此任何初学者级别的项目都可以毫无问题地使用它。价格变化不大,因此非常适合演示和小规模项目。