我正在尝试使用Python在JavaScript呈现的网页上进行动态网页抓取。
1)但是,仅当我缓慢向下滚动页面时才会加载元素。
我尝试过:
driver.execute_script("window.scrollTo(0, Y)")
(这不起作用,因为它仅滚动到页面上的某个点,错过了其他结果)
和
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
(这不起作用,因为向下滚动到页面末尾时元素不会加载-需要用户缓慢滚动整个页面)
2)我如何让Selenium等待所有元素加载后再返回给我?
我了解此解决方案存在:
myElem = WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.ID, 'IdOfMyElement')))
但是,如果在用户向下滚动页面时结果不断出现,这将如何工作?一旦发现硒首次出现,此代码是否会使Selenium停止运行?
答案 0 :(得分:0)
您可以编写一个函数,向下发送箭头键,直到找到该元素为止。最好在通过某种FluentWait
(这是一个Java类)完成的循环中,但我也已经在Python中看到了这一点:python fluent wait
我们的目标是保持向下发送箭头键一定的时间,而忽略NoSuchElementException
答案 1 :(得分:0)
这可能对您有帮助
SCROLL_PAUSE_TIME = 0.5
# Get scroll height
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
# Scroll down to bottom
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# Wait to load page
time.sleep(SCROLL_PAUSE_TIME)
# Calculate new scroll height and compare with last scroll height
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
您可以将此代码与此功能结合起来:
myElem = WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.ID, 'IdOfMyElement')))