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

如何使用Selenium从Crunchbase爬取EV企业创始人信息并存入DataFrame

问题解决方案

核心问题说明

  • 数据存储失败:你当前追加到company_list的是Selenium WebElement对象而非文本内容,且点击进入详情页后未执行回退操作,下一轮遍历列表元素时会因页面跳转找不到对应元素;同时你当前仅抓取了公司名称,未采集创始人、团队规模等目标字段。
  • 批量爬取逻辑不完善:当前分页逻辑仅固定执行1次分页,没有设置下一页不可用时的终止条件,且单公司抓取逻辑没有形成「跳转-抓取-回退」的完整闭环。

修复后完整代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, NoSuchElementException
import pandas as pd
import time

# 初始化驱动器
PATH = "C:/Program Files (x86)\chromedriver.exe"
driver = webdriver.Chrome(PATH)
wait = WebDriverWait(driver, 30)

# 访问EV企业列表页
driver.get("https://www.crunchbase.com/search/organizations/field/organization.companies/categories/electric-vehicle")
driver.maximize_window()
time.sleep(5)
print(driver.title)

company_list = []

while True:
    # 等待当前页列表加载完成
    wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "grid-row")))
    all_rows = driver.find_elements(By.CSS_SELECTOR, "grid-row")
    
    # 内层循环:遍历当前页所有企业
    for idx in range(len(all_rows)):
        # 每次回退后重新获取列表元素,避免元素过期
        all_rows = driver.find_elements(By.CSS_SELECTOR, "grid-row")
        row = all_rows[idx]
        try:
            # 点击进入企业详情页
            companyname = row.find_element(By.XPATH, './/*[@class="identifier-label"]')
            ActionChains(driver).move_to_element(companyname).click().perform()
            # 等待详情页加载
            wait.until(EC.presence_of_element_located((By.XPATH, './/*[@class="profile-name"]')))
            
            # 抓取目标字段,你可替换为自己的XPath
            company_info = {
                "公司名称": driver.find_element(By.XPATH, './/*[@class="profile-name"]').text,
                "创始人姓名": driver.find_element(By.XPATH, '替换为创始人姓名XPath').text,
                "性别": driver.find_element(By.XPATH, '替换为性别XPath').text,
                "毕业院校": driver.find_element(By.XPATH, '替换为教育背景XPath').text,
                "团队规模": driver.find_element(By.XPATH, '替换为团队规模XPath').text
            }
            company_list.append(company_info)
            
        except NoSuchElementException:
            # 单个字段缺失不中断整个爬取
            print(f"第{idx+1}家企业信息缺失,跳过")
        finally:
            # 无论是否抓取成功都返回列表页
            driver.back()
            # 等待列表页重新加载
            wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "grid-row")))
            time.sleep(2)
    
    # 检查是否有下一页
    try:
        next_btn = wait.until(EC.presence_of_element_located((By.XPATH, '//a[@aria-label="Next"][@type="button"]')))
        if next_btn.get_attribute("aria-disabled") == "true":
            # 没有下一页则终止循环
            break
        # 点击下一页
        ActionChains(driver).move_to_element(next_btn).click().perform()
        time.sleep(5)
    except TimeoutException:
        # 找不到下一页按钮则终止
        break

# 导出为DataFrame
df = pd.DataFrame(company_list)
# 可选:导出为csv文件
df.to_csv("ev企业创始团队信息.csv", index=False, encoding="utf-8-sig")

# 关闭驱动器
driver.quit()

关键优化点说明

  • 每次跳转详情页抓取完成后强制返回列表页,保证后续元素定位正常;每次遍历列表前重新获取元素,避免Selenium元素过期报错
  • 用while循环判断下一页按钮状态实现全量分页,不需要手动设置分页次数
  • 所有目标字段以字典形式存储,直接生成的DataFrame会自动匹配字段为列名
  • 增加了异常捕获逻辑,单个企业信息缺失不会导致整个爬取任务中断
  • 尽量替换固定等待为显式等待,提升爬取效率的同时降低元素定位失败概率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:54:03