使用BeautifulSoup无法读取网站表格,求替代Selenium的解决方案
不用Selenium抓取动态渲染表格的替代方案
这是爬取动态网站时很常见的问题——你通过浏览器看到的表格,是页面加载完成后由JavaScript动态生成的,而requests只能获取到页面的初始静态HTML源码,自然看不到这些后续渲染出来的内容。不用Selenium的话,有几个更轻量高效的方案,我给你详细说说:
1. 直接抓取后端API接口(最推荐)
绝大多数动态加载的内容,都是前端通过AJAX/Fetch请求从后端API获取的。你可以通过浏览器开发者工具找到这个接口:
- 打开目标页面,按下F12打开开发者工具,切换到「Network」标签
- 刷新页面,在请求列表里筛选「XHR」或「Fetch」类型的请求
- 逐个查看请求的「Preview」内容,找到返回表格数据的那个接口
- 拿到接口URL和请求参数后,直接用
requests请求这个接口,就能拿到结构化的JSON数据,比解析HTML方便太多
比如你这个网站,大概率会有一个专门返回筛选结果的API,可能带类似screener_id之类的参数,请求后就能直接拿到表格里的所有数据。
2. 用requests-html执行JavaScript渲染页面
requests-html是requests的扩展库,内置了无头浏览器功能,可以加载并执行页面的JavaScript,相当于轻量级的Selenium,使用起来更简单:
首先安装库:
pip install requests-html
然后用以下代码抓取:
from requests_html import HTMLSession # 创建会话 session = HTMLSession() url = "https://chartink.com/screener/test-121377" # 发送请求 r = session.get(url) # 执行页面JavaScript,渲染动态内容 r.html.render() # 找到表格并提取数据 table = r.html.find('table', first=True) if table: # 遍历表格行 for row in table.find('tr'): # 获取每行的单元格 cells = row.find('td') if cells: # 打印每行的文本内容 print([cell.text.strip() for cell in cells])
3. 提取页面内嵌的JS变量数据
有些网站会把初始数据直接内嵌在页面的<script>标签里(比如作为全局变量),你可以用BeautifulSoup提取这部分内容,再解析成JSON:
import requests from bs4 import BeautifulSoup import json url = "https://chartink.com/screener/test-121377" r = requests.get(url) soup = BeautifulSoup(r.text, "html.parser") # 查找包含表格数据的script标签(需要根据实际页面调整关键词) script_tag = soup.find('script', text=lambda t: t and 'screener_results' in t) if script_tag: # 提取JSON字符串(这里的处理逻辑需要根据实际JS代码调整) data_str = script_tag.text.split('=')[1].strip().rstrip(';') # 解析成JSON对象 table_data = json.loads(data_str) # 处理数据 print(table_data)
这个方法需要你手动查看页面的JS代码,找到存储数据的变量名,不同网站的写法会有差异。
内容的提问来源于stack exchange,提问作者leaf
相关产品推荐
相关产品推荐

