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 操作单选框,复选框,下拉列表实现代码
Oct 27 Javascript
Javascript学习笔记 delete运算符
Sep 13 Javascript
javascript的console.log()用法小结
May 31 Javascript
js中对象的声明方式以及数组的一些用法示例
Dec 11 Javascript
在JavaScript中用getMinutes()方法返回指定的分时刻
Jun 10 Javascript
jQuery添加和删除输入文本框标签代码
May 20 Javascript
jquery输入数字随机抽奖特效的简单实现代码
Jun 10 Javascript
Angular2学习笔记之数据绑定的示例代码
Jan 03 Javascript
使用webpack-dev-server处理跨域请求的方法
Apr 18 Javascript
服务端预渲染之Nuxt(使用篇)
Apr 08 Javascript
js实现适配移动端的拖动效果
Jan 13 Javascript
JavaScript 判断浏览器是否是IE
Feb 19 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天
2008/06/15 PHP
PHP 开发环境配置(测试开发环境)
2010/04/28 PHP
PHP获取当前所在目录位置的方法
2014/11/26 PHP
php实现session自定义会话处理器的方法
2015/01/27 PHP
php微信支付接口开发程序
2016/08/02 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
PHP PDOStatement::setAttribute讲解
2019/02/01 PHP
用JQuery调用Session的实现代码
2010/10/29 Javascript
JavaScript 原型链学习总结
2010/10/29 Javascript
JQuery触发radio或checkbox的change事件
2012/12/18 Javascript
js克隆对象、数组的常用方法介绍
2013/09/26 Javascript
javascript获取本机操作系统类型的方法
2015/08/13 Javascript
javascript实现数组去重的多种方法
2016/03/14 Javascript
jQuery Ajax 加载数据时异步显示加载动画
2016/08/01 Javascript
ES6新特性之模块Module用法详解
2017/04/01 Javascript
微信小程序开发入门基础教程
2017/04/19 Javascript
Vue实现双向数据绑定
2017/05/03 Javascript
详解Nodejs之静态资源处理
2017/06/05 NodeJs
vue之数据交互实例代码
2017/06/20 Javascript
解决ant design vue 表格a-table二次封装,slots渲染的问题
2020/10/28 Javascript
[05:17]DOTA2誓师:今天我们在这里 明天TI4等我!
2014/03/26 DOTA
Python中如何获取类属性的列表
2016/12/26 Python
pandas 转换成行列表进行读取与Nan处理的方法
2018/10/30 Python
Linux下升级安装python3.8并配置pip及yum的教程
2020/01/02 Python
python程序文件扩展名知识点详解
2020/02/27 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
2020/04/10 Python
Python实现读取并写入Excel文件过程解析
2020/05/27 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
2020/11/02 Python
伦敦高级内衣品牌:Agent Provocateur(大内密探)
2016/08/23 全球购物
J2EE面试题大全
2016/08/06 面试题
土木工程实习生自我鉴定
2013/09/19 职场文书
试用期工作表现自我评价
2015/03/06 职场文书
欠款起诉书范文
2015/05/19 职场文书
优秀志愿者感言
2015/08/01 职场文书
导游词之天津古文化街
2019/11/09 职场文书
红灯733-1型14管5波段半导体收音机
2021/04/22 无线电