PhantomJS抓取gov.kz返回空内容,多解析工具失效求助
解决gov.kz改版后无法抓取内容的问题
嘿,我之前也碰到过不少现代政务网站切换到客户端渲染后爬虫失效的情况,咱们来一步步拆解问题并找到解决方案:
问题根源分析
gov.kz改版后大概率采用了客户端渲染框架(比如React、Vue这类),页面的实际内容是通过前端JS动态加载的。而你的PhantomJS脚本存在两个核心问题:
- PhantomJS已经停止维护多年(最后更新在2018年),对现代JS特性支持不足,可能被网站的反爬机制识别
onLoadFinished触发时,DOM结构虽然加载完成,但异步数据还没填充到页面中,导致你拿到的是空框架
方案1:修复你的PhantomJS脚本
先试试调整脚本,给页面足够的渲染时间,同时更新请求标识避免被识别:
var page = require('webpage').create(); page.settings.javascriptEnabled = true; // 替换为现代浏览器的User-Agent page.settings.userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'; page.settings.loadImages = true; page.settings.cookiesEnabled = true; page.viewportSize = { width: 1920, height: 1080 }; page.open('https://gov.kz', function(status) { if (status !== 'success') { console.log('Unable to load the address!'); phantom.exit(); } else { // 增加延迟等待异步数据加载完成(可根据实际情况调整时长) setTimeout(function() { var content = page.content; console.log('Content: ' + content); page.render('image.png'); phantom.exit(); }, 5000); // 等待5秒 } });
方案2:替换PhantomJS为Puppeteer(优先推荐)
PhantomJS已经过时,对现代前端框架的兼容性很差。Puppeteer是Chrome官方维护的无头浏览器工具,能完美支持客户端渲染页面:
步骤1:安装Puppeteer
npm install puppeteer
步骤2:编写抓取脚本 scrape-govkz.js
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch({ headless: 'new', ignoreHTTPSErrors: true, args: ['--no-sandbox', '--disable-setuid-sandbox'] // 服务器环境需要加这两个参数 }); const page = await browser.newPage(); // 配置请求参数 await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'); await page.setViewport({ width: 1920, height: 1080 }); // 等待网络空闲(确保所有异步请求完成) await page.goto('https://gov.kz', { waitUntil: 'networkidle2' }); // 可选:等待特定内容元素加载完成,避免提前抓取 await page.waitForSelector('.service-card', { timeout: 10000 }); // 获取完整渲染后的页面内容 const content = await page.content(); console.log(content); await page.screenshot({ path: 'govkz-rendered.png' }); await browser.close(); })();
步骤3:PHP中调用脚本
$response = []; exec('node scrape-govkz.js 2>&1', $response); var_dump($response);
方案3:检查官方API(最合规稳定)
很多政务网站会开放官方数据接口,这比爬虫更可靠也更合规。你可以去gov.kz的底部导航、帮助中心或开发者专区看看是否有公开的API文档,比如政务服务数据接口、RSS订阅源等,直接调用API获取信息会省去大量渲染麻烦。
方案4:优化cURL请求(仅适用于半静态页面)
如果网站部分内容是服务端渲染的,你可以尝试完善cURL的请求头,模拟真实浏览器请求:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://gov.kz'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language: en-US,en;q=0.5', 'Connection: keep-alive', 'Upgrade-Insecure-Requests: 1' ]); $content = curl_exec($ch); curl_close($ch); var_dump($content);
注意:这种方式无法获取纯客户端渲染的内容,仅作为补充方案。
内容的提问来源于stack exchange,提问作者Serik Almatov
相关产品推荐
相关产品推荐

