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

使用Selenium爬取SEC页面财报链接与日期时遇超时问题求助

问题描述

我需要获取特定股票(如TSLA)对应的盈利报告及其他报告(8K、10Q等)的相关链接和日期。尝试了两种基于Selenium的遍历结果表格方法爬取,但均出现超时错误,附上相关页面截图说明及两段代码,寻求技术帮助。

相关截图说明

  • 网页截图:展示sec.report网站的文档搜索页面,包含筛选表单和结果表格区域
  • 方法1截图:展示方法1执行时的超时错误界面
  • 方法2截图(遍历表格单个结果XPath):展示方法2中针对表格单行元素的XPath定位界面

方法1代码

driver = setupDriver(download_path)
driver.get('https://sec.report/Document/Search/?queryCo=lvs&page=5')
formEle = getElements.clickHiddenEle(geshort,'//*[@id="formType"]')
    #formclick = getElements.clickHiddenEle(geshort,'//*[@id="formType"]/option[97]')
driverwait = WebDriverWait(driver,30)
driverwait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="formType"]/option[97]'))).click()
     
#    //*[@id="filer1"]
driverwait = WebDriverWait(driver,15)

companyname = driverwait.until(EC.presence_of_element_located((By.ID, "filer1")))
companyname.clear()
companyname.send_keys("TSLA")
searchEle = getElements.clickHiddenEle(geshort,'//*[@id="searchtext"]/div[4]/div/div[2]/button')
wait = WebDriverWait(driver, 30)
links = wait.until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="results"]/div[2]/table/tbody/a')))
for link in links:
    print(link.get_attribute('href'))

方法2代码

driver = setupDriver(download_path)
driver.get('https://sec.report/Document/Search/?queryCo=lvs&page=5')
formEle = getElements.clickHiddenEle(geshort,'//*[@id="formType"]')
    #formclick = getElements.clickHiddenEle(geshort,'//*[@id="formType"]/option[97]')
driverwait = WebDriverWait(driver,30)
driverwait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="formType"]/option[97]'))).click()
     
#    //*[@id="filer1"]
driverwait = WebDriverWait(driver,15)

companyname = driverwait.until(EC.presence_of_element_located((By.ID, "filer1")))
companyname.clear()
companyname.send_keys("TSLA")
searchEle = getElements.clickHiddenEle(geshort,'//*[@id="searchtext"]/div[4]/div/div[2]/button')
href = []
for i in range(0,200):
    wait = WebDriverWait(driver, 40)
    wait.until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="results"]/div[2]/table/tbody/tr[6]/td['+str(i)+']/div[1]')))
    headings = driver.find_elements_by_xpath('//*[@id="results"]/div[2]/table/tbody/tr['+str(i)+']/td[1]/div[1]')
    link = heading.find_element_by_tag_name("a")
    x = link.get_attribute("href")
    href.append(x)
print(href)

问题分析与修复方案

核心问题定位

两种方法的超时主要源于XPath定位错误、页面加载逻辑处理不当、自定义交互方法不稳定这三个点,以下是针对性修复:

1. 修正XPath定位逻辑

  • 方法1中直接定位tbody/a会遗漏嵌套结构,应先定位所有表格行,再逐行提取链接和日期:
    # 替换原links定位代码
    searchEle.click()
    wait = WebDriverWait(driver, 40)
    # 等待所有结果行加载完成
    rows = wait.until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="results"]/div[2]/table/tbody/tr')))
    for row in rows:
        # 提取报告链接
        link_ele = row.find_element(By.XPATH, './/td[1]/div[1]/a')
        report_link = link_ele.get_attribute('href')
        # 提取报告日期
        date_ele = row.find_element(By.XPATH, './/td[4]')
        report_date = date_ele.text
        print(f"报告链接:{report_link},日期:{report_date}")
    
  • 方法2中循环范围range(0,200)远超实际结果行数,且存在变量名错误(headings定义后用heading调用),修正后:
    href = []
    searchEle.click()
    wait = WebDriverWait(driver, 40)
    rows = wait.until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="results"]/div[2]/table/tbody/tr')))
    for row in rows:
        try:
            link_ele = row.find_element(By.XPATH, './/td[1]/div[1]/a')
            report_link = link_ele.get_attribute('href')
            date_ele = row.find_element(By.XPATH, './/td[4]')
            report_date = date_ele.text
            href.append({"链接": report_link, "日期": report_date})
        except NoSuchElementException:
            continue
    print(href)
    

2. 优化页面加载处理

搜索按钮点击后,页面可能因动态渲染延迟加载结果,可添加滚动触发加载并延长等待时间:

search_btn.click()
# 滚动页面触发动态加载
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
wait = WebDriverWait(driver, 40)

3. 替换不稳定的自定义交互方法

避免使用自定义的getElements.clickHiddenEle,改用Selenium原生API提升稳定性:

# 替换表单选择代码(使用Select类更可靠)
from selenium.webdriver.support.ui import Select
form_select = Select(driver.find_element(By.ID, "formType"))
form_select.select_by_index(96)  # 索引从0开始,原option[97]对应索引96

# 替换搜索按钮点击代码
search_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="searchtext"]/div[4]/div/div[2]/button')))
search_btn.click()

4. 修正初始访问URL

初始URL携带lvs和page=5参数可能干扰搜索逻辑,建议直接访问空白搜索页:

driver.get('https://sec.report/Document/Search/')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:45:41