Node.JS利用PhantomJs抓取网页入门教程

下面是关于“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技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • Node.js内置模块events事件监听发射详解

    Node.js 内置模块 events 为发布-订阅模式提供了基础。该模块提供了两个类:EventEmitter 和 Class。EventEmitter 是所有事件侦听器类的父类,而 Class 则使其更容易地进行继承。 EventEmitter 类 EventEmitter 类提供了一些方法来操作事件: on(eventName, listener) -…

    node js 2023年6月8日
    00
  • nodejs环境快速操作mysql数据库的方法详解

    Node.js 环境快速操作 MySQL 数据库的方法详解 在 Node.js 环境下,使用 MySQL 数据库是非常普遍的,这里提供一份快速操作 MySQL 数据库的攻略。 安装 mysql 模块 首先需要安装 mysql 模块,可以使用 npm 安装: npm install mysql 连接 MySQL 数据库 使用 mysql 模块连接 MySQL …

    node js 2023年6月8日
    00
  • 详解Node.js读写中文内容文件操作

    详解Node.js读写中文内容文件操作 在Node.js开发中,读写文件是常见的操作,但是当文件中含有中文字符时,就需要注意文件编码的问题。本文将为大家详细介绍如何在Node.js中正确地读写中文内容的文件。 文件编码的常见问题 在Node.js中读写文件时,需要注意文件编码的问题。常见的文件编码有utf-8、gbk等。如果选择错误的编码方式,将导致读出的内…

    node js 2023年6月8日
    00
  • Express 框架中使用 EJS 模板引擎并结合 silly-datetime 库进行日期格式化的实现方法 原创

    下面是如何在 Express 框架中使用 EJS 模板引擎并结合 silly-datetime 库进行日期格式化的实现方法,分为以下两个步骤: 步骤一:安装和配置 1. 安装 Express 和 EJS 在项目根目录中运行以下命令来安装 Express 和 EJS: npm install express ejs –save 2. 安装 silly-dat…

    node js 2023年6月8日
    00
  • nodejs导出excel的方法

    下面是“Node.js导出Excel的方法”的完整攻略: 1. 安装依赖包 在Node.js中,我们可以使用exceljs模块来实现导出Excel文件的功能。因此,需要先使用npm安装该模块: npm install exceljs –save 2. 创建Excel文件并添加数据 安装完成后,我们可以在代码中引入该模块,创建一个Workbook对象,然后在…

    node js 2023年6月8日
    00
  • NodeJS url验证(url-valid)的使用方法

    NodeJS中使用url-valid模块进行URL验证可以非常方便地判断一个URL是否合法。下面是使用方法的详细攻略: 安装url-valid模块 首先需要在NodeJS项目中安装url-valid模块。使用npm包管理工具执行以下命令即可: npm install url-valid 引入url-valid模块 在需要使用url-valid模块的文件中,使…

    node js 2023年6月8日
    00
  • 浅谈如何把Node项目部署到服务器上

    让我来详细讲解如何把Node项目部署到服务器上的完整攻略。这里将分为以下步骤: 在服务器上安装Node.js,可以通过以下命令安装: $ sudo apt-get update $ sudo apt-get install nodejs 在服务器上安装Nginx,可以通过以下命令安装: $ sudo apt-get install nginx 配置Nginx…

    node js 2023年6月8日
    00
  • node.js中的path.resolve方法使用说明

    当我们在编写 Node.js 代码时,经常需要拼接不同的路径,这时使用 path.resolve 方法可以非常方便地实现路径拼接和处理,使得路径的操作更加易于维护和扩展。下面,我将为大家详细介绍 path.resolve 方法的使用说明。 1. 方法介绍 path.resolve 方法是 Node.js 提供的基础模块 path 的一个方法,它可以将多个参数…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部