首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连续单击selenium (python)中的分页“view-more”按钮,以加载JS填充的数据

问连续单击selenium (python)中的分页“view-more”按钮,以加载JS填充的数据
EN

Stack Overflow用户
提问于 2016-10-16 14:06:13
回答 1查看 1.1K关注 0票数 0

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

代码语言:javascript
复制
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()调用之后(如下面所示)引入了第二个等待条件,它只单击“多”按钮一次,即该分页步骤加载的数据,然后就不会有更多的单击。

代码语言:javascript
复制
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'))

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-16 18:59:25

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

代码语言:javascript
复制
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()

完全公开: PyPI是我维护和使用的python包。这与您拥有的WebDriverWait调用基本上是相同的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40071189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档