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

Selenium爬取Capterra返回None 批量获取企业简介页链接问题

问题原因

现有代码无法获取全量链接的核心问题有3个:

  • 点击「Show More」前就已经抓取了页面源码存入page变量,点击后新内容渲染完成也没有重新获取源码,解析的始终是初始加载的页面
  • 仅执行了一次点击操作,没有循环触发加载逻辑,无法拉取所有批次的企业内容
  • 提取链接时没有做有效性校验,部分匹配nb-mb-0类名的div下不存在a标签,直接取div.a就会返回None,也没有按照需求过滤href包含/p/的链接
修复后完整代码
from bs4 import BeautifulSoup as bs
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
import time

# 初始化浏览器
driver = webdriver.Firefox()
driver.get("https://www.capterra.com/waste-management-software/")
wait = WebDriverWait(driver, 10)
# 用集合存储链接自动去重
all_profile_links = set()

while True:
    # 每次等待当前页内容渲染完成后重新获取源码
    wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.nb-mb-0")))
    page = bs(driver.page_source, 'html.parser')
    
    # 提取符合规则的链接
    for div in page.find_all("div", attrs={"class": "nb-mb-0"}):
        a_tag = div.find("a")
        # 校验标签有效性和链接规则
        if a_tag and a_tag.get("href") and "/p/" in a_tag.get("href"):
            # 补全相对路径为完整链接
            link = a_tag["href"]
            if link.startswith("/"):
                link = "https://www.capterra.com" + link
            all_profile_links.add(link)
    
    # 查找Show More按钮,找不到就说明所有内容加载完成,跳出循环
    try:
        show_more_btn = wait.until(EC.element_to_be_clickable(
            (By.XPATH, "//*[contains(text(), 'Show More')]")
        ))
        # 滚动到按钮位置避免遮挡,点击加载下一批
        driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", show_more_btn)
        time.sleep(1.5) # 加短间隔避免触发反爬
        show_more_btn.click()
        # 等待新内容加载,判断链接数量增长
        wait.until(lambda d: len(bs(d.page_source, 'html.parser').find_all("div", attrs={"class": "nb-mb-0"})) > len(all_profile_links))
    except Exception:
        # 按钮不可点击/不存在时结束循环
        break

# 输出结果
print(f"共获取到{len(all_profile_links)}条企业profile链接:")
for link in all_profile_links:
    print(link)

driver.quit()
注意事项
  • Capterra有反爬机制,不要把time.sleep的间隔设得太短,建议保持1秒以上,操作过快会触发验证码或者IP封禁
  • 首次进入页面如果弹出cookie授权、广告弹窗,需要先加逻辑关闭弹窗,否则会遮挡「Show More」按钮导致点击失败
  • 如果前端更新后类名nb-mb-0发生变化,可以替换为产品卡片的其他稳定定位属性,比如通过卡片容器的特征属性定位,不要依赖动态生成的带哈希值的类名

内容的提问来源于stack exchange,提问作者BQuist

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:18:47