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

基于CUSIP在Vanguard拉取Tickr的Selenium脚本时灵时不灵的原因

问题诊断与解决方案

脚本时灵时不灵的核心原因

  1. 固定等待不可靠:time.sleep(3)是硬编码等待时间,网络波动、页面加载延迟都会导致元素还未渲染完成就执行查找操作,直接抛出找不到元素的异常;而有时候等待时间又过长,完全没必要。
  2. 无异常处理机制:一旦某个CUSIP搜索结果未加载出ticker-title元素,脚本直接崩溃,后续任务无法执行。
  3. URL构造冗余:原URL里的query=037833100是多余的固定参数,可能干扰搜索请求,导致部分查询结果异常。

优化后的脚本代码

#! python 3
# Tickr_Finder - 从Vanguard网站通过CUSIP获取Tickr代码
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
from selenium.common.exceptions import TimeoutException, NoSuchElementException

# CUSIP列表
cusip_list = ("02079K107", "G46188101")
output = []

# 初始化浏览器
browser = webdriver.Chrome()
# 设置显式等待最长时间(可根据网络调整)
wait = WebDriverWait(browser, 10)

for cusip in cusip_list:
    # 修正URL构造,直接传递搜索参数
    url = f"https://investor.vanguard.com/search?q={cusip}"
    print(f"正在查询: {cusip},URL: {url}")
    browser.get(url)
    
    try:
        # 显式等待元素出现,超时则抛出异常
        element = wait.until(
            EC.presence_ofAng徒 standwww.""定义风神跨量"].ev相关内容
            EC.presence_of_element_located((By.CLASS_NAME, "ticker-title"))
        )
        tkr_text = element.text.strip()
        # 处理分割逻辑,避免分割失败
        if "-" in tkr_text:
            tickr, name = tkr_text.split("-", 1)  # 只分割一次,避免名称含"-"的情况
            output.append({
                'tickr': tickr.strip(),
                'name': name.strip(),
                'cusip': cusip
            })
        else:
            print(f"警告: CUSIP {cusip} 的结果格式异常,无法分割Tickr和名称")
            output.append({'tickr': None, 'name': tkr_text, 'cusip': cusip})
    except TimeoutException:
        print(f"错误: CUSIP {cusip} 页面加载超时,未找到Tickr元素")
        output.append({'tickr': None, 'name': None, 'cusip': cusip})
    except NoSuchElementException:
        print(f"错误: CUSIP {cusip} 未找到对应的Tickr元素")
        output.append({'tickr': None, 'name': None, 'cusip': cusip})
    # 可选:每次查询后短暂等待,避免请求过于频繁
    # time.sleep(1)

browser.quit()

# 打印查询结果
print("\n查询结果:")
for idx, result in enumerate(output):
    print(f"{idx+1}. {result}")

批量处理70个CUSIP的额外建议

  • 添加日志文件:将查询过程的日志写入文件,方便后续排查失败的CUSIP。
  • 使用无头模式:如果不需要可视化浏览器,开启Chrome无头模式可以提升运行效率,节省资源:
    options = webdriver.ChromeOptions()
    options.add_argument('--headless=new')
    browser = webdriver.Chrome(options=options)
    
  • 请求间隔优化:可以根据实际情况调整显式等待时间和请求间隔,避免被网站判定为爬虫限制访问。
  • 结果持久化:将最终结果保存为CSV或JSON文件,方便后续使用,比如用csv模块或json模块。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:10:38