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中的eventType事件及其浏览器支持性介绍
Nov 29 Javascript
可自定义速度的js图片无缝滚动示例分享
Jan 20 Javascript
影响jQuery使用的14个方面
Sep 01 Javascript
JavaScript实现找出数组中最长的连续数字序列
Sep 03 Javascript
在css加载完毕后自动判断页面是否加入css或js文件
Sep 10 Javascript
AngularJS入门教程之AngularJS指令
Apr 18 Javascript
基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解
May 12 Javascript
JS实现获取当前URL和来源URL的方法
Aug 24 Javascript
javaScript基础详解
Jan 19 Javascript
Angular 1.x个人使用的经验小结
Jul 19 Javascript
完美解决linux下node.js全局模块找不到的情况
May 16 Javascript
vue + element-ui的分页问题实现
Dec 17 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 的几个配置文件函数
2006/12/21 PHP
php 删除记录同时删除图片文件的实现代码
2010/05/12 PHP
php单例模式的简单实现方法
2016/06/10 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
2017/03/16 PHP
setTimeout 不断吐食CPU的问题分析
2009/04/01 Javascript
模拟select的代码
2011/10/19 Javascript
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
javascript判断两个IP地址是否在同一个网段的实现思路
2013/12/13 Javascript
jQuery focus和blur事件的应用详解
2014/01/26 Javascript
js使用心得分享
2015/01/13 Javascript
js文字横向滚动特效
2015/11/11 Javascript
如何用JS判断两个数字的大小
2016/07/21 Javascript
jquery利用json实现页面之间传值的实例解析
2016/12/12 Javascript
BootStrap学习系列之布局组件(下拉,按钮组[toolbar],上拉)
2017/01/03 Javascript
vue 移动端适配方案详解
2018/11/15 Javascript
js数组去重的方法总结
2019/01/18 Javascript
JQuery中的常用事件、对象属性与使用方法分析
2019/12/23 jQuery
javascript实现倒计时关闭广告
2021/02/09 Javascript
分享15个最受欢迎的Python开源框架
2014/07/13 Python
利用python3随机生成中文字符的实现方法
2017/11/24 Python
详解Python之unittest单元测试代码
2018/01/24 Python
python对于requests的封装方法详解
2019/01/03 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
2019/08/27 Python
Python3 翻转二叉树的实现
2019/09/30 Python
pytorch nn.Conv2d()中的padding以及输出大小方式
2020/01/10 Python
python设置代理和添加镜像源的方法
2020/02/14 Python
阿里健康官方海外旗舰店:阿里健康国际自营
2017/11/24 全球购物
英国工作场所设备购买网站:Slingsby
2019/05/03 全球购物
俄罗斯宠物用品网上商店:ZooMag
2019/12/12 全球购物
施工安全协议书
2013/12/11 职场文书
毕业自荐信
2013/12/16 职场文书
旅游专业职业生涯规划范文
2014/01/13 职场文书
欢迎横幅标语
2014/06/17 职场文书
2014年党员干部四风问题自我剖析材料
2014/09/29 职场文书
2014年建筑工作总结
2014/11/26 职场文书
canvas多重阴影发光效果实现
2021/04/20 Javascript