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的树控件实现代码(asp.net+json)
Jul 11 Javascript
js最简单的拖拽效果实现代码
Sep 24 Javascript
js实现按钮加背景图片常用方法
Nov 01 Javascript
JavaScript中的pow()方法使用详解
Jun 15 Javascript
JQuery悬停控制图片轮播——代码简单
Aug 05 Javascript
jQuery拖动元素并对元素进行重新排序
Dec 30 Javascript
JS实现图片剪裁并预览效果
Aug 12 Javascript
angularjs实现文字上下无缝滚动特效代码
Sep 04 Javascript
AngularJS 实现JavaScript 动画效果详解
Sep 08 Javascript
vue项目每30秒刷新1次接口的实现方法
Dec 04 Javascript
VUE写一个简单的表格实例
Aug 06 Javascript
JS实现拖动模糊框特效
Aug 25 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
joomla实现注册用户添加新字段的方法
2016/05/05 PHP
PHP实现的简单AES加密解密算法实例
2017/05/29 PHP
PHP实现动态创建XML文档的方法
2018/03/30 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
PHP实现数据四舍五入的方法小结【4种方法】
2019/03/27 PHP
JavaScript高级程序设计 客户端存储学习笔记
2011/09/10 Javascript
jQuery EasyUI API 中文文档 - Dialog对话框
2011/11/15 Javascript
javascript在当前窗口关闭前检测窗口是否关闭
2014/09/29 Javascript
js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
2016/04/30 Javascript
jquery实现界面无刷新加载登陆注册
2016/07/30 Javascript
微信小程序页面开发注意事项整理
2017/05/18 Javascript
JavaScript实现的可变动态数字键盘控件方式实例代码
2017/07/15 Javascript
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
详解滑动穿透(锁body)终极探索
2019/04/16 Javascript
小程序关于请求同步的总结
2019/05/05 Javascript
微信小程序云开发修改云数据库中的数据方法
2019/05/18 Javascript
实用的Vue开发技巧
2019/05/30 Javascript
基于vue+uniapp直播项目实现uni-app仿抖音/陌陌直播室功能
2019/11/12 Javascript
Python变量作用范围实例分析
2015/07/07 Python
用Python实现大文本文件切割的方法
2019/01/12 Python
基于多进程中APScheduler重复运行的解决方法
2019/07/22 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
2019/07/23 Python
Python+unittest+requests+excel实现接口自动化测试框架
2020/12/23 Python
次世代生活态度:Hypebeast
2018/07/05 全球购物
澳大利亚便宜隐形眼镜购买网站:QUICKLENS Australia
2018/10/06 全球购物
通息工程毕业生自荐信
2013/10/16 职场文书
前台文员的岗位职责
2013/11/14 职场文书
2014两会学习心得:榜样精神伴我行
2014/03/17 职场文书
商铺消防安全责任书
2014/07/29 职场文书
2014高三学生考试作弊检讨书
2014/12/14 职场文书
地心历险记观后感
2015/06/15 职场文书
vue中三级导航的菜单权限控制
2021/03/31 Vue.js
总结Python变量的相关知识
2021/06/28 Python
利用JavaScript写一个简单计算器
2021/11/27 Javascript
国产动画《万圣街》日语配音版制作决定!
2022/03/20 国漫
手把手带你彻底卸载MySQL数据库
2022/06/14 MySQL