WebDriver的page_source获取内容与手动查看页面源代码不一致
解决Selenium获取Lichess实时对局页面内容与手动查看不一致的问题
嗨,我之前也碰到过类似的动态页面爬取问题,你的情况大概率是因为Lichess的实时对局页面是通过JavaScript动态渲染内容导致的。
你调用page_source的时候,页面的DOM刚加载完成,但浏览器还没来得及执行所有JavaScript来渲染出对局的具体内容(比如棋盘状态、棋手走法这些),而你手动查看页面源代码时,浏览器已经完成了所有JS渲染,所以两者内容不一样。
给你几个实用的解决方案,一步步来:
等待动态元素加载完成再获取源码
用Selenium的显式等待功能,指定一个关键元素(比如对局的棋盘、棋手信息块),等它加载出来后再去拿page_source,这样能确保动态内容已经渲染完毕。示例代码如下:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By chrome = webdriver.Chrome('./chromedriver') chrome.get('你的实时对局链接') # 这里以Lichess棋盘的CSS选择器为例,你可以手动去页面检查真实的选择器 # 等待最多10秒,直到棋盘元素出现 WebDriverWait(chrome, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, '.board')) ) # 现在再获取页面源码就和手动看到的一致了 with open("page_content.txt",'wb') as fd: fd.write(chrome.page_source.encode("utf-8"))模拟真实浏览器,避免被识别为自动化工具
有些网站会检测Selenium的特征,给自动化工具返回简化版内容。你可以给Chrome添加一些参数,让它更像真实用户的浏览器:from selenium.webdriver.chrome.options import Options options = Options() # 禁用自动化检测特征 options.add_argument("--disable-blink-features=AutomationControlled") # 设置真实的用户代理 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") # 去掉自动化相关的开关 options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) chrome = webdriver.Chrome('./chromedriver', options=options) chrome.get('你的实时对局链接')如果内容需要滚动加载,补充滚动操作
要是对局的历史走法等内容需要滚动页面才会加载,你可以加一段滚动代码,确保所有内容都加载出来:import time # 滚动到页面底部 chrome.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 给浏览器一点加载时间 time.sleep(2)
另外,虽然你说想用Selenium熟悉工具,但提一句:Lichess其实有官方API可以直接获取对局数据,要是后续训练需要大量数据,API会比爬取页面高效很多,但既然是练手,用Selenium完全没问题~
内容的提问来源于stack exchange,提问作者muller
相关产品推荐
相关产品推荐

