讲师中心 微信公众号
AI工具推荐 视频效率加速

如何正确抓取动态渲染网页的标题(如AniList)

浅宇吖_3772

浅宇吖_3772

发布时间:2026-03-01 17:57:18

|

698人浏览过

|

来源于php中文网

原创

如何正确抓取动态渲染网页的标题(如AniList)

本文详解为何传统php dom解析无法获取javascript动态更新的页面标题,并提供基于api调用与无头浏览器的两种可靠解决方案,附完整代码示例与实践建议。

本文详解为何传统php dom解析无法获取javascript动态更新的页面标题,并提供基于api调用与无头浏览器的两种可靠解决方案,附完整代码示例与实践建议。

在开发网页信息提取功能时,许多开发者会使用 file_get_contents() + DOMDocument 的方式解析 HTML 并提取 <title> 或 Open Graph 标签(如 <meta property="og:title">)。这种方式对静态网站(如早期 MyAnimeList)效果良好,但面对现代前端框架构建的单页应用(SPA),例如 AniList,它往往失效——你得到的不是动画实际名称(如 "Pokémon"),而是站点默认标题 "AniList"。

根本原因在于:AniList 使用 Vue.js 在客户端动态注入内容并修改 <title> 和 og:title 标签。当你用 PHP 的 file_get_contents_curl() 获取原始 HTML 时,拿到的是未执行 JS 的“骨架页面”,此时 <meta property="og:title"> 尚未被 Vue 渲染引擎填充(或仍为占位值),而 data-vue-meta="true" 正是 Vue Meta 插件的典型标记,印证了该行为。

✅ 正确方案一:优先调用官方 API(推荐)

AniList 提供稳定、结构化且无需渲染的 GraphQL API,可精准获取动画元数据:

function getAniListTitleById($animeId) {
    $query = 'query ($id: Int!) { Media(id: $id, type: ANIME) { title { romaji english native } } }';
    $variables = ['id' => (int)$animeId];

    $payload = json_encode(['query' => $query, 'variables' => $variables]);
    $ch = curl_init('https://graphql.anilist.co');
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => $payload,
        CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
    ]);

    $response = curl_exec($ch);
    curl_close($ch);

    $data = json_decode($response, true);
    if (isset($data['data']['Media']['title']['romaji'])) {
        return $data['data']['Media']['title']['romaji']; // e.g. "Pocket Monsters"
    }
    return $data['data']['Media']['title']['english'] ?? 'Unknown Title';
}

// 示例:https://www.php.cn/link/84a98e9bea194d59e442e2be756a2e08/anime/527/Pocket-Monsters/
echo getAniListTitleById(527); // 输出:Pocket Monsters

✅ 优势:响应快、稳定性高、免反爬、支持批量查询、字段语义清晰(含多语言标题)。
⚠️ 注意:需解析 URL 中的 ID(如 /anime/527/ → 527),可借助正则 #\/anime\/(\d+)\/# 提取。

✅ 正确方案二:服务端渲染(SSR)/无头浏览器

若必须从任意 URL(非 AniList)提取最终渲染后标题,需模拟真实浏览器环境。推荐使用轻量级无头方案,如 Puppeteer(Node.js)或其 PHP 封装(如 spatie/browsershot):

composer require spatie/browsershot
use Spatie\Browsershot\Browsershot;

function getTitleFromRenderedPage($url) {
    try {
        // 截图非必需,此处仅等待 JS 执行完成并提取 document.title
        $title = Browsershot::url($url)
            ->setOption('waitUntil', 'networkidle0')
            ->evaluate("document.title");
        return trim($title);
    } catch (\Exception $e) {
        return 'Failed to render page: ' . $e->getMessage();
    }
}

echo getTitleFromRenderedPage('https://www.php.cn/link/84a98e9bea194d59e442e2be756a2e08/anime/527/Pocket-Monsters/');
// 输出:Pokémon —— 真实浏览器最终呈现的标题

⚠️ 注意事项:

  • 需部署 Chrome/Chromium 环境,增加服务器资源开销;
  • 响应延迟显著高于 API 方案(通常 1–3 秒);
  • 频繁请求可能触发风控,建议添加合理限速与 User-Agent。

❌ 为什么原代码失效?关键总结

环节 原代码行为 实际问题
数据获取 file_get_contents_curl() 仅拉取初始 HTML 未执行 JS,og:title 为空或为默认值
DOM 解析 DOMDocument::loadHTML() 解析静态结构 无法感知运行时 DOM 变更
判断逻辑 依赖 property="og:title" 属性存在即取值 属性虽存在,但 content 值尚未被 JS 填充

? 核心结论:对于任何依赖客户端 JavaScript 渲染关键元信息的网站(如 AniList、React/Vue/Angular 应用),纯服务端 HTML 解析注定失败。务必转向 API 优先策略;若无 API,则必须引入浏览器环境。

选择方案时,请始终遵循:有 API → 用 API;无 API → 用无头浏览器;绝不依赖静态 HTML 抓取动态标题。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

相关专题

更多
PHP2Shell高危漏洞修复教程
PHP2Shell高危漏洞修复教程

PHP2Shell漏洞是什么,哪些PHP版本和运行环境会受到影响,服务器应该如何检测与修复?本专题提供版本自查脚本、Linux与Docker升级命令、PHP-FPM和Apache排查步骤,以及修复验证、临时缓解和应急响应方案。

0

2026.10.22

剧云人物设定与关系管理教程
剧云人物设定与关系管理教程

本专题介绍剧云人物设定与关系管理,讲解角色小传、性格职业、人物目标、背景资料和关系网络的创建及维护方法。

0

2026.10.22

剧云故事大纲与分场规划教程
剧云故事大纲与分场规划教程

本专题讲解剧云梗概与多级大纲功能,覆盖全局、分集、分场结构生成,以及主线冲突、剧情节点和场次顺序调整。

0

2026.10.22

VibeKnow PPT讲解视频教程汇总
VibeKnow PPT讲解视频教程汇总

本专题介绍VibeKnow PPT讲解模式的素材准备、旁白生成、页面节奏、画面呈现与导出设置,适合课程和培训场景。

0

2026.10.22

VibeKnow PDF转视频教程合集
VibeKnow PDF转视频教程合集

本专题围绕VibeKnow的PDF转视频功能,讲解文件准备、内容解析、脚本生成、重点可视化及配音字幕检查方法。

0

2026.10.22

二狗PPT模板与视觉设计
二狗PPT模板与视觉设计

本专题介绍二狗PPT的职场模板、主题风格与页面版式,覆盖模板切换、色彩选择、内容匹配和正式汇报场景下的视觉优化方法。

0

2026.10.22

php漏洞修复方法
php漏洞修复方法

PHP漏洞聚合专题,持续整理PHP最新高危漏洞、CVE安全预警、受影响版本、自查命令及修复方案,覆盖PHP-FPM、Docker、Ubuntu与Linux服务器环境,帮助开发者快速完成漏洞排查、版本升级和安全加固。

20

2026.10.22

二狗PPT入门与基础操作
二狗PPT入门与基础操作

本专题整理二狗PPT从官网进入、输入主题、生成大纲到制作成稿的基础操作,帮助新手掌握AI一键生成职场PPT的完整流程。

0

2026.10.22

讯飞绘文AI配图与绘图模型合集
讯飞绘文AI配图与绘图模型合集

本专题讲解讯飞绘文AI配图与绘图2.0 Pro,覆盖提示词、画面比例、参考图、风格选择及图片优化,帮助用户制作匹配内容的视觉素材。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn