下面是关于“Node.JS利用PhantomJs抓取网页入门教程”的完整攻略。
简介
Node.JS是一个基于事件驱动的JavaScript服务器端解析器,PhantomJS是一个基于WebKit的无头浏览器,可以模拟浏览器的行为并获取网页内容。Node.js和PhantomJS的结合可以方便高效地抓取网页内容,具有广泛的应用价值。
一、准备工作
我们需要先安装Node.js以及PhantomJS,具体安装步骤可参考官方文档。安装完成之后,创建一个新的Node.js项目,使用npm安装phantom
模块即可开始抓取网页了。
# 新建Node.js项目
mkdir demo && cd demo
npm init -y
# 安装phantom模块
npm i phantom --save
二、基本用法
在Node.js项目中使用phantom的基本用法如下:
const phantom = require('phantom');
(async function() {
const instance = await phantom.create();
const page = await instance.createPage();
await page.on('onResourceRequested', function(requestData) {
console.info('Requesting', requestData.url);
});
const status = await page.open('https://www.baidu.com');
console.log(status);
const content = await page.property('content');
console.log(content);
await instance.exit();
})();
上述代码中,我们通过async/await来让异步代码看起来像同步代码。首先我们创建了一个PhantomJS实例,然后创建一个页面对象。在页面对象上,我们通过监听onResourceRequested
事件来输出请求的URL。接下来我们打开百度的首页,可以得到页面状态码以及页面的html内容。
最后,我们再调用instance.exit()
方法来关闭PhantomJS实例,避免资源浪费。
三、示例1:抓取淘宝搜索结果
下面我们来演示一个实际的应用场景,如何利用Node.js和PhantomJS抓取淘宝搜索结果。首先打开淘宝的首页,搜索‘Node.js’,然后我们可以看到搜索结果的URL为:
https://s.taobao.com/search?q=Node.js
我们可以使用PhantomJS打开这个URL,然后根据页面DOM结构获取需要的数据。
const phantom = require('phantom');
(async function() {
const instance = await phantom.create();
const page = await instance.createPage();
await page.on('onResourceRequested', function(requestData) {
console.info('Requesting', requestData.url);
});
const status = await page.open('https://s.taobao.com/search?q=Node.js');
console.log(status);
const content = await page.property('content');
const items = await page.evaluate(function() {
const resultList = document.querySelectorAll('.item.g-clearfix');
const result = [];
for (let i = 0; i < resultList.length; i++) {
const item = {};
item.title = resultList[i].querySelector('.title').innerHTML;
item.price = resultList[i].querySelector('.price').innerHTML;
item.picUrl = resultList[i].querySelector('.J_ItemPic.img').src;
result.push(item);
}
return result;
});
console.log(items);
await instance.exit();
})();
运行上述代码,可以看到获取到的淘宝搜索结果数组,包含了商品名称、价格、图片链接等信息。
四、示例2:抓取无法通过API获取的数据
有些网站的数据是可以通过API获取的,但是还有一些网站的数据是无法通过API直接获取的,比如猫眼电影的电影评论。如果你想获取猫眼电影电影评论的数据,可以通过PhantomJS模拟浏览器行为,获取评论数据。
const phantom = require('phantom');
(async function() {
const instance = await phantom.create(['--ignore-ssl-errors=yes', '--load-images=no']);
const page = await instance.createPage();
await page.on('onResourceRequested', function(requestData) {
console.info('Requesting', requestData.url);
});
await page.on('onResourceReceived', function(response) {
if (response.stage === 'end' && response.status === 200) {
console.info('Loaded', response.url);
}
});
const status = await page.open('https://piao.maoyan.com/comments/h5/box/3zz82d4vqdm3');
console.log(status);
const content = await page.property('content');
const comments = await page.evaluate(function() {
const resultList = document.querySelectorAll('.comment-single');
const result = [];
for (let i = 0; i < resultList.length; i++) {
const item = {};
item.avatar = resultList[i].querySelector('.avatar img').src;
item.userName = resultList[i].querySelector('.comment-user-name').innerHTML;
item.score = resultList[i].querySelector('.comment-score').classList.length;
item.commentTime = resultList[i].querySelector('.comment-time').innerHTML;
item.content = resultList[i].querySelector('.comment-con').innerHTML;
result.push(item);
}
return result;
});
console.log(comments);
await instance.exit();
})();
上述代码中,我们模拟通过重载前端JS,调用前端提供的API来获取数据的方式来获取电影评论的数据。
总结
Node.js利用PhantomJs抓取网页可以方便快捷地获取到需要的数据。以上是一个基本的入门教程,你可以根据自己的需求对代码进行修改和扩展。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node.JS利用PhantomJs抓取网页入门教程 - Python技术站