Nstproxy 现已升级为 Nstdata。了解此次变化。
周一至周五 09:00 - 18:00(UTC+08:00) 公司地址
19H MAXGRAND PLAZA NO.3 TAI YAU STREET SAN PO KONG, KOWLOON HONG KONG ©2026 NST LABS TECH LTD. 保留所有权利。
网站表格抓取:导出可靠的CSV和JSON
Kai Watanabe Scraping Infrastructure Evangelist
从网站抓取表格到CSV/JSON TL;DR
一个网页表格只有在检查其行和列的含义后,才能成为可用的 CSV 或 JSON。
爬虫获取渲染的表格 HTML;你的解析器将审核过的单元格转化为 CSV 或 JSON 记录。
在导出前拒绝或明确处理合并单元格、嵌套标题、单位和分页。
当可见网格与返回的 HTML 不一致时,截图非常有用。
Nstdata 爬虫处理 JavaScript 渲染和托管请求中的代理路由;其文档列出了六种输出类别:Markdown、HTML、原始数据、PDF、截图和链接。
免费试用 Nstdata →
抓取网站表格意味着什么?
抓取表格意味着将可视或 HTML 网格转换为具有稳定列含义的记录。许多简单的表格使用 <table>、<tr>、<th> 和 <td>,但真实页面可能使用合并单元格、嵌套标题或基于 div 的网格。CSV 需要矩形行形状;JSON 可以保留嵌套或可选字段。在解释单位、标题层次结构和缺失值之前,任何格式都是不正确的。
Nstdata 爬虫 可以将一个 URL 或一组链接页面转换为 AI 代理、RAG 索引或数据管道的材料。使用你自己的字段规则和接受检查来实现特定结果:检索允许的表格,保留其标题,并将验证过的行导出为 CSV 或 JSON。Nstdata 全站爬取指南 解释了站点级选项。
对于这里涉及的狭义任务,Nstdata 网站到 JSON 指南 为选择第一个表示页面提供了有用的背景。
开始之前你需要什么?
选择一个授权的表格页面,并识别其标题、预期列名、单位和至少两行已知数据。决定如何处理 rowspan、colspan、空单元格、脚注和单元格内的链接。如果表格实际上是一个 div 网格,请规划一个特定模板的解析器,而不是强迫 HTML 表格库进行猜测。与导出文件一起保留源 URL 和检索时间。
Crawl API 文档 使用 https://api.nstdata.io、x-api-key 头部和 Content-Type: application/json。在运行方法之前准备这些字段:
字段 需要提供的内容 url一个允许的 HTTPS 页面或站点入口 URL formats请求的输出,如 ["markdown"] 或 ["html","screenshot"] onlyMainContent仅当主内容选择符合任务时为 true maxDepth, maxPages针对全站工作的明确界限 includeUrls, excludeUrls保持发现范围内的 URL 模式 timeout当默认时间不适合时,任务超时的毫秒数
标准的托管请求没有单独的代理 Host、Port、Username、Password 或 Protocol 字段。在运行大量作业之前,请查看 当前 Crawl 价格页面 以了解帐户限制和费用。
审查目标的访问政策和范围。机器人排除协议 定义了爬虫如何读取机器人规则;它不授予内容使用权。在示例和诊断日志中保留凭证和私人数据。
HTML 表格如何变成 CSV 或 JSON? Nstdata 爬虫可以渲染 JavaScript 并返回清理过的 HTML 或原始页面数据。其 API 不在可见文档中承诺完成的 CSV 表格导出。使用爬虫获取预期页面状态,然后在你自己的代码中解析审核过的表格。内置的代理路由消除了将单独代理凭据放入标准爬虫请求中的必要性。当可见表格与返回的 HTML 不一致时,保存截图。
对于已知的 URL,单页面抓取检索一个结果。对于站点部分,POST /api/v1/crawl 在提供的深度、页面计数和 URL 规则内递归发现链接页面。文档 列出 Markdown、HTML、原始数据、PDF、截图和链接作为六个输出类别;产品页面也宣传 JSON,但特定领域的 JSON 模式仍需显式字段映射。保持每个接受的记录与其源 URL 和返回的元数据相关联。
在扩展之前测试一个典型的 JavaScript 密集页面。渲染状态可能依赖于时间、地区、同意或已登录的会话。将返回的 HTML 或屏幕截图与预期的页面状态进行比较;如果它们不同,调整文档中规定的渲染和等待控制。
如何将网站表格抓取到 CSV 或 JSON? 首先检查实际的表格结构,获取渲染的 HTML,然后将单元格规范化为记录。解析步骤是工作流的一部分,因为 Crawl 不记录完整的 CSV 表格端点。
方法 1:在 Crawl Playground 中检查表格
步骤 1:打开目标页面 转到 Dashboard → Crawl Playground 并输入允许的表格 URL。 [截图:目标 URL 和输出格式选择器。]
步骤 2:请求 HTML 和截图 选择 HTML 和截图输出。如果表格行在 JavaScript 执行后出现,则渲染页面;使用 Playground 中可见的文档化等待控制。
步骤 3:比较结构 检查返回的 HTML 是否包含预期的 <table>,并且其可见标题是否与截图匹配。如果数据仅在画布或图像中,则 HTML 解析器无法直接恢复单元格。
方法 2:通过 API 获取渲染的表格
步骤 1:存储 Crawl 密钥 将 NSTDATA_API_TOKEN 保存在服务器端,并将其作为 x-api-key 发送。
步骤 2:请求 HTML 使用下面记录的单页面快速启动路由。保留返回的 HTML 或 htmlRef 以及页面元数据以用于解析;在使用之前请确认 Playground 中生成的路由,因为文档在其它地方显示不一致的标签。
在你的 shell 中从 Nstdata 账户设置 NSTDATA_API_TOKEN,然后运行记录的快速启动请求。公共文档对其他某些同步和异步路由的标签不一致;在生产使用之前,请比较你的账户在 Playground 中生成的请求。
curl --output crawl-response.json --request POST "https://api.nstdata.io/api/v1/crawl/scrape/submit-sync" \
--header "x-api-key: ${NSTDATA_API_TOKEN} " \
--header "Content-Type: application/json" \
--data '{"url":"https://example.com/table","formats":["html","screenshot"]}'
响应被保存到 crawl-response.json。在使用任何返回内容之前,请检查嵌套的 data.success、data.status 和 data.data.metadata.statusCode 字段。
步骤 3:检查表格是否存在 在导出之前,需要成功的页面任务,并检查是否出现预期的标题或表头。不要将空页面转变为看似成功的空 CSV。
方法 3:将单元格规范化为记录
步骤 1:选择一个表格 通过稳定的标题、附近的表头或经过审查的选择器进行选择,而不是盲目选择第一个表格。
步骤 2:扩展标题和跨度语义 考虑合并的行和列;当 rowspan 或 colspan 改变列的意义时,简单的矩形解析器不足。
步骤 3:导出和审核 以明确的编码和列顺序写入 CSV,或以类型字段写入 JSON。将一部分行、单位和总计与渲染源进行比较。
对于一个简单的矩形 HTML 表格,保存返回的 html 或下载 htmlRef 到 page.html。安装 beautifulsoup4 (python3 -m pip install beautifulsoup4),并从同一目录运行此脚本。它会拒绝合并单元格,以免你无意中损坏列的意义:
from bs4 import BeautifulSoup
import csv , json
soup = BeautifulSoup ( open ( "page.html" , encoding = "utf-8" ) . read ( ) , "html.parser" )
table = soup . select_one ( "table" )
if table is None :
raise ValueError ( "没有找到 HTML 表格;检查渲染 HTML 或截图" )
rows = [ ]
for tr in table . select ( "tr" ) :
cells = tr . find_all ( [ "th" , "td" ] , recursive = False )
if any ( c . has_attr ( "rowspan" ) or c . has_attr ( "colspan" ) for c in cells ) :
raise ValueError ( "合并单元格需要特定于表格的规范化规则" )
if cells :
rows . append ( [ c . get_text ( " " , strip = True ) for c in cells ] )
headers , * values = rows
if not headers or any ( len ( row ) != len ( headers ) for row in values ) :
raise ValueError ( "缺少标题或行宽不一致" )
records = [ dict ( zip ( headers , row ) ) for row in values ]
with open ( "table.csv" , "w" , newline = "" , encoding = "utf-8" ) as f :
writer = csv . DictWriter ( f , fieldnames = headers )
writer . writeheader ( )
writer . writerows ( records )
open ( "table.json" , "w" , encoding = "utf-8" ) . write ( json . dumps ( records , ensure_ascii = False , indent = 2 ) )
print ( f"导出 { len ( records ) } 行" )
检查导出的第一行和最后一行,单位和脚注与页面是否一致。此解析器处理一个具有一行标题的真实<table>;一个div网格、嵌套标题或分页表格需要特定于源的规则。
如何验证输出? 记录源URL、提交时间、请求格式、非机密选项、任务ID(如存在)、返回页面状态以及每条记录通过或未通过审核的原因。检查内容以及API信封。如果响应包含markdownRef、htmlRef、rawDataRef、screenshotRef或pdfRef,使用GET /api/v1/crawl/storage/read?st={ref}检索该令牌。
表导出可能有错误列的原因是什么? 网站表格抓取可能失败,因为页面使用了div网格或在初始渲染后加载数据。使用症状表识别失败层,以便在更改限制或重试之前。
| HTML中没有<table> | 页面使用了div网格或在初始渲染后加载的数据。 | 检查屏幕截图和DOM;等待网格或使用特定于模板的选择器。 |
| 导出后列移位 | 合并单元格或多个标题行已被压平。 | 展开跨度并明确映射标题层级。 |
| 数字格式更改 | 区域、货币或单位推断不正确。 | 保留原始文本并使用声明的区域和单位规则进行规范化。 |
Nstdata的文档列出了任务级错误,例如access_denied、timeout、parse_error和internal_error。外部HTTP 200仍可能伴随失败的任务。检查响应中(如存在)success、status、errorCode和errorMessage。仅对您可以访问的网站上的瞬态故障进行重试。
哪种方法最合适? 使用Playground检查表是否存在,使用API获取其呈现的HTML,并使用特定于表的解析器导出CSV或JSON。在您拥有明确的规范化规则之前,拒绝合并单元格。Nstdata站点抓取概述 提供更多关于站点路径的详细信息。
首次成功运行后应做什么? 保存已批准的配置和一个源支持的输出记录,然后在一小组不同的页面模板上重复。只有在这些记录通过相同的接受检查后,才增加范围。
常见问题:还有什么需要知道? 可见的Crawl文档没有建立CSV输出模式。检索HTML或页面数据,然后在您的应用程序中导出经过审核的行。
一个库可能会展开某些跨度,但您仍然需要验证标题的含义和行的对齐。
检查呈现的DOM,并为该网格的实际结构编写解析器;HTML表格解析器可能找不到任何内容。
问:网站表格抓取是否需要与Nstdata Crawl单独的代理配置?
标准的托管爬虫请求不需要单独的代理主机、端口、用户名、密码或协议字段。请在您的帐户中确认任何可选的自定义代理选择和相关使用费用。
问:HTTP 200 是否证明网站表格抓取结果是可用的?
不。在将其用于 AI 或数据工作流程之前,请检查嵌套任务结果、页面状态、预期字段和正文准确性。
Oct. 28th 2026
支持 JavaScript 渲染,成功率达 99.8%
将任意网站转换为 Markdown、HTML、JSON、链接、PDF 等格式,无需管理爬取基础设施。 开始免费爬取 →