Ether

用於收集頂級代幣持有者列表的 API

  • June 2, 2021

我從事乙太坊項目,我想收集前 X(例如 20 個)乙太坊賬戶的列表。這將類似於 etherscan.io ( https://etherscan.io/accounts )

是否有執行此操作的 API?如果沒有,是否有人知道實現此目的的方法。我很好奇 etherscan 是如何做到這一點的。我查看了他們的結果,沒有任何端點表現得像它。

我也想為其他 ERC20 代幣這樣做。

我不知道有任何 API 可以實現您想要的。

如果沒有,有人知道實現此目的的方法嗎?

這是一些相當愚蠢的 Python 程式碼,它們會抓取該頁面並將其寫入.csv文件:

#!/usr/bin/env python

import requests
from bs4 import BeautifulSoup
import csv

URL = "https://etherscan.io/accounts"
resp = requests.get(URL)
sess = requests.Session()
soup = BeautifulSoup(sess.get(URL).text, 'html.parser')

with open('output.csv', 'wb') as f:
   wr = csv.writer(f, quoting=csv.QUOTE_ALL)
   wr.writerow(map(str, "Rank Address Balance Percentage TxCount".split()))

   for tr in soup.find_all('tr'):
       tds = tr.find_all('td')
       rows = [0] * len(tds)
       for i in xrange(len(tds)):
           rows[i] = tds[i].get_text()

       try:
           wr.writerow(rows)
       except:
           # The page contains another table that we're
           # not worried about but which contains special 
           # characters...
           pass

我很好奇 etherscan 是如何做到這一點的。

可能是通過解析狀態數據並創建它們自己的內部表示。然後,這將允許他們以他們喜歡的任何方式操縱和呈現它。

我也想為其他 ERC20 代幣這樣做。

這是一個稍微複雜一點的腳本(我前段時間寫的),它列出了與給定代幣合約相關的所有地址和余額 - 按排名順序 - 跨多個 Etherscan 頁面。您可以隨意使用它來滿足您的需求。(目前有一個範例合約地址被硬編碼到其中。)

#!/usr/bin/env python

from __future__ import print_function
import os
import requests
from bs4 import BeautifulSoup
import csv
import time

RESULTS = "results.csv"
URL = "https://etherscan.io/token/generic-tokenholders2?a=0x6425c6be902d692ae2db752b3c268afadb099d3b&s=0&p="

def getData(sess, page):
   url = URL + page
   print("Retrieving page", page)
   return BeautifulSoup(sess.get(url).text, 'html.parser')

def getPage(sess, page):
   table = getData(sess, str(int(page))).find('table')
   try:
       data = [[X.text.strip() for X in row.find_all('td')] for row in table.find_all('tr')]
   except:
       data = None
   finally:
       return data

def main():
   resp = requests.get(URL)
   sess = requests.Session()

   with open(RESULTS, 'wb') as f:
       wr = csv.writer(f, quoting=csv.QUOTE_ALL)
       wr.writerow(map(str, "Rank Address Quantity Percentage".split()))
       page = 0
       while True:
           page += 1
           data = getPage(sess, page)

           if data == None:
               break
           else:
               for row in data:
                   wr.writerow(row)
               time.sleep(1)

if __name__ == "__main__":
   main()

引用自:https://ethereum.stackexchange.com/questions/41684