Selenium无法滚动目标侧边栏/容器问题求助
解决Selenium滚动侧边栏容器失败的问题
针对你遇到的侧边栏容器滚动无效、无法加载全部数据的问题,结合容器有JS保护的情况,给你几个可行的调整方案:
一、更换滚动方式:直接设置容器滚动到底部
你的代码用了scrollBy,但部分自定义容器不响应这个方法,换成直接设置scrollTop到容器最大高度试试:
last_height = driver.execute_script("return arguments[0].scrollHeight;", member_container) # 改成每次直接滚到底 while True: # 直接将容器滚动条拉到最底部 driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight;", member_container) time.sleep(5) # 等待加载新内容 new_height = driver.execute_script("return arguments[0].scrollHeight;", member_container) if new_height == last_height: break last_height = new_height
二、针对自定义滚动条:模拟鼠标拖拽滚动
如果容器用了自定义滚动条(不是浏览器原生的),可以定位滚动条滑块,用ActionChains拖拽:
from selenium.webdriver.common.action_chains import ActionChains # 先定位滚动条的滑块元素(需要自己用F12找对应的selector) scroll_slider = driver.find_element(By.CSS_SELECTOR, "你的滚动条滑块选择器") # 多次拖拽滑块到底部,直到没有新内容加载 while True: last_height = driver.execute_script("return arguments[0].scrollHeight;", member_container) # 拖拽滑块从当前位置到最下方 ActionChains(driver).drag_and_drop_by_offset(scroll_slider, 0, 500).perform() time.sleep(5) new_height = driver.execute_script("return arguments[0].scrollHeight;", member_container) if new_height == last_height: break
三、解决JS保护导致的内容无法获取问题
因为容器需要插件才能复制,直接用member_container.text可能拿不到完整内容,换成通过JS获取innerText或innerHTML:
# 替换原来的f.write(member_container.text) container_content = driver.execute_script("return arguments[0].innerText;", member_container) with open("S:/touhami/selenium_results.txt", "a", encoding='utf-8') as f: # 用追加模式"a",避免覆盖之前内容 f.write(container_content + "\n")
四、优化你的原有代码
把保存逻辑移到循环外(或者用追加模式),避免每次循环覆盖文件内容,同时确保滚动逻辑正确:
import time from selenium.webdriver.common.by import By # 假设你已经定位到member_container member_container = driver.find_element(By.CSS_SELECTOR, "你的侧边栏容器选择器") last_height = driver.execute_script("return arguments[0].scrollHeight;", member_container) all_content = [] while True: # 直接滚动到底部 driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight;", member_container) time.sleep(5) # 获取当前容器内容(用JS绕过保护) current_content = driver.execute_script("return arguments[0].innerText;", member_container) all_content.append(current_content) new_height = driver.execute_script("return arguments[0].scrollHeight;", member_container) if new_height == last_height: break last_height = new_height # 最后统一写入文件,去重(可选) final_content = "\n".join(all_content) with open("S:/touhami/selenium_results.txt", "w", encoding='utf-8') as f: f.write(final_content)
额外提示
- 确认你定位的
member_container是真正的滚动容器:有些页面的侧边栏外层是容器,实际滚动的是里面的子元素,用F12检查元素的overflow属性,找设置了overflow: auto或scroll的元素。 - 如果还是不行,可以尝试用
Keys.PAGE_DOWN模拟按键滚动,先让容器获得焦点,再按多次PAGE_DOWN:
member_container.send_keys(Keys.PAGE_DOWN)
内容的提问来源于stack exchange,提问作者touhami30
相关产品推荐
相关产品推荐

