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 相关文章推荐
slice函数的用法 之不错的应用
Dec 29 Javascript
如何用javascript去掉字符串里的所有空格
Feb 08 Javascript
各浏览器对document.getElementById等方法的实现差异解析
Dec 05 Javascript
js使用Array.prototype.sort()对数组对象排序的方法
Jan 28 Javascript
js实现鼠标点击文本框自动选中内容的方法
Aug 20 Javascript
javascript实现简单计算器效果【推荐】
Apr 19 Javascript
Js+Ajax,Get和Post在使用上的区别小结
Jun 08 Javascript
Laravel中常见的错误与解决方法小结
Aug 30 Javascript
vue实现点击图片放大效果
Aug 15 Javascript
解决vue-router中的query动态传参问题
Mar 20 Javascript
Vue+Webpack完美整合富文本编辑器TinyMce的方法
Nov 30 Javascript
浅谈layer的Icon样式以及一些常用的layer窗口使用方法
Sep 11 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
德生PL330测评
2021/03/02 无线电
PHP函数extension_loaded()用法实例
2015/01/19 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
2017/06/05 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
2017/10/07 PHP
HTML-CSS群中单选引发的“事件”
2007/03/05 Javascript
ext form 表单提交数据的方法小结
2008/08/08 Javascript
Lazy Load 延迟加载图片的 jQuery 插件
2010/02/06 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
浅谈JS读取DOM对象(标签)的自定义属性
2016/11/21 Javascript
详解百度百科目录导航树小插件
2017/01/08 Javascript
vue.js中v-on:textInput无法执行事件问题的解决过程
2017/07/12 Javascript
使用重写url机制实现验证码换一张功能
2017/08/01 Javascript
js中apply和Math.max()函数的问题及区别介绍
2018/03/27 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
2018/11/25 Javascript
JS对日期操作封装代码实例
2019/11/08 Javascript
JavaScript或jQuery 获取option value值方法解析
2020/05/12 jQuery
jQuery实现异步上传一个或多个文件
2020/08/17 jQuery
[56:20]LGD vs VP Supermajor 败者组决赛 BO3 第三场 6.10
2018/07/04 DOTA
Python写的英文字符大小写转换代码示例
2015/03/06 Python
详解TensorFlow在windows上安装与简单示例
2018/03/05 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
2018/08/02 Python
python批量创建指定名称的文件夹
2019/03/21 Python
Python如何给函数库增加日志功能
2020/08/04 Python
Django中和时区相关的安全问题详解
2020/10/12 Python
python实现图像随机裁剪的示例代码
2020/12/10 Python
印尼美容产品购物网站:PerfectBeauty.id
2017/12/01 全球购物
Banana Republic英国官网:香蕉共和国,GAP集团旗下偏贵族风
2018/04/24 全球购物
澳大利亚窗帘商店:Curtain Wonderland
2019/12/01 全球购物
Android面试题附答案
2014/12/08 面试题
农田水利实习自我鉴定
2013/09/19 职场文书
电厂职工自我鉴定
2014/02/20 职场文书
2014幼儿园教师师德师风演讲稿
2014/09/10 职场文书
学雷锋献爱心倡议书
2015/04/27 职场文书
如何写一份成功的商业计划书
2019/06/25 职场文书
CSS 实现角标效果的完整代码
2022/06/28 HTML / CSS
Python爬取奶茶店数据分析哪家最好喝以及性价比
2022/09/23 Python