【问题标题】:Scrolling down on Python Selenium在 Python Selenium 上向下滚动
【发布时间】:2020-05-06 10:53:41
【问题描述】:

我目前正在尝试在 Python 上使用 Selenium 抓取 DropBox 文件夹。显然,如果我尝试选择所有超链接(或所有包含超链接的元素),我只会得到前 20 个左右的结果。举一个最小的工作示例:

from selenium import webdriver
browser = webdriver.Chrome()
page = www.dropbox.com/FolderName
browser.get(page)

elementlist = browser.find_elements_by_class_name('brws-file-name-cell-filename')
#or alternatively, you can simply use the 'by_tag_name('a') method, which yields similar results)
elength = len(elementlist)

通常,elength 大约有 20 到 30 个元素,它会增长到 30 到 40 我添加一个向下滚动到页面底部的命令。我知道我要抓取的文件夹中有超过 200 个元素。因此,我的问题是:有没有办法渐进向下滚动页面,而不是立即一直到底部?我看到很多关于同一主题的问题都集中在无限加载的页面上,比如 Facebook 或其他社交媒体。另一方面,我的页面具有固定长度。有没有办法可以逐步向下滚动,而不是一次全部滚动?

更新

我尝试遵循社区给我的建议,您可以通过答案找到here。不幸的是,我仍在努力迭代高度,这是我感兴趣的变量,它似乎被困在一个字符串中。这是我在高度上创建 for 循环的最佳尝试,不用说,它仍然没有工作。

# Get current height
height =  browser.execute_script("return document.body.scrollHeight")

while True:
    # Scroll down
    browser.execute_script('window.scrollTo(0, window.scroll'+str(height)+' + 200)')

    # Wait to load page
    time.sleep(SCROLL_PAUSE_TIME)

    # Calculate new scroll height and compare with last scroll height
    new_height = browser.execute_script("return document.body.scrollHeight")
    if new_height == height:
        break
    else:
        height = new_height

更新 2

我想我找到了问题所在。 Dropbox 基本上有一个“页面中的页面”结构。我可以看到整个页面,但是我需要导航一个内部存档。知道该怎么做吗?

【问题讨论】:

标签: python selenium


【解决方案1】:

您可以尝试this 回答。您可以创建一个具有固定高度的 for 循环并迭代直到到达底部,而不是走到底部。

【讨论】:

  • 我编辑了我的主要帖子。我将该帖子中的一些建议包含在我的代码中。没有结果。
【解决方案2】:

browser.execute_script('window.scrollTo(0, window.scroll'+str(height)+' + 200)')

Javascript 方法中的第二个参数对我来说似乎很奇怪。让我们假设你的高度变量是 800 像素,所以我们让这个 javascript 函数在 execute_script 中执行(execute_script 是一个 selenium 方法,它可以让你编写 javascript 代码)。

window.scrollTo(0, window.scroll800 + 200) 我认为这会引发错误并停止执行。我认为您应该将代码更改为此。

browser.execute_script('window.scrollTo(0,'+str(height)+' + 200)')

此代码会将您的窗口滚动到页面底部(一个提示:您实际上可以转到浏览器的 devtools 并打开控制台并尝试那里的 javascript 代码。如果它有效,您可以回到 selenium )。此时,您应该让您的驱动程序实例休眠。一旦它加载页面(确保给它足够的时间来加载),你应该将新的高度值分配给一个新的变量。如果页面在页面底部加载了更多元素,则第一个高度和新高度值应该不同,这需要再次滚动到底部。但在滚动之前,您应该更改第一个高度值并为其分配新的高度值,因此在下一个循环中,您的第一个高度将是前一个循环的第二个高度。

【讨论】:

  • 所以我在编辑中发布的代码基本上是功能性的,我只需要更改该特定命令的语法。对吗?
  • 没错,先试试浏览器控制台的滚动功能就知道了。
  • 尝试 document.getElementBy***(此处元素的类名、ID 或 JS 路径取决于您选择的方法).scrollTo(此处的值)作为 execute_script 的参数。使用 getElementBy***,您应该选择要滚动的元素。
猜你喜欢
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 2018-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多