You need to enable JavaScript to run this app. 如何正确拼接基础URL与路径列表完成Crunchbase数据爬取?
优惠活动
大模型
产品
解决方案
定价
更多

如何正确拼接基础URL与路径列表完成Crunchbase数据爬取?

代码核心问题定位

你原流程跑不通主要是两个硬伤导致的,和浏览器驱动本身没关系:

  • URL拼接逻辑完全错误:写的'https://www.crunchbase.com'.join(link_list)不符合Python字符串join方法的使用规则。str.join(可迭代对象)的作用是把当前字符串作为分隔符,插入到可迭代对象的每两个相邻元素中间,这行代码跑出来会生成一整串连在一起的无意义长文本,根本不是独立的目标页面地址列表。
  • 采集流程逻辑错位:就算拼对了URL,循环里根本没有写driver.get(url)做页面跳转,元素提取代码永远只会在驱动打开的第一个页面执行;同时生成DataFrame、写CSV的代码放在了循环外面,就算提取到内容,也只会保留最后一次循环的临时变量值,前面采集的内容全都会丢失。
可落地的修正方案

1. 正确实现基础URL和路径的拼接

不要用错误的join逻辑,直接遍历路径列表和基础地址做拼接即可,两种常用写法:

  • 基础拼接:因为你的路径列表里每个路径都带开头的斜杠,直接拼接不会出现格式错误
    base_url = "https://www.crunchbase.com"
    link_list = ['/organization/4m-carbon-fiber', '/organization/aeropowder' ,'/organization/algiknit']
    urls = [base_url + path for path in link_list]
    
  • 更稳妥的通用拼接:用Python标准库的urljoin自动处理路径开头缺斜杠、多斜杠的异常格式,适配更多场景
    from urllib.parse import urljoin
    urls = [urljoin(base_url, path) for path in link_list]
    

2. 修正采集循环的执行逻辑

调整代码执行顺序:先跳转到每个目标URL,等页面加载后再提取元素,把每一轮的提取结果存在统一的列表里,循环全部跑完后再统一生成DataFrame写文件,修正后的完整可运行代码如下:

import time
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from urllib.parse import urljoin

# 初始化浏览器驱动
path = 'C:/ChromerDriver/chromedriver'
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(executable_path=path, options=options)
driver.implicitly_wait(10)

# 地址配置
base_url = "https://www.crunchbase.com"
link_list = ['/organization/4m-carbon-fiber', '/organization/aeropowder' ,'/organization/algiknit']
urls = [urljoin(base_url, path) for path in link_list]

# 统一存储采集结果
result_records = []
for url in urls:
    # 必须先跳转到当前目标页,再执行元素提取
    driver.get(url)
    try:
        name = driver.find_element(By.XPATH, '//span[contains(@class, "profile-name")]').text
        website = driver.find_element(By.XPATH, '//*[@class = "component--field-formatter layout-row layout-align-start-end link-accent ng-star-inserted"]').get_attribute('href')
        logo = driver.find_element(By.XPATH, '/html/body/chrome/div/mat-sidenav-container/mat-sidenav-content/div/ng-component/entity-v2/page-layout/div/div/profile-header/div/header/div/div/div/div[1]/identifier-image/div/img').get_attribute('src')
        # 单条结果提取成功后存入列表
        result_records.append({
            "name": name,
            "website": website,
            "logo": logo
        })
    except Exception as e:
        # 提取失败时打印日志,避免空捕获吞掉错误
        print(f"页面 {url} 内容提取失败,跳过。错误详情:{str(e)}")
        time.sleep(5)

# 所有页面采集完成后统一生成结果文件
df = pd.DataFrame(result_records)
df.to_csv('raw_data.csv', index=False)
# 采集完成后关闭驱动
driver.quit()

补充优化点

  • 替换已经被Selenium官方废弃的find_element_by_xpath旧语法,统一使用find_element(By.XXX)的新版写法,避免后续版本更新后代码失效
  • 空的except捕获块会屏蔽所有运行错误,加上日志打印后可以快速定位是页面加载超时、还是元素选择器失效的问题
  • 如果遇到动态加载内容提取失败的情况,可以把全局隐式等待替换为显式等待,等目标元素完全渲染出来后再提取,比固定的全局等待效率更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 09:06:03