python LXML通过xpath抓取价格



看,我需要这个加密货币的价格https://dex.guru/token/0x68848e1d1ffd7b38d103106c74220c1ad3494afc-bsc使用下面的代码:

import lxml
import requests
from lxml import html
html = requests.get('https://dex.guru/token/0x68848e1d1ffd7b38d103106c74220c1ad3494afc-bsc')
doc = lxml.html.fromstring(html.content)
new_releases = doc.xpath('//div[@class="0.00047061210058486165"]/text()')[0]
print(new_releases)

但是我得到这个错误IndexError: list index out of range我知道它会抛出错误,因为列表是空的,但为什么列表是空的呢?请帮忙,我从刮痧开始。

我找到了一个解决方案(目前并不完美):

import cloudscraper
scraper = cloudscraper.create_scraper(delay=15, interpreter='nodejs')
url = "https://api.dex.guru/v2/tokens/price"
json = {"ids":
["0x68848e1d1ffd7b38d103106c74220c1ad3494afc-bsc",
"0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c-bsc"]}

headers = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0"}
resp = scraper.post(url, headers=headers, json=json)
# when it works
print(resp.json())

你需要安装'cloudscraper'包与一个js解释器(这里我使用nodejs)。这段代码有时返回数据失败,有时返回数据。我将调查一下为什么会观察到这种不稳定性。

当它工作时,它返回:

{'total': 2,
'data': [{'address': '0x68848e1d1ffd7b38d103106c74220c1ad3494afc',
'token_price_usd': 0.0003694899811954059,
'token_price_eth': 5.0304271359669745e-06},
{'address': '0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c',
'token_price_usd': 481.9784105344807,
'token_price_eth': 6.533152208208108}]}

可以通过设置会话和保存cloudflare生成的临时cookie来构建更好的代码(请阅读'cloudflare' doc)。

请注意,当他们的官方API发布时,我们更愿意使用它。

如果你把这种代码放在没有sleep()控制的循环中,cloudflare可能会禁止你。

最新更新