需求:获取某一个网站,商品的名称+价格;

以下按京东商品列表URL进行测试,

1、搭建node环境,此node安装不多介绍

2、node爬虫工具,安装 npm install crawler

3、创建index.js,直接贴代码

/*** 此js主要是通过PATH_URL,根据源码中的html风格,根据特定的标签获取HTML中的href,写入JSON文件中*/
const fs = require('fs');
const Crawler = require('crawler');
const _ = require('lodash')//在爬相关图片信息时,需要得到指定的URL:https://search.jd.com,
const PATH_URL = 'https://search.jd.com/Search?keyword=%E5%8D%8E%E4%B8%BA%E6%89%8B%E6%9C%BA&enc=utf-8&suggest=5.def.0.base&wq=huawie%E6%89%8B%E6%9C%BA&pvid=b314d64bbf02446187feba4eed246377';// 为了console输出而定义的变量
let cnt = 0;
// 查找到的HTML地址
let listDataRes = []// 爬虫抓取
const c = new Crawler({maxConnections: 10,retries: 3,  // 失败重连3次callback: function (error, res, done) {if (error) {console.log(error)} else {// 注:抓取图片的规则,需要自己定义const $ = res.$;console.log(' ------------>title: ', $('title').text())const dataList = $('.goods-list-v2 li');dataList.each((index, dataItem) => {let dataRes = {};const idKey = dataItem.attribs['data-sku']// 获取li标签下的标签集合const firstChildren = dataItem.childrenfirstChildren.forEach(twoItem => {// 得到相关div标签if (twoItem.type === 'tag' && twoItem.name === 'div') {const twoChildren = twoItem.childrentwoChildren.forEach(threeItem => {// -------> 获取商品价格if (threeItem.type === 'tag' && threeItem.name === 'div' && threeItem.attribs.class === 'p-price') {const threeChildren = threeItem.children// 获取strong标签threeChildren.forEach(fourItem1 => {if (fourItem1.type === 'tag' && fourItem1.name === 'strong') {const fourItem1Children = fourItem1.children// 获取i标签fourItem1Children.forEach(fiveItem1 => {if (fiveItem1.type === 'tag' && fiveItem1.name === 'i') {const price = (fiveItem1.children[0]).datadataRes.price = price}})}})}// -------> 获取商品名称if (threeItem.type === 'tag' && threeItem.name === 'div' && threeItem.attribs.class === 'p-name p-name-type-2') {const threeChildren2 = threeItem.children// 获取strong标签threeChildren2.forEach(fourItem2 => {if (fourItem2.type === 'tag' && fourItem2.name === 'a') {const fourItem2Children = fourItem2.children// 获取i标签fourItem2Children.forEach(fiveItem3 => {if (fiveItem3.type === 'tag' && fiveItem3.name === 'em') {const fiveItem3Children = fiveItem3.childrenconst fiveItem3ChildrenObj = fiveItem3Children.find(f => f.type === 'text')const name = fiveItem3ChildrenObj ? fiveItem3ChildrenObj.data : ''dataRes.name = name}})}})}})}})if (!_.isEmpty(dataRes)) {listDataRes.push(dataRes);}})console.log(`${cnt++}`); //这里就是为了自己在console中看到进度,没有实际用处。}done(); // 函数在回调中完成工作后必须调用它}
});// 将其相关href写入json文件
const writeListJson = () => {console.log(' =================> 队列为空时,数据处理完成')// 写入文件内容(如果文件不存在会创建一个文件)fs.writeFile('./jd_data/jd_goods_list.json', JSON.stringify(listDataRes), function (err) {if (err) {throw err;}console.log('all requests done and json saved!');});
}// 指定爬取一个Url,将其添加到队列中
//绝大多数网站,都有反爬机制。只有小众网站没有。所以我们需要使用以下配置
//浏览器可以下载,但是服务端爬虫无效。反爬:检测你这个请求是通过浏览器发出来,还是服务端(解决方案:让服务端伪装成浏览器来发这个请求)
c.queue({url: PATH_URL,headers: { 'User-Agent': 'requests' }//让服务端伪装成客户端
});// 在队列为空时,调用以下函数
c.on('drain', writeListJson);

4、cmd进入到index.js目录,执行 node index.js,生成如下

注意:简单的页面抓取数据,很容易实现。效果也不错,主要是根据HTML标签规则自定义获取数据。

目前存在一个问题:

例如:打开京东商品URL时,源码中展示的为30个商品信息列表,在鼠标向下滑动时,会自动追加商品数量,滑动到底部时查看源码中商品数量已增加到60个。

(刚开始研究node抓取数据)问题为在以上例子中只能抓取首屏的数据,那么如何滑动滚轮动态加载内容爬取?哪位大哥知道的,劳驾留个言指教一下小弟,先在此谢谢了。

node crawler简单使用相关推荐

  1. Node.js 简单入门

    目录 一. 什么是Nodejs 二. Nodejs组成图(对比jdk) 三. Nodejs的安装 四. 第一个Nodejs程序 五. Node实现请求响应 六. Node操作MYSQL数据库 1. 安 ...

  2. 运用node实现简单爬虫

    node.js的强大就无需再去重复了,越来越多的公司在使用node.js,还有一点不得不提的优势就是node用的是javascript的语言,对于前端开发工程师来说,没有理由不去get这一强大的技能. ...

  3. node.js简单爬虫

    这里假设你已经安装好node.js和npm,如果没有安装,请参阅其他教程安装. 配置 首先是来配置package.json文件,这里使用express,request和cheerio. package ...

  4. Node路由简单的处理

    看过node很多例子,都是将路由直接放到入口文件中处理,使得文件显得很大很乱,特别是当一个项目变大,有上百甚至上千的路由,那该怎么办? 最近在想如何将一个个的路由放到一个单独的模块中处理,比如'/us ...

  5. Socket总结 node搭建简单的http服务器

    网络中的进程 socket解决的是网络中进程间的通信,其首要解决的就是如何在网络中找到目标进程,这就要求进程拥有唯一性的索引,方便查找连接. 一台机器上,进程与进程之间通行,以PID作为唯一标识.但是 ...

  6. express+node+mysql简单博客系统(一):登录接口

    今年一直想学一下node,现在马上就到年底了,赶紧安排! 准备 使用node.express和mysql开发简单的博客系统: 1.先安装node.express和mysql: 2.创建node项目,也 ...

  7. node搭建简单服务器

    node中提供了一些核心模块,基于这些模块可以在服务器端进行一些操作 fs模块 fs是node提供的一个核心模块,可以用来读取文件,现有一个需求,要把同目录下的test中org.txt中数据进行处理, ...

  8. 7 1学会使用 Node 编写简单的前端应用

    1.创建一个目录 $ mkdir simple-app-demo $ cd simple-app-demo 复制代码 2.在该目录下,新建一个package.json文件 使用命令行来新建 $ npm ...

  9. node实现简单的群体聊天工具

    一.使用的node模块 1.express当做服务器 2.socket.io 前后通信的桥梁 3.opn默认打开浏览器的模块(本质上用不到) 难点:前后通信 源码地址:https://github.c ...

最新文章

  1. 关于preg_match() / preg_replace()函数的一点小说明
  2. 讯wifi_罗永浩直播带货,网友为何pick讯飞智能录音笔?
  3. 课堂练习---最低价格买书
  4. Matlab在坐标点上按顺序标序号
  5. 硬核!原型和原型链详解
  6. tomcat内存溢出问题解决思路
  7. Golang——秒懂函数、参数、可变参数、匿名函数、回调函数、内置函数
  8. hibernate4整合spring3.1出现java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider
  9. hive单机安装 beeline连接hive无法连接
  10. apt搜索某个软件及版本
  11. 微信小程序代码最大限制2M的解决方案
  12. HALCON 控制变量没有被初始化_OA大典故障案例摘录【第1397篇】理光2501如何载体初始化 ?...
  13. Java中成员变量的超详解
  14. 2018世界互联网大会首日,丁磊马化腾雷军等都说了啥?
  15. java-a实现压缩与解压缩(zip、gzip)
  16. “枪型思维”产品设计新探索 | 基金持仓诊断
  17. 如何安装适用于win11的安卓子系统(WSA)的谷歌框架安卓13版本
  18. gh-ost大表DDL工具源码阅读
  19. 安装gensim失败,各种方法未果,最后注意到 error: Microsoft Visual C++ 14.0 or greater is required,终于解决
  20. “操作必须使用一个可更新的查询”故障解决

热门文章

  1. 3D空间中射线与轴向包围盒AABB的交叉检测算法
  2. 【223中等】矩形面积
  3. 临时停车系统帮你解决停车难
  4. book回车键 mac_Macbook Pro键帽拆解安装图文教程
  5. 实用软件推荐(二)——最强大的截图工具 (Snipaste)
  6. linux串口工具 SRT,应用于简单控制任务的软PLC——PC WORX SRT
  7. Dese:将 JSON API 中图片作为 Windows wallpaper
  8. 计蒜客 T1895切蛋糕(单调队列)
  9. 用python编写飞机3D模型
  10. 7.8趋势简更(美联储的步步紧逼)