如何抓取含隐藏表格数据的网站?Screener.in股票数据爬取求助
处理Screener.in季度业绩隐藏字段爬取方案
- 问题本质:你用的静态爬取只能拿到页面首次加载的内容,那些点击「+」才显示的字段,要么是藏在页面源码里但被CSS隐藏,要么是点击后通过AJAX动态加载的。
两种解决思路
1. 若隐藏内容已在页面DOM中(只是被隐藏)
打开页面开发者工具(F12)检查元素,要是隐藏的行已经存在于表格里,只是带了hidden这类隐藏类,直接移除隐藏属性再解析即可:
import pandas as pd from bs4 import BeautifulSoup from urllib.request import Request, urlopen from io import StringIO url = 'https://www.screener.in/company/TATAPOWER/consolidated/' req = Request(url, headers={'User-Agent': 'Mozilla/5.0'}) page = urlopen(req).read() soup = BeautifulSoup(page, 'html.parser') # 定位目标表格 table = soup.find("table", {"class": "data-table responsive-text-nowrap"}) # 移除所有隐藏行的class属性,让pandas能识别到这些行 for hidden_row in table.find_all("tr", class_="hidden"): hidden_row.attrs.pop('class', None) # 解析完整表格 df = pd.read_html(StringIO(str(table)))[0] print(df)
2. 若隐藏内容是AJAX动态加载的
点击「+」按钮时,打开开发者工具的Network标签,筛选XHR请求,找到加载隐藏数据的API接口,直接请求这个接口获取数据(比解析页面更高效):
import pandas as pd import requests headers = { 'User-Agent': 'Mozilla/5.0', 'X-Requested-With': 'XMLHttpRequest' } # 替换为你抓包得到的真实API地址,示例仅供参考 api_url = 'https://www.screener.in/api/company/TATAPOWER/consolidated/quarters/' response = requests.get(api_url, headers=headers) data = response.json() # 根据API返回的JSON结构调整DataFrame生成逻辑 df = pd.DataFrame(data['quarters']) print(df)
注意事项
- 抓包时要完全复刻浏览器的请求头和参数,否则容易被网站拦截。
- 控制请求频率,避免短时间内多次请求触发反爬机制。
内容的提问来源于stack exchange,提问作者Data-7scientist
相关产品推荐
相关产品推荐

