如何让Python的Selenium Driver等待页面全加载并解决get返回None问题?
解决Selenium页面加载与字典存储问题
首先明确:driver.get(link)本身就没有返回值,所以你直接把它赋值给self.data[link]肯定会得到None,这是方法设计的正常情况,要获取页面源码得用driver.page_source,但必须等页面完全加载完成后再调用。
针对你要等待整个页面加载完成的需求,给你几个可行的方案:
方案1:显式等待页面DOM加载完成
利用WebDriverWait等待浏览器的document.readyState变为complete,这是判断页面基本加载完成的标准:
from selenium.webdriver.support.ui import WebDriverWait from selenium.common.exceptions import TimeoutException for link in your_link_list: self.driver.get(link) # 等待页面加载完成,最多等10秒 try: WebDriverWait(self.driver, 10).until( lambda d: d.execute_script('return document.readyState') == 'complete' ) # 页面加载完成后,存入页面源码 self.data[link] = self.driver.page_source except TimeoutException: # 超时处理,比如标记该链接加载失败 self.data[link] = "页面加载超时" continue
方案2:修改浏览器加载策略
如果页面包含大量资源(图片、视频),默认的normal加载策略会等待所有资源加载完成,你可以明确设置;如果不需要等待资源加载,也可以用eager策略(仅等待DOM加载完成),根据需求选择:
from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.common.exceptions import TimeoutException chrome_options = Options() # normal:等待所有资源加载完成;eager:等待DOM加载完成;none:不等待 chrome_options.page_load_strategy = 'normal' self.driver = webdriver.Chrome(options=chrome_options) # 循环处理链接 for link in your_link_list: self.driver.get(link) # 结合方案1的等待逻辑,确保加载完成 try: WebDriverWait(self.driver, 10).until( lambda d: d.execute_script('return document.readyState') == 'complete' ) self.data[link] = self.driver.page_source except TimeoutException: self.data[link] = "加载超时" continue
你之前代码的问题纠正
- 用
WebDriverWait等待特定元素不符合你的需求,换成等待document.readyState才是正确的方向; finally里直接continue会导致不管等待成功还是失败都跳过存储逻辑,应该把超时处理放在except块中,成功时才存入页面源码;driver.implicitly_wait(10)是针对元素查找操作的超时设置,和页面整体加载的等待无关,所以对你的场景无效。
内容的提问来源于stack exchange,提问作者Kevin A.
相关产品推荐
相关产品推荐

