Webscraping 区块链数据看似嵌入 Javascript 到 Python,这是否是正确的方法?

Webscraping Blockchain data seemingly embedded in Javascript through Python, is this even the right approach?

我引用了这个 url:https://tracker.icon.foundation/block/29562412

如果您向下滚动到“交易”,它会显示 2 个带有单独链接的交易,这基本上就是我要抓取的内容。如果我尝试一个简单的 pd.read_csv(url) 命令,它显然忽略了我正在寻找的数据,所以我认为它可能是基于 JavaScript 并尝试了以下代码:

from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://tracker.icon.foundation/block/29562412')
r.html.links
r.html.absolute_links

我得到结果“set()” 尽管我期待以下内容:

['https://tracker.icon.foundation/transaction/0x9e5927c83efaa654008667d15b0a223f806c25d4c31688c5fdf34936a075d632', 'https://tracker.icon.foundation/transaction/0xd64f88fe865e756ac805ca87129bc287e450bb156af4a256fa54426b0e0e6a3e']

JavaScript 是正确的方法吗?我尝试了 BeautifulSoup,但在那一端也没有发现雪茄。

你是对的。此页面使用 JavaScript 异步填充,因此 BeautifulSoup 和类似工具将无法查看您尝试抓取的特定内容。

但是,如果您记录浏览器的网络流量,您可以看到正在向 REST API 发出一些 (XHR) HTTP GET 请求,它在 JSON 中提供其结果。这个 JSON 恰好包含您要查找的信息。它实际上向各种 API 端点发出了几个这样的请求,但我们感兴趣的是 txList (我猜是“交易列表”的缩写):

def main():

    import requests

    url = "https://tracker.icon.foundation/v3/block/txList"

    params = {
        "height": "29562412",
        "page": "1",
        "count": "10"
    }

    response = requests.get(url, params=params)
    response.raise_for_status()

    base_url = "https://tracker.icon.foundation/transaction/"

    for transaction in response.json()["data"]:
        print(base_url + transaction["txHash"])

    return 0


if __name__ == "__main__":
    import sys
    sys.exit(main())

输出:

https://tracker.icon.foundation/transaction/0x9e5927c83efaa654008667d15b0a223f806c25d4c31688c5fdf34936a075d632
https://tracker.icon.foundation/transaction/0xd64f88fe865e756ac805ca87129bc287e450bb156af4a256fa54426b0e0e6a3e
>>>