使用Selenium驱动滚动页面获取指定数量Reddit帖子失败求助
解决Reddit页面无法滚动加载更多帖子的问题
问题原因
- Reddit的动态内容加载依赖特定滚动容器,直接滚动
document.body可能无法触发加载逻辑 - 单次滚动不足以加载足够内容,需要循环滚动直到获取目标数量的帖子
- 固定时长
sleep无法适配网络加载速度,应该用显式等待判断新内容是否加载完成
修正方案
1. 滚动到页面最后一个帖子位置
每次滚动到当前页面最后一个帖子的底部,触发Reddit的自动加载机制,而非直接滚动到body高度。
2. 使用显式等待替代固定sleep
等待新的帖子元素加载完成,避免因网络延迟导致的内容未加载。
3. 循环滚动直到达到目标帖子数量
设置目标帖子数,循环执行滚动+等待,直到提取到的标题数量满足需求。
完整修正代码
from selenium import webdriver 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.service import Service from bs4 import BeautifulSoup import time # 设置爬取URL url = 'https://www.reddit.com/r/Fitness/' # 启动浏览器 ser = Service('chromedriver/chromedriver') driver = webdriver.Chrome(service=ser) driver.get(url) # 目标帖子数量 target_post_count = 50 wait = WebDriverWait(driver, 10) while True: # 获取当前所有帖子标题元素 current_titles = driver.find_elements(By.CSS_SELECTOR, 'h3._eYtD2XCVieq6emjKBH3m') if len(current_titles) >= target_post_count: break # 滚动到最后一个帖子的位置 last_post = current_titles[-1] driver.execute_script("arguments[0].scrollIntoView({behavior: 'smooth'});", last_post) # 等待新帖子加载(等待标题元素数量增加) try: wait.until(lambda d: len(d.find_elements(By.CSS_SELECTOR, 'h3._eYtD2XCVieq6emjKBH3m')) > len(current_titles)) except: # 超时后退出循环,避免无限等待 print("无法加载更多帖子,退出循环") break # 额外添加短暂等待,避免触发反爬 time.sleep(1) # 获取页面HTML并解析 html = driver.page_source soup = BeautifulSoup(html, 'lxml') # 提取标题 titles = [h3.text for h3 in soup.find_all('h3', {'class': "_eYtD2XCVieq6emjKBH3m"})] print(f"提取到的帖子数量:{len(titles)}") print(titles[:target_post_count]) driver.quit()
额外注意事项
- 如果遇到登录弹窗,可在滚动前添加代码关闭弹窗(定位弹窗的关闭按钮并点击)
- Reddit存在反爬机制,避免过快滚动,可在每次滚动后添加短暂等待
- 元素class可能随网站更新变化,若提取失败需检查最新的元素选择器
内容的提问来源于stack exchange,提问作者Saurabh Shrestha
相关产品推荐
相关产品推荐

