Ether
用於收集頂級代幣持有者列表的 API
我從事乙太坊項目,我想收集前 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()