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 相关文章推荐
网页的标准,IMG不支持onload标签怎么办
Jun 29 Javascript
获取css样式表内样式的js函数currentStyle(IE),defaultView(FF)
Feb 14 Javascript
JS实现让网页背景图片斜向移动的方法
Feb 25 Javascript
jQuery插件扩展测试实例
Jun 21 Javascript
Javascript oop设计模式 面向对象编程简单实例介绍
Dec 13 Javascript
node.js读取Excel数据(下载图片)的方法示例
Aug 02 Javascript
jQuery利用FormData上传文件实现批量上传
Dec 04 jQuery
vue配置文件实现代理v2版本的方法
Jun 21 Javascript
layui 表格操作列按钮动态显示的实现方法
Sep 06 Javascript
js单线程的本质 Event Loop解析
Oct 29 Javascript
JS实现手写 forEach算法示例
Apr 29 Javascript
vue3.0中使用element的完整步骤
Mar 04 Vue.js
详解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中文分词系统SCWS安装和使用实例
2014/04/11 PHP
thinkphp实现上一篇与下一篇的方法
2014/12/08 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
Laravel5.5 实现后台管理登录的方法(自定义用户表登录)
2019/09/30 PHP
学习YUI.Ext基础第一天
2007/03/10 Javascript
javascript 在网页中的运用(asp.net)
2009/11/23 Javascript
jQuery之网页换肤实现代码
2011/04/30 Javascript
jQuery获取CSS样式中的颜色值的问题,不同浏览器格式不同的解决办法
2013/05/13 Javascript
js实现向右横向滑出的二级菜单效果
2015/08/27 Javascript
js流动式效果显示当前系统时间
2016/05/16 Javascript
深入理解jQuery之事件移除
2016/06/02 Javascript
微信小程序 picker 组件详解及简单实例
2017/01/10 Javascript
node.js 发布订阅模式的实例
2017/09/10 Javascript
React如何避免重渲染
2018/04/10 Javascript
Layui实现数据表格默认全部显示(不要分页)
2019/10/26 Javascript
vue实现表单未编辑或未保存离开弹窗提示功能
2020/04/08 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
2020/05/09 Javascript
[00:42]《辉夜杯》—职业组预选赛12月3日15点 正式打响
2015/12/03 DOTA
python不带重复的全排列代码
2013/08/13 Python
分享Python开发中要注意的十个小贴士
2016/08/30 Python
详解Python读取配置文件模块ConfigParser
2017/05/11 Python
基于python的字节编译详解
2017/09/20 Python
python之pandas用法大全
2018/03/13 Python
Python用for循环实现九九乘法表
2018/05/31 Python
基于树莓派的语音对话机器人
2019/06/17 Python
Python使用Slider组件实现调整曲线参数功能示例
2019/09/06 Python
Pandas实现DataFrame按行求百分数(比例数)
2019/12/27 Python
CSS3实现头像旋转效果
2017/03/13 HTML / CSS
Stuart Weitzman欧盟:美国奢华鞋履品牌
2017/05/24 全球购物
竞争性谈判邀请书
2014/02/06 职场文书
十八届三中全会报告学习材料
2014/02/17 职场文书
八一建军节营销活动方案
2014/08/31 职场文书
离婚起诉书范本
2015/05/18 职场文书
python基础详解之if循环语句
2021/04/24 Python
如何判断pytorch是否支持GPU加速
2021/06/01 Python
Nginx配置https的实现
2021/11/27 Servers