如何解析Etherscan?

时间:2018-02-19 16:21:50

标签: python parsing

如何解析来自https://etherscan.io/token/generic-tokenholders2?a=0x6425c6be902d692ae2db752b3c268afadb099d3b&s=0&p=1的eth地址的每一页?然后将其添加到.txt。

1 个答案:

答案 0 :(得分:2)

好吧,可能是偏离主题的,但我玩这个。 (主要是因为我认为以后我可能需要使用类似的东西来获取Etherscan的API不会返回...)

以下Python2代码将抓住您之后的内容。在那里有一个hacky睡眠来解决我认为与页面加载速度有关的问题,或者是Etherscan强加的速率限制。我不确定。

数据被写入.csv文件 - 文本文件不会很有趣。

#!/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')
    return [[X.text.strip() for X in row.find_all('td')] for row in table.find_all('tr')]

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)

            # Even pages that don't contain the data we're
            # after still contain a table.
            if len(data) < 4:
                break
            else:
                for row in data:
                    wr.writerow(row)
                time.sleep(1)

if __name__ == "__main__":
    main()

我确定它不是世界上最好的Python。