【问题标题】:Selenium not updating website (Python)Selenium 不更新网站(Python)
【发布时间】:2018-04-26 06:04:23
【问题描述】:

在我正在做的一个项目中,我告诉 Selenium 去抓取具有完全相同 URL 的下一页上的数据。

我的代码:

driver = webdriver.Chrome()
driver.get("https://etherscan.io/token/0x168296bb09e24a88805cb9c33356536b980d3fc5#balances")

iframe1 = driver.find_element_by_id('tokeholdersiframe')
driver.switch_to.frame(iframe1)
soup = BeautifulSoup(driver.page_source, 'html.parser')
token_holders = soup.find_all('tr')

driver.find_element_by_link_text('Next').click()
time.sleep(10)
token_holders2 = soup.find_all('tr') #I get the data from previous page (exact same as token_holder) rather than the new data.

但是,Selenium 没有更新,我仍然从上一页获得相同的数据。

我尝试在点击后使用隐式等待:

driver.implicitly_wait(30)

但它不起作用。我还尝试将汤重置为driver.page_source,以及让驱动程序使用driver.find_element_by_id("id") 重新找到iframe,但都不起作用。

【问题讨论】:

  • 请用带有 iframe 标签的 HTML 代码更新问题,以及切换到 iframe 后您想做什么。
  • @cruisepandey 我修正了我的解释,让它更有意义

标签: python-3.x selenium web-scraping beautifulsoup


【解决方案1】:

从我假设硒没有等待下一页加载的问题。确保发生这种情况的一种方法(虽然不是最优雅的)是使用当前页面上的已知元素,您知道这些元素会发生变化,并在单击后等待该变化发生。您可以使用隐式等待,请参阅 https://selenium-python.readthedocs.io/waits.html 了解如何执行此操作的详细信息。

或者,您可以在单击后添加显式等待。即

 from time import sleep
 ...

 driver.click(..);
 sleep(0.5) # Wait for half a second

 # Scrape the page

【讨论】:

  • 我试过了,但它仍然从上一页获取信息。我更新了我的答案,所以你可以看到我的代码
  • 好的,我想我明白问题所在了。您将 BeautifulSoup 实例化为第一页的一个实例,因此当您更改页面时,它仍然使用原始副本。超时后尝试重新实例化你的汤。 See this answer below。有个回答
【解决方案2】:

创建soup 后,它不会动态更新以反映driver.page_source。您需要创建BeautifulSoup 的新实例并传递更新后的页面源。

token_holders = soup.find_all('tr')

driver.find_element_by_link_text('Next').click()
soup = BeautifulSoup(driver.page_source, 'html.parser')
token_holders2 = soup.find_all('tr')
>>> token_holders[1:]
[<tr><td>1</td><td><span><a href="/token/0x168296bb09e24a88805cb9c33356536b980d3fc5?a=0xd35a2d8c651f3eba4f0a044db961b5b0ccf68a2d" target="_parent">0xd35a2d8c651f3eba4f0a044db961b5b0ccf68a2d</a></span></td><td>310847219.011683</td><td>31.0847%</td></tr>,
 <tr><td>2</td><td><span><a href="/token/0x168296bb09e24a88805cb9c33356536b980d3fc5?a=0xe17c20292b2f1b0ff887dc32a73c259fae25f03b" target="_parent">0xe17c20292b2f1b0ff887dc32a73c259fae25f03b</a></span></td><td>200000001</td><td>20.0000%</td></tr>,
...
]

>>> token_holders2[1:]
[<tr><td>51</td><td><span><a href="/token/0x168296bb09e24a88805cb9c33356536b980d3fc5?a=0x5473621d6d5f68561c4d3c6a8e23f705c8db7661" target="_parent">0x5473621d6d5f68561c4d3c6a8e23f705c8db7661</a></span></td><td>687442.69121294</td><td>0.0687%</td></tr>,
 <tr><td>52</td><td><span><a href="/token/0x168296bb09e24a88805cb9c33356536b980d3fc5?a=0xbc14ca2a57ea383a94281cc158f34870be345eb6" target="_parent">0xbc14ca2a57ea383a94281cc158f34870be345eb6</a></span></td><td>619772.39698</td><td>0.0620%</td></tr>,
 ...
]

【讨论】:

  • 我试过你输入的代码,它给了我一个错误,说我的“iframe1”变量有一个错误,这条消息是“selenium.common.exceptions.NoSuchElementException: Message: no这样的元素:无法定位元素:{“method”:“id”,“selector”:“tokeholdersiframe”}”你碰巧知道为什么它不起作用吗?它适用于我抓取的第一页(id 也是“tokeholdersiframe”;我没有拼错
  • 没关系,我找到了问题所在。我不得不在 token_holders2 = soup.find_all('tr') 行之后使用 time.sleep(5)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-12
  • 2021-11-13
  • 1970-01-01
  • 2012-10-09
  • 2015-11-14
  • 1970-01-01
  • 2012-10-18
相关资源
最近更新 更多