使用selenium和python向下滚动页面

时间:2016-05-05 13:34:56

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

这就是问题:

我正在使用selenium从此网页下载所有成功的项目(" https://www.rockethub.com/projects")。如果点击任何按钮,则网址不会更改。 我对成功的项目感兴趣,因此我点击按钮状态然后点击成功。

一旦进入此页面,我需要重复向下滚动以显示其他网址。 这是问题所在。到目前为止,我一直无法向下滚动页面

这是我的代码:

from selenium.webdriver import Firefox
from selenium import webdriver



url="https://www.rockethub.com/projects"

link=[]

wd = webdriver.Firefox()
wd.get(url)

next_button = wd.find_element_by_link_text('Status')
next_button.click()

next_but = wd.find_element_by_link_text('Successful')
next_but.click()

wd.execute_script("window.scrollTo(0, document.body.scrollHeight);")

关于如何解决这个问题的任何想法?

由于

Giangi

2 个答案:

答案 0 :(得分:0)

在循环中运行wd.execute_script("window.scrollTo(0, document.body.scrollHeight);"),因为每次执行脚本时,只会返回一定数量的数据,所以你必须在循环中执行它。

如果您只想一次检索所有成功的项目而不想模拟向下滚动到页面,那么请查看this answer,这可能会有所帮助。

答案 1 :(得分:0)

由于内容是动态更新的,因此您需要在执行下一步之前等待更改内容:

class element_is_not(object):
    """ An expectation for checking that the element returned by
    the locator is not equal to a given element.
    """

    def __init__(self, locator, element):
        self.locator = locator
        self.element = element

    def __call__(self, driver):
        new_element = driver.find_element(*self.locator)
        return new_element if  self.element != new_element else None


from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait

driver = webdriver.Firefox()
wait = WebDriverWait(driver, 10)

driver.get("https://www.rockethub.com/projects")

# get the last box
by_last_box = (By.CSS_SELECTOR, '.project-box:last-of-type')
last_box = wait.until(element_is_not(by_last_box, None))

# click on menu Status > Successful
driver.find_element_by_link_text('Status').click()
driver.find_element_by_link_text('Successful').click()

# wait for a new box to be added
last_box = wait.until(element_is_not(by_last_box, last_box))

# scroll down the page
driver.execute_script("window.scrollTo(0, document.documentElement.scrollHeight);")

# wait for a new box to be added
last_box = wait.until(element_is_not(by_last_box, last_box))