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

