Selenium结合Scrapy无法完整加载VMware页面的问题求助
VMware爬取问题解决方案
问题1:确保所有“Read More”元素加载完成
- 替换等待条件:将
EC.presence_of_element_located改为EC.presence_of_all_elements_located,该条件会等待所有匹配元素都出现在DOM中,示例代码:wait = WebDriverWait(self.driver, 120, poll_frequency=5) read_more_elements = wait.until(EC.presence_of_all_elements_located((By.PARTIAL_LINK_TEXT, "Read More"))) - 校验元素数量:如果明确知道目标元素数量是20,可在等待后添加校验逻辑,确保数量达标:
while len(read_more_elements) < 20: time.sleep(2) read_more_elements = self.driver.find_elements(By.PARTIAL_LINK_TEXT, "Read More") - 滚动加载处理:若元素是滚动触发加载,需循环滚动页面触发内容加载:
while len(read_more_elements) < 20: self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(3) read_more_elements = self.driver.find_elements(By.PARTIAL_LINK_TEXT, "Read More")
问题2:onclick属性消失及点击无效的解决
- 原因:页面采用了动态事件绑定(如React/Vue框架的事件委托机制),onclick属性并非直接写入静态HTML,而是通过JavaScript动态绑定到元素上,因此
page_source中无法看到该属性。 - 解决办法:
- 直接调用元素点击方法:无需依赖onclick属性,直接用Selenium提供的点击方式,推荐用JS点击避免元素遮挡或不可交互问题:
for elem in read_more_elements: self.driver.execute_script("arguments[0].click();", elem) time.sleep(1) # 等待内容展开 - 检查iframe:若元素嵌套在iframe内,需先切换到iframe再操作:
iframe = self.driver.find_element(By.CSS_SELECTOR, "iframe") self.driver.switch_to.frame(iframe) # 执行元素查找和点击操作 self.driver.switch_to.default_content() # 操作完成后切回主文档 - 反爬规避:部分官方网站会检测自动化工具,可尝试添加浏览器头部信息优化:
from selenium.webdriver.firefox.options import Options options = Options() options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36") self.driver = webdriver.Firefox(options=options)
- 直接调用元素点击方法:无需依赖onclick属性,直接用Selenium提供的点击方式,推荐用JS点击避免元素遮挡或不可交互问题:
内容的提问来源于stack exchange,提问作者Q Yang
相关产品推荐
相关产品推荐

