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 相关文章推荐
document.designMode的功能与使用方法介绍
Nov 22 Javascript
纯JS实现动态时间显示代码
Feb 08 Javascript
一个检测表单数据的JavaScript实例
Oct 31 Javascript
Jquery中基本选择器用法实例详解
May 18 Javascript
实现无刷新联动例子汇总
May 20 Javascript
JavaScript实现自动生成网页元素功能(按钮、文本等)
Nov 21 Javascript
JS字符串按逗号和回车分隔的方法
Apr 25 Javascript
jQuery Collapse1.1.0折叠插件简单使用
Aug 28 jQuery
JS实现数组去重,显示重复元素及个数的方法示例
Jan 21 Javascript
Vue数据绑定实例写法
Aug 06 Javascript
微信小程序 如何保持登录状态
Aug 16 Javascript
微信小程序动态添加和删除组件的现实
Feb 28 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
php基础知识:类与对象(1)
2006/12/13 PHP
php最简单的删除目录与文件实现方法
2014/11/28 PHP
图文介绍PHP添加Redis模块及连接
2015/07/28 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
2019/09/12 PHP
asp.net+jquery滚动滚动条加载数据的下拉控件
2010/06/25 Javascript
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
javascript 实现字符串反转的三种方法
2013/11/23 Javascript
JavaScript中的连字符详解
2013/11/28 Javascript
javascript中bind函数的作用实例介绍
2014/09/28 Javascript
jquery超简单实现手风琴效果的方法
2015/06/05 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
如何用js实现鼠标向上滚动时浮动导航
2016/07/18 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
2020/10/26 Javascript
JavaScript判断日期时间差的实例代码
2018/03/01 Javascript
layui select获取自定义属性方法
2018/08/15 Javascript
快速解决vue动态绑定多个class的官方实例语法无效的问题
2018/09/05 Javascript
JavaScript 预解析的4种实现方法解析
2019/09/03 Javascript
vue 手机物理监听键+退出提示代码
2020/09/09 Javascript
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
在Python下利用OpenCV来旋转图像的教程
2015/04/16 Python
python清空命令行方式
2020/01/13 Python
解决python运行效率不高的问题
2020/07/20 Python
css背景图片的背景裁切、背景透明度、背景变换等效果运用
2012/12/24 HTML / CSS
什么是servlet
2012/05/08 面试题
实习老师个人总结的自我评价
2013/09/28 职场文书
毕业生个人求职信范文分享
2014/01/05 职场文书
小学红领巾广播稿(3篇)
2014/09/13 职场文书
城市轨道交通工程职业生涯规划书范文
2014/09/16 职场文书
民主评议党员总结
2014/10/20 职场文书
2015年第十五个全民国防教育日宣传活动方案
2015/05/06 职场文书
初一年级组工作总结
2015/08/12 职场文书
旅行社计调工作总结
2015/08/12 职场文书
CSS3 制作的图片滚动效果
2021/04/14 HTML / CSS
《乙女游戏世界对路人角色很不友好》OP主题曲无字幕动画MV公开
2022/04/05 日漫
Mysql数据库group by原理详解
2022/07/07 MySQL