【实践】nodeJS写个简单的爬虫程序

2024-06-07 15:32

本文主要是介绍【实践】nodeJS写个简单的爬虫程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写在前面

经常说SEO却从来没有写过爬虫,今天很有幸看到了关于nodeJS的爬虫程序的实现,模仿着写了个demo,权当砖头抛给大家了。

程序架构

因为是基于nodeJS,我们所需准备的架构很简单,用express4.x生成一个项目,然后再安装request和cheerio模块就可以。项目的package.json是这样的:

{"name": "spider","version": "0.0.0","private": true,"scripts": {"start": "node ./bin/www"},"dependencies": {"body-parser": "~1.13.2","cookie-parser": "~1.3.5","debug": "~2.2.0","express": "~4.13.1","jade": "~1.11.0","morgan": "~1.6.1","serve-favicon": "~2.3.0"},"devDependencies": {"cheerio": "^0.19.0","request": "^2.67.0"}
}

当然你也可以直接 copy这个package.json到你自己的项目里,然后 npm install 就可以了。

cheerior模块介绍

用最简单的一句话概括 —— ”cheerior是运行在node服务端的jQuery“,也就是说 cheerior可以像jQuery一样提供简单的API去操纵DOM树。

它的API和jQuery操纵DOM的API基本一致,如果你想更深入地学习cheerior,不妨去看看它在npm的官网的标准API文档:https://www.npmjs.com/package/cheerio 。不过是英文版的哦,如果觉得看不太懂,这里还有个中文精简版的:https://cnodejs.org/topic/5203a71844e76d216a727d2e

抓取网站的源码

安装完所有的node_modules,我们就可以开始我们的抓取之旅了。当然在抓取之前我必须声明:不是每个网站的所有信息都可以爬,我们必须遵循robots协议,否则可能会涉及到法律问题。

举个例子,比如京东的robots文件:

这里写图片描述

Disallow的东西你是不能爬的,如果你去篡改这个文件那京东就可以告你侵权了。

下面再举个实际的例子,这是我抓取我们八爱网首页的一些信息,代码很简单:

app.js (为了方便我改了原本的app.js)

var express=require('express');
var request=require('request');
var cheerio=require('cheerio');
var app=express();app.get('/',function(req,res){res.charset='utf-8';request('http://www.baai.com/',function(err,response,body){if(!err && response.statusCode==200){$=cheerio.load(body); //当前$相当于整个body的选择器var proInfos=$('.pro-info>h4');var imgs=$('.pro-img>img');var imgsTemp=[],proInfosTemp=[];for(var i=0,len=imgs.length;i<len;i++){imgsTemp.push(imgs.eq(i).attr('data-original'));proInfosTemp.push(proInfos.eq(i).html());}res.json({'productImage':imgsTemp,'proInfosName':proInfosTemp});}});
});app.listen(3000);

接下来用 supervisor 启动这个node服务,对supervisor有疑问的同学欢迎出门左转翻一翻我前一篇【实践】express搭建nodeJS中间层(三),那里有比较详细的介绍。

好了,成功启动之后控制台可以看到这样的信息:

这里写图片描述

接下来我们打开浏览器,输入 127.0.0.1:3000 ,就启动这个爬虫程序了,抓取到的数据是这样的:

这里写图片描述

后话

今天就先写个简单的demo吧,感兴趣的同学可以继续研究 如何抓取 ajax 返回的内容。

这篇关于【实践】nodeJS写个简单的爬虫程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1039567

相关文章

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

Spring Boot统一异常拦截实践指南(最新推荐)

《SpringBoot统一异常拦截实践指南(最新推荐)》本文介绍了SpringBoot中统一异常处理的重要性及实现方案,包括使用`@ControllerAdvice`和`@ExceptionHand... 目录Spring Boot统一异常拦截实践指南一、为什么需要统一异常处理二、核心实现方案1. 基础组件

SpringBoot项目中Maven剔除无用Jar引用的最佳实践

《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI