使用Selenium滚动页面仍无法获取全部3821条链接求助
解决方案:处理懒加载实现全量链接抓取
你的问题出在页面采用懒加载机制——只有当内容滚动到可视区域时,才会动态加载新的链接。单次滚动到页底仅触发了部分内容加载,无法获取全部3821条链接。以下是针对性的修复方案:
核心思路
循环执行滚动操作,每次滚动后等待新内容加载,直到页面滚动高度不再变化(确认没有更多内容可加载),再批量抓取所有链接。同时优化代码逻辑,减少不必要的解析步骤,修复原代码中的小错误。
修改后的完整代码
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time import ssl import undetected_chromedriver as uc ssl._create_default_https_context = ssl._create_unverified_context options = uc.ChromeOptions() driver = uc.Chrome(options=options) driver.get("http://www.servicealberta.gov.ab.ca/find-if-business-is-licenced.cfm") # 点击加载初始内容 click_on_button = driver.find_element(By.CSS_SELECTOR, "td:nth-child(1) input:nth-child(1)") click_on_button.click() # 等待初始内容加载完成 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, "tbody td[colspan='4'] a")) ) base_url = "http://www.servicealberta.gov.ab.ca/" last_height = driver.execute_script("return document.body.scrollHeight") # 循环滚动加载所有内容 while True: # 滚动到当前页底 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待新内容加载(可根据页面加载速度调整时间) time.sleep(3) # 获取新的滚动高度 new_height = driver.execute_script("return document.body.scrollHeight") # 若高度不再变化,说明已加载全部内容 if new_height == last_height: break last_height = new_height # 直接用Selenium抓取所有链接(无需BeautifulSoup转换) links = driver.find_elements(By.CSS_SELECTOR, "tbody td[colspan='4'] a") full_links = [] for link in links: href = link.get_attribute('href') # 处理相对链接 if not href.startswith('http'): href = base_url + href full_links.append(href) print(href) # 输出总数量(修复原代码的错误:原代码打印的是单个url的长度,不是链接总数) print(f"共抓取到 {len(full_links)} 条链接") driver.quit()
关键优化点
- 循环滚动加载:通过对比滚动前后的页面高度,确保所有懒加载内容都被触发加载
- 智能等待:用
WebDriverWait替代固定time.sleep等待初始内容,提升代码稳定性;滚动后保留合理的等待时间,给页面足够的加载缓冲 - 直接抓取元素:跳过BeautifulSoup解析步骤,直接用Selenium获取元素属性,避免页面源和实时DOM不一致的问题
- 修复计数错误:原代码最后
print(len(url))是错误的,修改为统计链接列表的长度
内容的提问来源于stack exchange,提问作者Arslan Aziz
相关产品推荐
相关产品推荐

