如何抓取JS动态生成的网页内容?以Wowhead节日区块为例
解决动态渲染内容的抓取问题
针对你遇到的JavaScript动态生成内容、无可用XHR接口的情况,有两种可靠的抓取方案:
1. 无头浏览器渲染完整DOM
利用浏览器引擎执行页面所有JS,生成最终渲染后的HTML再进行查询,适配你的PHP技术栈的示例:
use Spatie\Browsershot\Browsershot; // 渲染页面并获取完整HTML $html = Browsershot::url('https://www.wowhead.com/today-in-wow') ->waitUntilNetworkIdle() // 等待所有网络请求完成,确保内容加载完毕 ->bodyHtml(); // 解析HTML并执行XPath查询 $dom = new DOMDocument(); libxml_use_internal_errors(true); // 忽略HTML解析的警告 $dom->loadHTML($html); libxml_clear_errors(); $xpath = new DOMXPath($dom); $targetNodes = $xpath->query('//*[contains(@id, "EU-group-holiday-line")]'); // 提取所需内容 foreach ($targetNodes as $node) { $eventLink = $node->getElementsByTagName('a')->item(0); if ($eventLink) { $eventName = $eventLink->nodeValue; $eventUrl = $eventLink->getAttribute('href'); // 处理数据,比如存入变量或输出 } }
你也可以用Node.js的Puppeteer/Playwright实现类似逻辑,适配不同技术栈。
2. 提取页面内嵌的数据源
部分网站会把动态内容的数据源以JSON形式内嵌在页面HTML中(比如全局变量window.wowheadData之类的):
- 打开浏览器开发者工具,在Sources面板搜索
EU-group-holiday-line相关关键词,定位生成节点的JS代码,找到数据来源。 - 直接抓取原始HTML,用正则匹配出目标JSON字符串,解析后就能获取结构化数据,这种方式比无头浏览器更快,无需渲染页面。
重要提醒
爬取第三方网站必须遵守其robots.txt规则与服务条款,避免高频请求触发反爬机制导致IP封禁。
内容的提问来源于stack exchange,提问作者Zerers
相关产品推荐
相关产品推荐

