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日

相关文章

  • 初学者如何快速搭建Express开发系统步骤详解

    下面我为你详细讲解“初学者如何快速搭建Express开发系统步骤详解”: 1. 安装Node.js和npm 首先,需要安装Node.js和npm。如果你还没有安装过这两个工具,请先在官网下载安装。 2. 初始化项目 在命令行中进入项目存放的目录,并执行以下命令: npm init 按照提示输入项目信息,比如项目名称、描述、作者等等。这个过程会生成一个pack…

    node js 2023年6月8日
    00
  • node.js中的require使用详解

    Node.js 中的 require 使用详解 什么是 require 在 Node.js 中,用于加载模块的方法叫做 require。我们可以通过 require 加载 Node.js 核心模块和第三方模块,也可以加载自定义模块。 require 的使用方式 加载核心模块 在使用 Node.js 的过程中,我们经常需要使用到一些核心模块,例如 fs、htt…

    node js 2023年6月8日
    00
  • Vue全局loading及错误提示的思路与实现

    本文将详细讲解如何通过Vue全局loading及错误提示来提供良好的用户体验。该方案可用于任何基于Vue构建的项目,并且易于扩展。 需求分析 在处理异步请求时,用户需要了解操作的进展情况和任何错误信息。此时,全局loading和错误提示成为必要功能。解决方案需要解决以下需求: 可在应用程序中的所有组件中使用loading和错误提示。 loading和错误提示…

    node js 2023年6月8日
    00
  • nodejs项目windows下开机自启动的方法

    以下是详细讲解Node.js项目Windows下开机自启动的方法攻略: 方案一:使用node-windows模块 安装node-windows模块 npm install -g node-windows 在Node.js项目中引入node-windows模块 const winService = require(‘node-windows’).Service…

    node js 2023年6月8日
    00
  • windows如何把已安装的nodejs高版本降级为低版本(图文教程)

    下面是详细讲解“Windows如何把已安装的Node.js高版本降级为低版本(图文教程)”的完整攻略: 1. 为什么要降级 在开发过程中,我们会根据业务需求安装不同版本的Node.js。但是有时候我们发现新版本的Node.js与代码库之前的版本不兼容,此时就需要将Node.js降级为之前的版本来避免产生冲突。 2. 降级前的准备 在开始降级之前,我们需要确认…

    node js 2023年6月7日
    00
  • 基于node搭建服务器,写接口,调接口,跨域的实例

    首先,我们需要明确基于node搭建服务器并写接口,其实就是利用node提供的http模块来实现服务器端的开发。在搭建服务器时,需要注意以下几个步骤: 步骤1:创建一个npm项目 首先,打开命令行工具,进入要创建项目的文件夹中,输入以下命令: npm init 然后,按照提示输入项目的相关信息,如名字、版本号、描述等等。 步骤2:安装依赖库 在项目中使用到的依…

    node js 2023年6月8日
    00
  • JavaScript Image对象实现原理实例解析

    以下是关于“JavaScript Image对象实现原理实例解析”的详细攻略: 1. 简介 在网页中,图片展现是很常见的一种基础性操作。JavaScript中的Image对象可以帮助我们更好地处理图片相关的逻辑,比如加载图片、判断图片是否加载完成等等。下面我们就对其实现原理进行详解。 2. 实现原理 2.1 创建Image对象 在JavaScript中,我们…

    node js 2023年6月8日
    00
  • JS DOM 操作实现代码

    JS DOM 操作是前端开发经常涉及的知识点之一,通过对DOM进行操作可以动态地改变网页的结构和样式,实现丰富多彩的交互效果。下面是实现JS DOM操作的完整攻略: 1.获取元素对象 获取元素对象是进行DOM操作的第一步。常见的获取元素对象的方法有: 1.1.通过id获取元素对象 可以使用document.getElementById()方法通过元素的id属…

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