You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 08:02:11