使用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
相关产品推荐
相关产品推荐

