在我正在进行的项目中,我告诉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
,并让驱动程序使用iframe
重新引用driver.find_element_by_id("id")
,但都不起作用。
答案 0 :(得分:0)
从问题我假设selenium没有等待下一页加载。确保发生这种情况的一种方法(虽然不是最优雅的)是使用当前页面上已知的元素,您知道这些元素会发生变化并等待点击后发生更改。您可以使用隐式等待,请参阅https://selenium-python.readthedocs.io/waits.html,了解有关如何执行此操作的详细信息。
或者,您可以在单击后添加显式等待。即
from time import sleep
...
driver.click(..);
sleep(0.5) # Wait for half a second
# Scrape the page
答案 1 :(得分:0)
创建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>,
...
]