持续点击分页'查看 - 更多' selenium(python)中的按钮,用于加载JS填充的数据

时间:2016-10-16 14:06:14

标签: python selenium pagination web-crawler selenium-chromedriver

我正在尝试通过动态点击“加载更多”来抓取网站内容。按钮。我看到了其他一些similar questions,但他们似乎得到了其他类型的错误,或者只是面临版本问题。我正在尝试解析网站https://angel.co/companies。以下是我的代码。

with closing(Chrome()) as browser:
    browser.get(url)
    # wait for the page to load
    while True:
        try:
            WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.more")))
            WebDriverWait(browser, timeout=10).until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, 'div.more'), 'More'))
        except:
            break
        element = browser.find_element_by_css_selector('div.more').click()

此代码甚至没有点击一次点击选项。但是,如果我在click()调用之后带来第二个等待条件(如下所示),则会点击“更多”'按钮一次,该分页步骤的数据加载,然后没有更多的点击完成。

with closing(Chrome()) as browser:
    browser.get(url)
    # wait for the page to load
    while True:
        try:
            WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.more")))
        except:
            break
        element = browser.find_element_by_css_selector('div.more').click()
        WebDriverWait(browser, timeout=10).until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, 'div.more'), 'More'))

有人可以帮我找出我做错了什么吗?

1 个答案:

答案 0 :(得分:1)

当像这样的网站以这种方式动态加载内容时,它往往会对页面DOM造成严重破坏,随着新元素的加载而不断使元素无效。我发现最好的方法是以放置方式组织代码selenium调用自己的函数,然后用重试装饰器进行装饰。如果/当抛出异常(StaleElementReferenceException,UnknownElementException等)时,您可以立即重试该调用。

from retry import retry
from explicit import waiter
from selenium import webdriver
from selenium.common.exceptions import StaleElementReferenceException


@retry(StaleElementReferenceException, tries=3, delay=0.5)
def click_more(driver):
    waiter.find_element(driver, 'div.more').click()

driver = webdriver.Chrome()

try:
    driver.get("https://angel.co/companies")

    while True:
        click_more(driver)

finally:
    driver.quit()

完全公开:Explicit是我维护的python包,可从PyPI获得。它与您的WebDriverWait调用基本相同。