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. 保留所有权利。
Lena Zhou Growth & Integration Specialist
抓取 JavaScript 重的站点而不被封锁 TL;DR
一个重JavaScript的网站可能首先返回一个HTML壳,然后通过文档API、嵌入的页面状态或浏览器请求加载数据。检查所需内容实际出现的位置。
使用源的批准API(如果可用);否则,在为完整的浏览器渲染付费之前,解析允许的服务器渲染或嵌入的数据。
对于仅浏览器内容,等待一个有意义的元素并验证它。load和networkidle不是通用的完成信号。
“不被阻塞”依赖于授权、特定源的节奏和停止条件;渲染或代理并不能保证访问受限网站。
Nstdata Crawl可以渲染JavaScript,发现链接页面,并返回适合LLM的Markdown以及其他带有内置代理路由的工件。
为什么重JavaScript的网站会给爬虫返回空的HTML?
许多现代网站发送一个小文档,该文档加载脚本并在导航后获取有用的内容。一个直接的HTTP客户端只能看到初始响应,不能执行页面应用程序。其他网站在HTML中嵌入JSON状态对象,在服务器上渲染内容,或暴露一个文档API。合适的爬取方法依赖于获得批准的源使用的这些机制中的哪一个。
Nstdata Crawl 提供管理渲染以用于需要浏览器的允许页面。
在开发者工具中打开页面,并比较Network → Document 、Network → Fetch/XHR 和渲染的Elements 视图。[截图:初始HTML响应与渲染的产品或文章元素并排。] Playwright导航指南 指出,现代页面可能在load事件后继续加载数据。固定的睡眠时间是检查实际内容标记的糟糕替代。
免费试用Nstdata →
在开始之前你需要什么?
准备一个批准的URL、预期的数据字段、一个期望的页面标记、一个项目身份规则、源访问条款和每个主机的请求预算。决定记录必须多久刷新一次。保留一个已知的好的页面和一个失败案例以便进行验证。如果使用Playwright,请安装其库和浏览器。如果使用Nstdata Crawl,从Dashboard → Crawl Playground 获取API密钥。标准的管理抓取作业不需要单独的代理主机、端口、用户名、密码或协议字段。
使用特定源的页面分类。static_html、documented_api、embedded_state、browser_rendered、access_denied和unknown比一个称为 的布尔值更有用。类别决定了最便宜的获取路径和失败处理方式。
scrape_success
如何选择最低成本的有效获取方法?
方法 1:使用文档化的源API 步骤 1. 检查网站的开发者文档或合作协议以获取所需记录。确认API和你的预期使用是被允许的。
步骤 2. 请求一条记录,验证其ID和字段,并检查分页、配额和更新语义。保持API凭据在服务器端。
步骤 3. 存储源ID、API版本、观察时间和修正路径。如果该API对所需数据是权威的,浏览器抓取可能会增加成本,而不会提高准确性。
限制: 在开发者工具中观察到的私有端点并不自动就是一个受支持的公共API。在直接使用之前,查看条款和访问。
方法 2:解析初始HTML或嵌入状态 步骤 1. 保存初始文档响应并搜索所需值或文档化的嵌入状态有效负载。
步骤 2. 使用版本解析程序解析页面,将字段范围缩小到正确的文章或产品,并与可见页面进行验证。处理编码、区域和缺失的变体。
步骤 3. 如果数据缺失或过时,提升到渲染,而不是在空壳中添加更多选择器。
限制: 嵌入状态可能会在没有通知的情况下改变形状。保持测试及排除不再符合模式的记录。
方法 3:使用Playwright进行渲染 步骤 1. 在虚拟环境中安装Playwright及其浏览器二进制文件。选择一个已批准的页面和一个有意义的可见标记。
python -m pip install playwright
python -m playwright install chromium
步骤 2. 导航,等待标记,并仅在页面处于预期状态后提取内容:
from playwright . sync_api import sync_playwright
with sync_playwright ( ) as playwright :
```python
browser = playwright . chromium . launch ( headless = True )
try :
page = browser . new_page ( )
response = page . goto ( "https://example.com/" , wait_until = "domcontentloaded" , timeout = 30000 )
if response is None or not response . ok :
raise RuntimeError ( "导航失败" )
heading = page . get_by_role ( "heading" , level = 1 )
heading . wait_for ( state = "visible" , timeout = 10000 )
text = heading . inner_text ( ) . strip ( )
if not text :
raise ValueError ( "期望内容缺失" )
print ( { "url" : page . url , "heading" : text } )
finally :
browser . close ( )
Step 3. 用在已批准的动态页面上观察到的标记替换示例标记。验证实体和字段,并在保留政策允许的情况下保存错误的屏幕截图。如果Playwright 定位器指南 解释了可以超越生成类名称的角色和文本定位器。
Limit: 浏览器执行使用比普通 HTTP 更多的内存和处理能力,并且不允许访问受挑战或私人内容。
如何防止动态页面爬虫静默失败? 将导航成功与记录成功分开。检查响应状态、最终 URL、期望页面类型、所需文本或字段、语言环境和可见状态。200 页面可以是同意墙或挑战。动态页面可能会永远呈现加载旋转器。给任务一个有限的超时时间和拒绝原因,例如 empty_render、wrong_template、access_denied 或 missing_field。
对于多页面作业,保持一个持久的 URL 队列、来源特定的步伐和幂等写入。仅重新访问新鲜度目标要求的页面。在 429 时降低速率并遵循重试指导;在 401 或 403 时停止以进行访问审查。JavaScript 批量渲染指南 涉及浏览器准入和准备,而 负责任的爬虫指南 涉及源意识停止条件。
Nstdata 如何帮助将动态站点转变为 LLM 就绪数据? Nstdata Crawl 是一个用于批准动态页面的托管获取和转换选项。它支持 JavaScript 渲染、从种子 URL 开始的网站发现、有限递归爬虫和通过 Crawl API 的页面输出。这可以减少 AI 数据管道的浏览器集群和代理编排工作。它不取代源许可、应用领域映射或语义验证。
LLM 就绪输出: Markdown 为 RAG 和代理提供更清晰的内容;HTML 和原始数据保留解析器和调试所需的结构;链接支持发现;屏幕截图和PDF帮助确认渲染状态。Crawl 文档 列出了这些输出类别和参考标记检索。
内置代理: 标准 Crawl 请求继承 Nstdata 的代理路由,无需在客户端中配置 Host、Port、Username、Password 或 Protocol。这减少了集成工作,而源的访问和速率规则仍然适用。
站点控制: maxDepth、maxPages、includeUrls 和 excludeUrls 定义了一个有限的作业。将生成的页面集与预期库存进行比较;单个作业无法证明每个动态状态都被访问。
如何将 Nstdata Crawl 添加到动态站点管道? Step 1. 在 Dashboard → Crawl Playground 中测试一个有代表性的批准 URL。比较初始 HTML、渲染结果和预期页面标记。获取并存储 API 密钥作为 NSTDATA_API_TOKEN。
Step 2. 提交单页面请求以获取文本和证据。使用 Playground 的当前渲染控件针对特定页面;以下快速启动主体仅使用在公开 API 指南中确认的字段:
curl --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/","formats":["markdown","html","screenshot"],"onlyMainContent":true,"timeout":60000}'
步骤 3. 检查嵌套任务的成功和页面状态,然后将返回的 Markdown 或 HTML 与预期标记进行比较。通过文档化的存储端点检索大的 markdownRef、htmlRef 或 screenshotRef 值。拒绝挑战或不完整的渲染。实时请求需要一个账户密钥;该代码是文档化的集成示例。
您如何处理水合、懒加载和服务工作者? 水合可以在导航后替换服务器渲染的标记,因此立即存在的选择器可能仍会更改其值。等待稳定数据标记,然后在短时间观察窗口内或在应用程序暴露相关网络响应时比较其值。懒加载列表需要一个有限的滚动或点击循环,并设有项目 ID 验证点;到达当前 DOM 的底部并不能证明服务器没有更多结果。
服务工作者和浏览器缓存也可以改变测试所看到的内容。如果刚刚更改的页面显示为陈旧,请在开发者工具中检查请求源和响应头。在干净的浏览器环境与重用的环境之间进行比较。不要盲目禁用安全控制或缓存行为;决定产品是否需要用户的缓存视图或当前源观察,并记录所使用的方法。
对于一个循环管道,每个动态页面模板添加一个夹具。在获取后检查预期标记、项目身份、区域设置和字段。当政策允许时保留原始或渲染的工件,以便开发者可以重放提取而无需重复网站请求。将 render_timeout、access_denied 和 schema_mismatch 输出分开。它们有不同的所有者和修复,尽管三者可能都表现为空的输出记录。
定期重新检查获取选择。网站可能会添加服务器渲染、发布支持的 API 或将内容移至新的访问政策之后。记录目前每个源的提供方法、选择原因以及触发审查的信号。这可以避免仅仅因为它是第一个有效的方法而继续使用一个昂贵的浏览器工作流。
常见问题解答 问:requests 执行 JavaScript 吗?
不。它获取 HTTP 响应;它无法运行页面应用程序。
问:我应该使用在开发者工具中发现的私有 XHR 端点吗?
只有在其使用被允许且对产品稳定的情况下;更倾向于文档化的源 API 或合作安排。
Lena Zhou
Oct. 30th 2026
支持 JavaScript 渲染,成功率达 99.8%
将任意网站转换为 Markdown、HTML、JSON、链接、PDF 等格式,无需管理爬取基础设施。 开始免费爬取 →