我正在尝试通过动态点击“加载更多”来抓取网站内容。按钮。我看到了其他一些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'))
有人可以帮我找出我做错了什么吗?
答案 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调用基本相同。