基于CUSIP在Vanguard拉取Tickr的Selenium脚本时灵时不灵的原因
问题诊断与解决方案
脚本时灵时不灵的核心原因
- 固定等待不可靠:
time.sleep(3)是硬编码等待时间,网络波动、页面加载延迟都会导致元素还未渲染完成就执行查找操作,直接抛出找不到元素的异常;而有时候等待时间又过长,完全没必要。 - 无异常处理机制:一旦某个CUSIP搜索结果未加载出
ticker-title元素,脚本直接崩溃,后续任务无法执行。 - 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
相关产品推荐
相关产品推荐

