【问题标题】:How do I copy page elements from a website into python?如何将页面元素从网站复制到 python 中?
【发布时间】:2021-11-25 09:36:04
【问题描述】:

我正在尝试抓取网站以查找某个令牌的持有者地址。当我选择地址并检查页面时,我被带到元素部分。它是 html 格式的,所以我认为这是我可以从中抓取它的地方。

我试过这段代码

from bs4 import BeautifulSoup
import requests

# opening and grabbing html

holders_text = requests.get("https://etherscan.io/token/generic-tokenholders2?a=0x57a204aa1042f6e66dd7730813f4024114d74f37&sid=&m=normal&s=3863&p=1").text
holders_html = BeautifulSoup(holders_text, 'lxml')

print(holders_html)

但我很快发现这个 html 和我要找的完全不同。

我想弄清楚是否有办法将页面元素提取到python中,特别是每个地址,如下所示:

Picture of what I am trying to scrape

如果有任何方法可以抓取这些数据,请告诉我,谢谢!

还有网址:https://etherscan.io/token/generic-tokenholders2?a=0x57a204aa1042f6e66dd7730813f4024114d74f37&sid=&m=normal&s=3863&p=1

【问题讨论】:

  • driver.page_source 不会返回页面的未经评估的原始 HTML 源代码吗?您所追求的数据是使用 JavaScript 动态生成的吗?如果是这样,它将永远不会出现在driver.page_source 中。您正在寻找的 "stuff" 到底是什么?为什么不使用特定的选择器组合来检索您需要的数据?您在此处选择的方法本身确实不是最佳实践。 "基本上我想知道如何确保从 url 获取所有源代码。" 页面的所有源代码都应该在 driver.page_source;不是吗?
  • Driver.page_source 似乎返回了我看到的源代码的截断版本。 “东西”只是一个多次出现的长类定义。我猜它必须是动态生成的,有没有办法查看这个?
  • 您能否分享一个展示此行为的可公开访问网站的示例(driver.page_source 返回截断的源代码?
  • 您的问题仍然严重缺乏具体回答此问题所需的细节。 ““stuff”只是一个多次出现的长类定义。” JavaScript 类定义? CSS类定义?你可以说得更详细点吗?你想用它做什么?在当前页面中定义类时只需打印一条消息? “我猜肯定是动态生成的,有什么办法可以查看吗?” “it”是什么?类定义?它似乎是在什么条件下动态生成的?用您自己的话来说,“查看 [it]”是什么?
  • 是的,当然,我正在查看的页面是 Etherscan,例如:etherscan.io/token/…

标签: python html web-scraping


【解决方案1】:

我认为你在这里误解了你的问题。

您的网站https://etherscan.io/token/0x57a204aa1042f6e66dd7730813f4024114d74f37#balances 动态生成您的目标(Holders 选项卡)。

如果您打开浏览器的网络检查器并单击第 2 页,您将看到由 javascript 发出的数据请求:

在这里你可以看到你的目标的实际数据url:

https://etherscan.io/token/generic-tokenholders2?a=0x57a204aa1042f6e66dd7730813f4024114d74f37&sid=&m=normal&s=3863&p=2

查看参数:a 是地址名称,p 是页面 要获取这些地址,您需要做的就是抓取此 url 而不是整个页面。

您甚至不需要 Selenium 或 webdriver! 这是带有pythonrequestsparsel 包的刮板:

from parsel import Selector
import requests
response = requests.get("https://etherscan.io/token/generic-tokenholders2?a=0x57a204aa1042f6e66dd7730813f4024114d74f37&sid=&m=normal&s=3863&p=2", headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"})
sel = Selector(response.text)
sel.css("tr>td>a::attr(href)").extract()
['/token/0x57a204aa1042f6e66dd7730813f4024114d74f37?a=0x2643796cb6b4e715140f09c352ea26afff1a7d93', '/token/0x57a204aa1042f6e66dd7730813f4024114d74f37?a=0x69bab6810fa99475854bca0a3dd72ae6a0728ece', '/token/0x57a204aa1042f6e66dd7730813f4024114d74f37?a=0xf9f56b6dc4c297b0d942b0e03f7e67d6dd0ed7be', '/token/0x57a204aa1042f6e66dd7730813f4024114d74f37?a=0x5aeedbc6b655c13950f32e5e8a0760d15bbe0afb', '/token/0x57a204aa1042f6e66dd7730813f4024114d74f37?a=0x00084121aec4309cb20db622a28c717720e888e0', '/token/0x57a204aa1042f6e66dd7730813f4024114d74f37?a=0xdfc70f5205a2bc1bd44219fd852d720d7a36c5b8', '/token/0x57a204aa1042f6e66dd7730813f4024114d74f37?a=0x6f35b0cfc58eb1e21eef8a439bbb0ce4c929d32a', '/token/0x57a204aa1042f6e66dd7730813f4024114d74f37?a=0xfa6023f9c140c6ec5c78d19b91d4bdece8de107d', '/token/0x57a204aa1042f6e66dd7730813f4024114d74f37?a=0x2f5db226b29abfd1aa01f53e4ea3493b6e69c050', '/token/0x57a204aa1042f6e66dd7730813f4024114d74f37?a=0x9ffad2ff3a59d8579e3b0edc6c8f2f591c94dfab', '/token/0x57a204aa1042f6e66dd7730813f4024114d74f37?a=0xb1c51fbecee5a397177c934b76acd080c105d648', '/token/0x57a204aa1042f6e66dd7730813f4024114d74f37?a=0x8cbc7327b5fe2bce2c69fdafd58aeae83d349eb2']

【讨论】:

  • 帮助很大,谢谢!但是,当我检查您提供的网址时,html 仍然没有给我地址。 url 中的地址是正在持有的 NFT,而列表中的地址是持有者。我想动态地从列表中抓取这些地址,以及理想情况下的超链接。这可能吗?
  • 我也更新了我的问题,希望它更清楚一点,再次感谢您的帮助!
猜你喜欢
  • 2013-10-30
  • 1970-01-01
  • 2014-01-28
  • 2012-05-16
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 2019-08-11
相关资源
最近更新 更多