【问题标题】:python lxml scrape price by xpathpython lxml通过xpath刮价格
【发布时间】:2021-10-24 05:12:43
【问题描述】:

看我需要这种加密货币的价格 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 我知道它会引发错误,因为列表是空的,但为什么列表是空的? 请帮忙,我从刮痧开始。

【问题讨论】:

  • 页面内容由 JavaScript 生成。 lxml 不是网络浏览器,因此您可能需要 Selenium (selenium.dev) 之类的东西。
  • 是的,@mzjn 是对的,这个网站也是 cloudflare 保护的。
  • @ce.teuf 您如何找出受 Cloudflare 保护的网站?那个网站呢?poocoin.app/tokens/0x68848e1d1ffd7b38d103106c74220c1ad3494afc我只需要硬币的价格。
  • @AntonEitenbichler 当您转到 F12-> Network-> XHR 时,您可以看到一个 POST 请求,该请求返回您要查找的价格。但在标头响应中,您可以看到:“server : cloudflare”。我做了一些尝试,它带回了一个 403 页面(在 cloudflare 页面上有一个重定向:“这是一个受 cloudflare 保护的服务......你的 IP :......”或类似的东西)。
  • @AntonEitenbichler 我相信您需要找到一个允许 api 调用的站点。仅供参考,DexGuru 说:docs.dex.guru/api

标签: python web-scraping lxml lxml.html


【解决方案1】:

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

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())

您需要使用一个 js 解释器安装“cloudscraper”包(这里我使用了 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”文档)。

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

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

【讨论】:

    猜你喜欢
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2019-03-03
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    相关资源
    最近更新 更多