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 相关文章推荐
基于jquery的气泡提示效果
May 31 Javascript
jQuery Validation实例代码 让验证变得如此容易
Oct 18 Javascript
JQuery中的$.getJSON 使用说明
Mar 10 Javascript
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
Jan 13 Javascript
Jquery api 速查表分享
Jan 12 Javascript
Nginx上传文件全部缓存解决方案
Aug 17 Javascript
Bootstrap导航中表单简单实现代码
Mar 06 Javascript
用ES6写全屏滚动插件的示例代码
May 02 Javascript
vue 项目build错误异常的解决方法
Apr 22 Javascript
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
May 22 Javascript
vue+koa2实现session、token登陆状态验证的示例
Aug 30 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 数组和字符串互相转换实现方法
2013/03/26 PHP
PHP empty函数报错解决办法
2014/03/06 PHP
YII实现分页的方法
2014/07/09 PHP
jQuery autocomplate 自扩展插件、自动完成示例代码
2011/03/28 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
2013/01/23 Javascript
jQuery中setTimeout的几种使用方法小结
2013/04/07 Javascript
如何从jQuery的ajax请求中删除X-Requested-With
2013/12/11 Javascript
JavaScript实现的一个日期格式化函数分享
2014/12/06 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
概述一个页面从输入URL到页面加载完的过程
2016/12/16 Javascript
JS实现颜色梯度与渐变效果完整实例
2016/12/30 Javascript
React如何将组件渲染到指定DOM节点详解
2017/09/08 Javascript
使用JS获取SessionStorage的值
2018/01/12 Javascript
JavaScript使用享元模式实现文件上传优化操作示例
2018/08/07 Javascript
Vue 菜单栏点击切换单个class(高亮)的方法
2018/08/22 Javascript
JavaScript命名空间模式实例详解
2019/06/20 Javascript
基于JS实现快速读取TXT文件
2020/08/25 Javascript
[02:35]DOTA2英雄基础教程 末日使者
2013/12/04 DOTA
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
2014/08/22 Python
Python正则表达式学习小例子
2020/03/03 Python
为什么相对PHP黑python的更少
2020/06/21 Python
python脚本和网页有何区别
2020/07/02 Python
python 进程池pool使用详解
2020/10/15 Python
Python根据URL地址下载文件并保存至对应目录的实现
2020/11/15 Python
Python中的面向接口编程示例详解
2021/01/17 Python
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
瑞士灯具购物网站:Lampenwelt.ch
2018/07/08 全球购物
开会迟到检讨书
2014/01/08 职场文书
《金子》教学反思
2014/04/13 职场文书
苦儿流浪记读书笔记
2015/07/01 职场文书
研究生学习计划书应该怎么写?
2019/09/10 职场文书
导游词之嵊泗列岛
2019/10/30 职场文书
详解RedisTemplate下Redis分布式锁引发的系列问题
2021/04/27 Redis
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
2021/05/17 Python
适合后台管理系统开发的12个前端框架(小结)
2021/06/29 Javascript
微软团队与 NASA 科学家和惠普企业(HPE)的工程师合作
2022/04/21 数码科技