Вебскрейпинг данных блокчейна, по-видимому, встроенных в Javascript через Python, это вообще правильный подход?

#javascript #python #blockchain #python-requests-html

#javascript #python #блокчейн #python-запросы-html

Вопрос:

Я ссылаюсь на этот 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 и не нашел сигары на этом конце.

Ответ №1:

Вы правы. Эта страница заполняется асинхронно с использованием JavaScript, поэтому BeautifulSoup и подобные инструменты не смогут увидеть конкретный контент, который вы пытаетесь очистить.

Однако, если вы регистрируете сетевой трафик своего браузера, вы можете увидеть, что некоторые (XHR) HTTP GET-запросы отправляются в REST 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
>>>