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,jQuery 排序的实现代码,网页标签排序的实现,标签排序
Apr 27 Javascript
利用cookie记住背景颜色示例代码
Nov 04 Javascript
jquery增加时编辑jqGrid(实例代码)
Nov 08 Javascript
JavaScript设置body高度为浏览器高度的方法
Feb 09 Javascript
jQuery如何防止这种冒泡事件发生
Feb 27 Javascript
javascript实现下班倒计时效果的方法(可桌面通知)
Jul 10 Javascript
简单了解JavaScript操作XPath的一些基本方法
Jun 03 Javascript
jq源码解析之绑在$,jQuery上面的方法(实例讲解)
Oct 13 jQuery
AngularJS实现的简单拖拽功能示例
Jan 02 Javascript
vue使用高德地图根据坐标定位点的实现代码
Aug 22 Javascript
微信小程序select下拉框实现源码
Nov 08 Javascript
pnpm对npm及yarn降维打击详解
Aug 05 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中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
2011/11/26 PHP
php全排列递归算法代码
2012/10/09 PHP
php无限极分类实现的两种解决方法
2013/04/28 PHP
CI框架实现cookie登陆的方法详解
2016/05/18 PHP
PHP封装返回Ajax字符串和JSON数组的方法
2017/02/17 PHP
jquery 回车事件实现代码
2011/08/23 Javascript
jquery 图片缩放拖动的简单实例
2014/01/08 Javascript
了不起的node.js读书笔记之node的学习总结
2014/12/22 Javascript
简化版手机端照片预览组件
2015/04/13 Javascript
js中使用使用原型(prototype)定义方法的好处详解
2016/07/04 Javascript
关于使用js算总价的问题
2017/06/23 Javascript
简单实现js鼠标跟随效果
2020/08/02 Javascript
利用js编写网页进度条效果
2017/10/08 Javascript
通过JS运行机制的角度说说作用域
2019/03/12 Javascript
JavaScript简单编程实例学习
2020/02/14 Javascript
[55:42]VG vs VGJ.T 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
Python中使用第三方库xlrd来读取Excel示例
2015/04/05 Python
python利用matplotlib库绘制饼图的方法示例
2016/12/18 Python
关于django 数据库迁移(migrate)应该知道的一些事
2018/05/27 Python
Python实现在某个数组中查找一个值的算法示例
2018/06/27 Python
python矩阵/字典实现最短路径算法
2019/01/17 Python
python使用wxpy轻松实现微信防撤回的方法
2019/02/21 Python
python获取微信企业号打卡数据并生成windows计划任务
2019/04/30 Python
python实现差分隐私Laplace机制详解
2019/11/25 Python
基于MSELoss()与CrossEntropyLoss()的区别详解
2020/01/02 Python
解决c++调用python中文乱码问题
2020/07/29 Python
农民入党思想汇报
2014/01/03 职场文书
小学生国旗下演讲稿
2014/04/25 职场文书
财务负责人任命书
2014/06/06 职场文书
课外科技活动总结
2014/08/27 职场文书
公司财务会计主管应聘求职信
2014/09/26 职场文书
四年级小学生评语
2014/12/26 职场文书
大学毕业晚会开场白
2015/05/29 职场文书
师范生教育见习总结
2015/06/23 职场文书
创业计划书之零食店(进口)
2019/09/24 职场文书
聊聊pytorch测试的时候为何要加上model.eval()
2021/05/23 Python