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 insertAfter() 实现函数代码
Oct 12 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
May 15 Javascript
使用JS获取当前地理位置方法汇总
Dec 18 Javascript
jquery实现两个图片渐变切换效果的方法
Jun 25 Javascript
浅谈Angularjs link和compile的使用区别
Oct 21 Javascript
理解javascript中的闭包
Jan 11 Javascript
vue数字类型过滤器的示例代码
Sep 07 Javascript
vue的常用组件操作方法应用分析
Apr 13 Javascript
vue+element-ui动态生成多级表头的方法
Aug 28 Javascript
在vue中获取微信支付code及code被占用问题的解决方法
Apr 16 Javascript
详解vue-cli+es6引入es5写的js(两种方法)
Apr 19 Javascript
微信小程序修改checkbox的样式代码实例
Jan 21 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实现的简单三角形、矩形周长面积计算器分享
2014/11/18 PHP
Yii框架中jquery表单验证插件用法示例
2016/10/18 PHP
PHP 类与构造函数解析
2017/02/06 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
用JavaScript实现仿Windows关机效果
2007/03/10 Javascript
谷歌浏览器调试JavaScript小技巧
2014/12/29 Javascript
JS实现简洁、全兼容的拖动层实例
2015/05/13 Javascript
详解JavaScript函数
2015/12/01 Javascript
基于jquery实现无限级树形菜单
2016/03/22 Javascript
javascript显示倒计时控制按钮的简单实现
2016/06/07 Javascript
React利用插件和不用插件实现双向绑定的方法详解
2017/07/03 Javascript
微信通过页面(H5)直接打开本地app的解决方法
2017/09/09 Javascript
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
JavaScript对象原型链原理详解
2020/02/05 Javascript
Angular之jwt令牌身份验证的实现
2020/02/14 Javascript
python实现去除下载电影和电视剧文件名中的多余字符的方法
2014/09/23 Python
实例解析Python的Twisted框架中Deferred对象的用法
2016/05/25 Python
python实现简单淘宝秒杀功能
2018/05/03 Python
python使用turtle库绘制时钟
2020/03/25 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
2019/09/24 Python
python使用 cx_Oracle 模块进行查询操作示例
2019/11/28 Python
python从内存地址上加载python对象过程详解
2020/01/08 Python
Django之form组件自动校验数据实现
2020/01/14 Python
澳大利亚现代波西米亚风格女装网站:Bohemian Traders
2018/04/16 全球购物
Ryderwear美国官网:澳大利亚高端健身训练装备品牌
2018/04/24 全球购物
美国宠物美容和宠物用品购物网站:Cherrybrook
2018/12/07 全球购物
什么是Oracle的后台进程background processes?都有哪些后台进程?
2012/04/26 面试题
中职生自我鉴定范文
2013/10/03 职场文书
大学生自我鉴定
2013/12/16 职场文书
黄河的主人教学反思
2014/02/07 职场文书
公司会计主管岗位责任制
2014/03/01 职场文书
就业协议书的作用
2014/04/11 职场文书
《秦兵马俑》教学反思
2016/02/24 职场文书
html+css 实现简易导航栏功能
2021/04/07 HTML / CSS
深度学习小工程练习之垃圾分类详解
2021/04/14 Python
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
2022/04/06 Vue.js