如何正确拼接基础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
相关产品推荐
相关产品推荐

