博主辛苦了,我要打赏银两给博主,犒劳犒劳站长。
【摘要】这几天在学习 phantomjs ,今天学习到了如何实现使用 phantomjs 爬取由 ajax 异步生成的数据,这里做个笔记。
首先,需要了解一下 ajax , ajax 是一个异步输出的技术,当普通的爬虫爬取网页的时候,发送 http 请求,而获取到的都是 http 请求后直接的响应数据,然后在网页中可能还有 ajax ,这是网页向服务器发送的异步请求数据,这是第二次 http 请求,但爬虫是获取不到的。
实际问题如下:
淘宝的某个商品链接:https://item.taobao.com/item.htm?id=545533644459
当第一次加载的是时候,并不是把所有的数据都一次性全部加载到网页中的,如图所示:
红色方框中的累计评论数和交易成功数就是使用 ajax 异步输出的。当整个网页所有的请求都加载完毕之后,数据会显示出来:
之后,当我们查看网页源代码的时候,累计评论数和交易成功数都是 "-":
本文所用的解决办法,直接上代码:
var webPage = require('webpage'); // 创建一个 webpage 模块的实例
var page = webPage.create();
var taobaoURL = 'https://item.taobao.com/item.htm?id=545533644459'; // 淘宝某一商品的链接
page.viewportSize = { width: 1440, height: 1080 };
page.settings.userAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36";
// page.settings.loadImages = false; // 禁止加载图片
// page.settings.userAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.31 (KHTML, like Gecko) PhantomJS/19.0";
page.open(taobaoURL, function(status)
{
if(status !== 'success')
{
console.log("open fail!");
}else
{
// 由于是拉取异步数据,我们打开页面后,等待若干秒后再去操作 dom (这里设置成 3 秒),获取累计评论
setTimeout(function()
{
var result = page.evaluate(function()
{
return document.getElementById("J_RateCounter").innerText;
});
console.log('累计评论:' + result + '条');
// 生成当前页面截图
page.render("taobao.png");
phantom.exit();
}, 3000);
}
});
执行该文件得到最后的结果:
生成的网页截图如下:
版权归 马富天PHP博客 所有
本文标题:《使用 phantomjs 异步爬取 ajax 网页数据》
本文链接地址:http://www.mafutian.net/282.html
转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^
顶0
踩0
评论审核未开启 |