尝试抓取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
相关产品推荐
相关产品推荐

