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
相关产品推荐
相关产品推荐

