通过 Python 抓取看似嵌入在 Javascript 中的区块链数据,这是否是正确的方法?

问题描述

我引用了这个网址: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 和类似工具将无法查看您尝试抓取的特定内容。

但是,如果您记录浏览器的网络流量,您可以看到一些 (XHR) HTTP GET 请求正在向 REST API 发出,该 API 以 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
>>>