我正在尝试抓取一个网站的内容,动态点击一个‘加载-更多’按钮。我看到了一些其他的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'))有人能帮我找出我做错了什么吗?
发布于 2016-10-16 18:59:25
当这样的网站以这种方式动态加载内容时,它往往会对页面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()完全公开: PyPI是我维护和使用的python包。这与您拥有的WebDriverWait调用基本上是相同的。
https://stackoverflow.com/questions/40071189
复制相似问题