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 相关文章推荐
JS 遮照层实现代码
Mar 31 Javascript
使用typeof判断function是否存在于上下文
Aug 14 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
Jan 19 Javascript
JavaScript数组合并的多种方法
May 22 Javascript
JavaScript遍历求解数独问题的主要思路小结
Jun 12 Javascript
js关于getImageData跨域问题的解决方法
Oct 14 Javascript
AngularJS控制器之间的通信方式详解
Nov 03 Javascript
js微信支付实现代码
Dec 22 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
Mar 30 Javascript
jquery 一键复制到剪切板的实例
Sep 20 jQuery
vue项目部署到Apache服务器中遇到的问题解决
Aug 24 Javascript
vuex 多模块时 模块内部的mutation和action的调用方式
Jul 24 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
不用数据库的多用户文件自由上传投票系统(2)
2006/10/09 PHP
php array_map array_multisort 高效处理多维数组排序
2009/06/11 PHP
PHP的5个安全措施小结
2012/07/17 PHP
php函数实现判断是否移动端访问
2015/03/03 PHP
PHP生成json和xml类型接口数据格式
2015/05/17 PHP
图像替换新技术 状态域方法
2010/01/28 Javascript
文字不间断滚动(上下左右)实例代码
2013/04/21 Javascript
如何创建一个JavaScript弹出DIV窗口层的效果
2013/09/25 Javascript
JavaScript动态提示输入框输入字数的方法
2015/07/27 Javascript
各式各样的导航条效果css3结合jquery代码实现
2016/09/17 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
2016/11/17 Javascript
利用jquery实现验证输入的是否是数字、小数,包含保留几位小数
2016/12/07 Javascript
浅谈Node.js:fs文件系统模块
2016/12/08 Javascript
深入理解vue中的$set
2017/06/01 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
vue-cli3添加模式配置多环境变量的方法
2019/06/05 Javascript
JavaScript实现背景自动切换小案例
2019/09/27 Javascript
微信小程序后端(java)开发流程的详细步骤
2019/11/13 Javascript
简明 Python 基础学习教程
2007/02/08 Python
python dict remove数组删除(del,pop)
2013/03/24 Python
python中将字典转换成其json字符串
2014/07/16 Python
Python 3.x 新特性及10大变化
2015/06/12 Python
python opencv之SURF算法示例
2018/02/24 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
2019/01/05 Python
解决python多行注释引发缩进错误的问题
2019/08/23 Python
在Keras中实现保存和加载权重及模型结构
2020/06/15 Python
某公司C#程序员面试题笔试题
2014/05/26 面试题
平面设计自荐信
2013/10/07 职场文书
应届护士推荐信
2013/11/16 职场文书
医药营销个人求职信范文
2014/02/07 职场文书
医药销售自我评价200字
2014/09/11 职场文书
学校领导干部民主生活会整改方案
2014/09/29 职场文书
五一放假通知怎么写
2015/08/18 职场文书
2016教师学习教育法心得体会
2016/01/19 职场文书
历史名人教你十五个读书方法,赶快Get起来!
2019/07/18 职场文书
Redis特殊数据类型HyperLogLog基数统计算法讲解
2022/06/01 Redis