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

尝试抓取table-light表格失败,求有效网页爬取方案

解决方案

问题分析

  • 直接调用pd.read_html或requests请求时,未携带浏览器请求头,被Finviz的反爬机制拦截,导致无法获取正确表格数据。
  • 使用BeautifulSoup时,错误将表格的class属性table-light当作标签名查找,正确方式是通过class选择器定位表格。

方法一:Pandas + 请求头

通过携带请求头绕过反爬,直接用Pandas解析表格:

import pandas as pd
import requests

url = 'https://finviz.com/groups.ashx?g=industry&v=120&o=marketcap'
# 模拟浏览器请求头,可替换为自己浏览器的真实User-Agent
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'
}

response = requests.get(url, headers=headers)
tables = pd.read_html(response.text)
# 目标表格是解析结果的第1个
df = tables[0]
# 验证数据规模
print(f"提取行数:{len(df)},列数:{len(df.columns)}")
# 查看前5行数据
print(df.head())

方法二:BeautifulSoup + Pandas

先定位目标表格,再转换为DataFrame:

import requests
from bs4 import BeautifulSoup
import pandas as pd

url = 'https://finviz.com/groups.ashx?g=industry&v=120&o=marketcap'
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'
}

response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
# 通过class_参数定位目标表格
target_table = soup.find('table', class_='table-light')

# 将表格HTML转换为DataFrame
df = pd.read_html(str(target_table))[0]
print(f"提取行数:{len(df)},列数:{len(df.columns)}")
print(df.head())

注意事项

  • 请使用自己浏览器的真实User-Agent(可通过浏览器开发者工具获取),避免被反爬识别。
  • 若请求频繁被拦截,可添加time.sleep(2)这类间隔代码,降低请求频率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:15:22