node.js爬取中关村的在线电瓶车信息


Posted in Javascript onNovember 13, 2018

背景

学习nodejs已经有段时间,网上很多nodejs爬虫的文章,所以着手练习写一段,最近打算买一辆电瓶车来上下班,但又不知道哪个好,网上是各说纷纭啊,于是就想着,干脆用node.js自己写一个小爬虫,来爬一下中关村在线里面电瓶车的信息吧。

简介

该demo采用node.js作为爬虫,为方便,有些地方使用es6语法,如有不懂,欢迎咨询?

步骤

第一步,引入需要的库

var cheerio = require('cheerio');
var fetch = require('node-fetch');

// cheerio 是一个类似浏览器端的jQuery,用来解析HTML的
// fetch 用来发送请求

第二步,设置初始的爬取的入口(我身处杭州,所以地区选了杭州的?)

// 初始url
var url = "http://detail.zol.com.cn/convenienttravel/hangzhou/#list_merchant_loc"
// 由于每个a标签下是相对路径,故需要一个根地址来拼接,如下
var urlRoot = "http://detail.zol.com.cn" 
// 存放所有url,之所以用set,是为了防止有相同的而重复爬去
var urls = new Set()
// 存储所有数据
var data = []

至此,我们的准备部分结束了?,接下来,开始表演了

分析网页,思考爬取的方式

node.js爬取中关村的在线电瓶车信息

每行4款,每页是48款,一共16页

思路:

  • 每次获取当前页48个链接,并点进去之后,拿到该电瓶车的名称和价格(其他信息获取方式一样,自行改就好?)
  • 第一页的全部完成之后,翻到下一页,继续爬,直到最后一页结束

首先我们定义一个函数如下

// 这是得到每个页面的48个链接,并开始发送请求

function ad(arg){
// 参数 arg 先不管
// 本地化一下需要爬取的链接
let url2 = arg || url;
// 请求第一页该网页,拿到数据之后,复制给 app
var app = await fetch(url2).then(res=>res.text())
// 然后假装用jQuery解析了
var $ = cheerio.load(app)
// 获取当前页所有电瓶车的a标签
var ele = $("#J_PicMode a.pic")
// 存放已经爬取过的url,防止重复爬取
var old_urls = []
var urlapp = []
//拿到所有a标签地址之后,存在数组里面,等会儿要开始爬的
for (let i = 0; i < ele.length; i++) {
old_urls.push(fetch(urlRoot+$(ele[i]).attr('href')).then(res=>res.text()))
}
// 用把URL一块丢给promise处理
urlapp = await Promise.all(old_urls)
// 处理完成之后,循环加入jQuery?
for (let i = 0; i < urlapp.length; i++) {
let $2 = cheerio.load(urlapp[i],{decodeEntities: false})
data.push({
name:$2(".product-model__name").text(),
price:$2(".price-type").text()
})
}
// 至此,一页的数据就爬完了
// console.log(data);

// 然后开始爬取下一页
var nextURL = $(".next").attr('href')
// 判断当前页是不是最后一页
if (nextURL){
let next = await fetch(urlRoot+nextURL).then(res=>res.text())
// 获取下一页的标签,拿到地址,走你
ad(urlRoot+nextURL)
}
return data
}
ad()

完整代码如下

var cheerio = require('cheerio');
var fetch = require('node-fetch');
var url = "http://detail.zol.com.cn/convenienttravel/hangzhou/#list_merchant_loc"
var urlRoot = "http://detail.zol.com.cn"
// var url = "http://localhost:3222/app1"
var urls = new Set()
var data = [] 
async function ad(arg){
let url2 = arg || url;
var app = await fetch(url2).then(res=>res.text())
var $ = cheerio.load(app)
var ele = $("#J_PicMode a.pic")
var old_urls = []
var urlapp = []
for (let i = 0; i < ele.length; i++) {
old_urls.push(fetch(urlRoot+$(ele[i]).attr('href')).then(res=>res.text()))
}
urlapp = await Promise.all(old_urls)
for (let i = 0; i < urlapp.length; i++) {
let $2 = cheerio.load(urlapp[i],{decodeEntities: false})
data.push({
name:$2(".product-model__name").text(),
price:$2(".price-type").text()
})
}

var nextURL = $(".next").attr('href')
if (nextURL){
let next = await fetch(urlRoot+nextURL).then(res=>res.text())
ad(urlRoot+nextURL)
}
return data
}
ad()

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
如何确保JavaScript的执行顺序 之jQuery.html深度分析
Mar 03 Javascript
js的toUpperCase方法用法实例
Jan 27 Javascript
微信小程序 video详解及简单实例
Jan 16 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
Jul 17 Javascript
Vue学习笔记进阶篇之函数化组件解析
Jul 21 Javascript
基于ExtJs在页面上window再调用Window的事件处理方法
Jul 26 Javascript
vue mintui-Loadmore结合实现下拉刷新和上拉加载示例
Oct 12 Javascript
canvas轨迹回放功能实现
Dec 20 Javascript
详解vue-loader在项目中是如何配置的
Jun 04 Javascript
深入理解移动前端开发之viewport
Oct 19 Javascript
node获取客户端ip功能简单示例
Aug 24 Javascript
基于elementUI竖向表格、和并列的案例
Oct 26 Javascript
详解Vue SSR( Vue2 + Koa2 + Webpack4)配置指南
Nov 13 #Javascript
详解Vue组件插槽的使用以及调用组件内的方法
Nov 13 #Javascript
Vue实现一个无限加载列表功能
Nov 13 #Javascript
Vue实现移动端页面切换效果【推荐】
Nov 13 #Javascript
vue中slot(插槽)的介绍与使用
Nov 12 #Javascript
vuex的module模块用法示例
Nov 12 #Javascript
React手稿之 React-Saga的详解
Nov 12 #Javascript
You might like
ob_start(),ob_start('ob_gzhandler')使用
2006/12/25 PHP
一个显示效果非常不错的PHP错误、异常处理类
2014/03/21 PHP
php通过rmdir删除目录的简单用法
2015/03/18 PHP
推荐十款免费 WordPress 插件
2015/03/24 PHP
一个PHP实现的轻量级简单爬虫
2015/07/08 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
2016/04/07 PHP
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
JS OOP包机制,类创建的方法定义
2009/11/02 Javascript
JQuery操作Select的Options的Bug(IE8兼容性视图模式)
2013/04/21 Javascript
把input初始值不写value的具体实现方法
2013/07/04 Javascript
node.js入门教程迷你书、node.js入门web应用开发完全示例
2014/04/06 Javascript
JS 对象属性相关(检查属性、枚举属性等)
2015/04/05 Javascript
javascript表单控件实例讲解
2016/09/13 Javascript
Jquery鼠标放上去显示全名的实现方法
2017/02/06 Javascript
vuejs如何配置less
2017/04/25 Javascript
搭建vue开发环境
2018/07/19 Javascript
React中如何引入Angular组件详解
2018/08/09 Javascript
JS原生带缩略图的图片切换效果
2018/10/10 Javascript
浅谈Vue.js 中的 v-on 事件指令的使用
2018/11/25 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
2019/09/06 Javascript
使用xampp将angular项目运行在web服务器的教程
2019/09/16 Javascript
javascript的delete运算符知识点总结
2019/11/19 Javascript
Vue-axios-post数据后端接不到问题解决
2020/01/09 Javascript
node.js如何操作MySQL数据库
2020/10/29 Javascript
ESLint 是如何检查 .vue 文件的
2020/11/30 Vue.js
python 字符串格式化代码
2013/03/17 Python
Python算法之求n个节点不同二叉树个数
2017/10/27 Python
python pycharm最新版本激活码(永久有效)附python安装教程
2020/09/18 Python
Python decimal模块使用方法详解
2020/06/08 Python
德国著名廉价网上药店:Shop-Apotheke
2017/07/23 全球购物
小米旗下精品生活电商平台:小米有品
2018/12/18 全球购物
法制教育主题班会
2015/08/13 职场文书
幼儿园中班教育随笔
2015/08/14 职场文书
聘任协议书(挂靠)
2015/09/21 职场文书
Python+tkinter实现高清图片保存
2022/03/13 Python
Nginx报错104:Connection reset by peer问题的解决及分析
2022/07/23 Servers