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:模块查找,引用及缓存机制详解

    下面为您详细讲解“Node.js:模块查找,引用及缓存机制详解”的完整攻略。 Node.js:模块查找、引用及缓存机制详解 模块查找 在 Node.js 中,require 方法用于加载模块。当加载一个模块时,Node.js 需要使用一定的规则来查找该模块,这些规则将在下面详细解释。 核心模块 当加载一个核心模块时,Node.js 会优先从内置的核心模块列表…

    node js 2023年6月8日
    00
  • js一般方法改写成面向对象方法的无限级折叠菜单示例代码

    针对“js一般方法改写成面向对象方法的无限级折叠菜单示例代码”的完整攻略,我将分为以下几个部分进行介绍: 理解折叠菜单的基本原理 将一般方法改写成面向对象方法 根据面向对象方法实现无限级折叠菜单 示例说明 1. 理解折叠菜单的基本原理 折叠菜单是一种常见的交互式Web控件,它可以让用户在点击相应的菜单项时展开或收起相应的内容。实现折叠菜单的核心在于控制菜单项…

    node js 2023年6月8日
    00
  • Nodejs提取网址参数解决“querystring”已弃用问题

    Node.js提供了一个“querystring”模块用于解析URL查询字符串,并将其转换为JSON对象。然而,在最新的Node.js版本中,“querystring”模块已经被弃用了,取而代之的是“querystring.parse()”和“querystring.stringify()”方法。这里介绍一下如何使用这两个方法来提取网址参数。 1. 使用qu…

    node js 2023年6月8日
    00
  • Node.js开发之访问Redis数据库教程

    Node.js开发之访问Redis数据库教程 什么是Redis数据库? Redis(Remote Dictionary Server)是一种基于键值对的开源数据结构存储系统,是一种高效的内存数据存储服务,它支持多种数据结构(string、hash、list、set、zset等),提供了丰富的数据操作命令,支持事务、持久化等高级功能,常用于缓存、消息队列、分布…

    node js 2023年6月8日
    00
  • 详解如何在vscode里面调试js和node.js的方法步骤

    在VS Code中调试JavaScript和Node.js的方法步骤如下: 步骤一:在项目中添加调试配置文件 在VS Code中,我们需要在项目中添加一个调试配置文件launch.json。该文件用于配置调试器的行为和选项,以便在调试时获取所需的上下文。 要添加launch.json文件,请按照以下步骤操作: 在VS Code中打开您的项目。 点击VS Co…

    node js 2023年6月8日
    00
  • socket.io断线重连的几种场景及处理方法

    Socket.IO断线重连的几种场景及处理方法 在使用Socket.IO时,由于网络或服务器等原因,可能会出现断线的情况。本文将详细讲解Socket.IO断线重连的几种场景及处理方法。 场景一:客户端主动断开连接 当客户端主动断开连接时,Socket.IO会触发disconnect事件。如果需要重连,可以在disconnect事件中调用socket.conn…

    node js 2023年6月8日
    00
  • NodeJS自定义模块写法(详解)

    NodeJS是一种使用JavaScript编写服务器端应用程序的平台。开发者可以使用NodeJS扩展自己的项目,并编写自定义模块来提高应用的可复用性和可维护性。 本文将介绍如何编写NodeJS自定义模块的详细攻略,主要包含以下内容: 模块的定义:使用module.exports对象或exports对象 module.exports对象和exports对象都是…

    node js 2023年6月8日
    00
  • python 如何在测试中使用 Mock

    Python中的Mock是一个强大的测试工具,用于模拟复杂系统中的组件。它可以模拟在测试中使用的对象的行为和属性,使测试更加可控和可预测。下面介绍如何在Python测试中使用Mock的完整攻略。 步骤一:安装Mock库 通过pip安装Mock库: pip install mock 步骤二:引入Mock库 在测试文件中引入Mock库: from unittes…

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