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

Finviz爬虫代码报错求助:索引重排无效与未找到表格问题

修复Finviz数据爬取的两类报错

核心原因

你的爬虫之前正常运行,近期出问题,本质是Finviz更新了页面结构或反爬机制:

  • 第一次的pandas.errors.InvalidIndexError:页面表格的列名/索引出现重复,pandas无法正常处理重复索引
  • 调整后出现的ValueError: No tables found:pandas.read_html识别不到页面里的表格,要么是表格改成JS动态加载了,要么是反爬拦截了请求

分步修复方案

1. 解决InvalidIndexError

如果是表格索引/列名重复,读取后手动处理即可:

import pandas as pd
import requests

# 替换成你的目标Finviz URL
target_url = "https://finviz.com/..."
# 模拟浏览器请求头,避免被反爬拦截
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9"
}

# 获取页面内容
resp = requests.get(target_url, headers=headers)
# 读取页面内所有表格,关闭默认空值处理避免干扰
tables = pd.read_html(resp.text, keep_default_na=False)

# 取目标表格(通常是第一个,根据实际情况调整索引)
df = tables[0]
# 重置索引,移除重复索引
df = df.reset_index(drop=True)

# 如果列名重复,自动重命名
if len(df.columns) != len(set(df.columns)):
    df.columns = [f"{col}_{i}" if df.columns.tolist().count(col) > 1 else col for i, col in enumerate(df.columns)]

print(df.head())

2. 解决ValueError: No tables found

如果read_html找不到表格,大概率是表格靠JS动态加载,或者请求被反爬挡了,试试这两种方法:

方法一:强化请求头+精准定位表格

先用BeautifulSoup定位目标表格的HTML片段,再传给read_html:

import pandas as pd
import requests
from bs4 import BeautifulSoup

target_url = "https://finviz.com/..."
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
    "Referer": "https://finviz.com/",
    "Accept-Language": "en-US,en;q=0.9"
}

resp = requests.get(target_url, headers=headers)
soup = BeautifulSoup(resp.text, "html.parser")

# 按表格class定位(去Finviz页面F12查看实际class,比如screener-table)
target_table = soup.find("table", class_="screener-table")
if target_table:
    df = pd.read_html(str(target_table))[0]
    # 同样处理重复索引/列名
    df = df.reset_index(drop=True)
    print(df.head())
else:
    print("没找到目标表格,检查页面结构或请求是否被拦截")

方法二:用Selenium渲染动态页面

如果表格是JS加载的,requests拿不到完整内容,改用Selenium:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import pandas as pd
import time

chrome_options = Options()
# 无头模式,不弹出浏览器窗口
chrome_options.add_argument("--headless=new")
chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36")

driver = webdriver.Chrome(options=chrome_options)
driver.get("https://finviz.com/...")
# 等待2秒让页面加载完成
time.sleep(2)

# 获取渲染后的完整页面源码
page_source = driver.page_source
tables = pd.read_html(page_source)
driver.quit()

if tables:
    df = tables[0]
    df = df.reset_index(drop=True)
    print(df.head())
else:
    print("未找到表格,可能是反爬拦截或页面结构变更")

通用避坑提示

  • 每次请求加1-3秒延时,不要过于频繁,避免触发反爬被封IP
  • 定期去Finviz页面按F12查看表格结构,一旦class或标签变更,及时调整定位规则
  • 如果遇到验证码,说明触发反爬机制,需要添加代理或者进一步降低请求频率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 17:46:01