Selenium逐页翻页爬取HTML及h2文章标题仅返回部分结果问题
问题原因
- 核心逻辑顺序错误:你将提取页面源码的操作放在了所有翻页动作完成之后,Selenium的
driver.page_source仅能获取当前浏览器停留页面的HTML内容,之前翻页过程中加载过的所有页面内容都没有被留存,最终只能拿到最后一页的9条标题。 - 异常捕获不完整:翻页终止判断仅捕获了
NoSuchElementException,但实际当页面不存在下一页按钮时,显式等待超时会抛出TimeoutException,未捕获该异常会导致循环提前中断,甚至无法正常抵达最后一页。 - 存在冗余无效代码:重复导入
WebDriverWait,其中别名Wait的导入从未被调用,无实际作用。
修复方案
按照以下逻辑调整代码即可获取全量标题:
- 初始化全局列表存储所有页面的标题,不要等全部翻页完成后再一次性提取源码。
- 每次页面加载完成后(包括首次打开的首页),立刻提取当前页的所有h2标题存入全局列表,再执行翻页操作。
- 补全异常捕获逻辑,同时处理元素不存在、等待超时两类终止场景,确保翻页循环能正常走到最后一页。
- 翻页点击后增加短等待,确认新页面内容完全渲染后再执行提取,避免拿到残缺的未加载内容。
- 清理冗余导入,规范代码结构。
修正后的可运行代码如下:
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.chrome.options import Options from selenium.common.exceptions import NoSuchElementException, TimeoutException from bs4 import BeautifulSoup as bs options = Options() # 可根据需要开启无头模式 # options.add_argument("--headless=new") driver = webdriver.Chrome("C:/Users/krish/Desktop/chromedriver_win32/chromedriver.exe", options=options) driver.get('https://www.cnbcindonesia.com/tag/pasar-modal') all_titles = [] while True: # 等待当前页面文章内容加载 time.sleep(2) # 提取当前页所有h2标题 current_soup = bs(driver.page_source, 'html.parser') current_page_titles = [h2.get_text(strip=True) for h2 in current_soup.find_all('h2')] all_titles.extend(current_page_titles) # 尝试点击下一页 try: next_button = WebDriverWait(driver, 15).until( EC.element_to_be_clickable((By.CSS_SELECTOR, ".icon.icon-angle-right")) ) driver.execute_script("arguments[0].click();", next_button) except (NoSuchElementException, TimeoutException): # 无下一页按钮时退出循环 break driver.quit() # 输出所有结果 for title in all_titles: print(title) print(f"\n总计获取标题数量:{len(all_titles)}")
补充说明:如果运行后发现存在重复标题,可以在存入全局列表前做去重处理,部分资讯类网站翻页时会重复加载上一页的尾部内容,属于正常现象。
内容的提问来源于stack exchange,提问作者krsnbcd
相关产品推荐
相关产品推荐

