Python使用Selenium获取网页文本仅返回部分内容的问题求解
原因分析
- 懒加载机制:该页面的曲目列表采用滚动懒加载策略,初始状态仅渲染可视区域内的7首曲目,剩余曲目需要滚动到对应位置才会触发加载插入DOM,未滚动时无法抓取到未渲染的内容。
.text属性限制:Selenium中元素的.text属性默认仅返回元素在当前视口中的可见文本,即使部分内容已经加载,只要超出可视区域被隐藏,也可能无法被.text获取。- 硬等待不可靠:固定的
time.sleep(5)只能保证基础页面加载完成,无法保证所有动态内容都加载完毕。
解决方案
方案一:模拟滚动加载全量内容(推荐)
通过JS模拟滚动容器滚动,直到所有内容加载完成后再抓取,同时使用textContent属性获取全部文本,避免可见性限制,示例代码如下:
from selenium import webdriver from selenium.webdriver.common.by import By import time # 初始化driver部分可根据自己的配置调整 driver = webdriver.Chrome() driver.get("https://kripalunidhi.org/albums/Sadhana_Shivir_Pad_Vol__25") time.sleep(3) # 定位滚动容器 scroll_ele = driver.find_element(By.CLASS_NAME, "scroll-padding") # 循环滚动直到无新内容加载 last_scroll_height = driver.execute_script("return arguments[0].scrollHeight", scroll_ele) while True: # 滚动到容器底部 driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", scroll_ele) time.sleep(2) new_scroll_height = driver.execute_script("return arguments[0].scrollHeight", scroll_ele) if new_scroll_height == last_scroll_height: break last_scroll_height = new_scroll_height # 获取全部文本 full_content = driver.execute_script("return arguments[0].textContent", scroll_ele) # 写入文件 with open("songs.txt", "w", encoding="utf-8") as f: f.write(full_content.strip()) driver.quit()
方案二:接口直抓
如果追求更高效率,可以通过浏览器开发者工具的网络面板筛选获取曲目列表的后端接口,直接请求接口获取JSON格式的全量曲目数据,不需要启动浏览器模拟操作。
内容的提问来源于stack exchange,提问作者Rocky
相关产品推荐
相关产品推荐

