Python中Selenium登录后无法获取目标页面完整HTML的问题求助
问题描述
我需要爬取一个需身份验证的网页数据,已通过Selenium完成身份验证,但访问目标页面时,Chromium中能正常显示全部内容,代码却仅输出页面头部的部分内容。尝试过显式等待目标ID、滚动页面、执行JS获取HTML、修改UA等操作,仍出现超时问题。
代码示例
import time from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.chrome.options import Options import sys driver = webdriver.Chrome() driver.get('https://www.boursedirect.fr/fr/login') identifiant = driver.find_element(By.ID,'bd_auth_login_type_login') mot_de_passe = driver.find_element(By.ID,'bd_auth_login_type_password') identifiant.send_keys('XXXXXXXXXX') mot_de_passe.send_keys('XXXXXXXXXXXX') mot_de_passe.send_keys(Keys.RETURN) time.sleep(20) driver.get('https://www.boursedirect.fr/fr/page/portefeuille') time.sleep(5) for _ in range(100): driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(5) WebDriverWait(driver, 50).until(EC.presence_of_element_located((By.ID, "tabPTR")) ) print(driver.page_source)
已尝试的操作
- 使用
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")滚动页面 - 执行JS:
driver.execute_script("return document.documentElement.outerHTML") - 修改UA
解决方案
- 替换固定sleep为显式等待,确保登录完成再跳转
固定等待时间不稳定,登录后先等待登录成功的标识元素(比如用户头像、用户名)出现,再访问目标页面:
# 登录后等待用户标识加载完成,替换为实际的选择器 WebDriverWait(driver, 30).until( EC.presence_of_element_located((By.CSS_SELECTOR, ".user-avatar")) ) # 再跳转目标页面 driver.get('https://www.boursedirect.fr/fr/page/portefeuille')
- 优化滚动加载逻辑,避免无意义重复滚动
连续滚动100次可能页面还没来得及加载新内容,改为循环滚动直到页面高度不再变化,每次滚动后加短等待:
last_height = driver.execute_script("return document.body.scrollHeight") while True: driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(2) # 给页面预留加载时间 new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height: break # 高度不变说明已加载完所有内容 last_height = new_height
- 更换等待条件,确保元素可见而非仅存在
presence_of_element_located只判断元素存在于DOM中,可能还未渲染显示,改用visibility_of_element_located确保元素可见后再操作:
WebDriverWait(driver, 50).until( EC.visibility_of_element_located((By.ID, "tabPTR")) )
- 检查目标内容是否在iframe中
部分网站会把核心内容放在iframe里,需要先切换到对应iframe才能获取内容:
# 先找到目标iframe,替换为实际的选择器 iframe = WebDriverWait(driver, 30).until( EC.presence_of_element_located((By.CSS_SELECTOR, "iframe[src*='portefeuille']")) ) driver.switch_to.frame(iframe) # 之后再执行等待、滚动或获取源码操作
- 用JS获取完整HTML结构
如果driver.page_source获取不全,尝试用JS命令直接获取整个文档的HTML:
full_html = driver.execute_script("return document.documentElement.outerHTML") print(full_html)
内容的提问来源于stack exchange,提问作者0xeskay
相关产品推荐
相关产品推荐

