技术栈
下面是本案例使用的开发环境与模块:
- Node.js:作为爬虫程序的开发环境
- request:用于发送HTTP请求的模块
- cheerio:用于解析DOM
- iconv-lite:用于解析数据的编码
案例描述
使用Node.js实现一个简单的爬虫程序,抓取百度热搜的数据,抓取的网站地址:
http://top.baidu.com/buzz?b=1&c=513&fr=topbuzz_b341
效果图如下:
案例准备
创建项目的根目录,例如 d:\myapp
,在根目录下启动命令行工具,执行以下命令:
# 初始化
npm init -y
# 安装模块
cnpm i request cheerio iconv-lite --save
代码示例
在 myapp
目录下创建 index.js
文件,具体代码如下:
const request = require('request')
const cheerio = require('cheerio')
const iconv = require('iconv-lite')
//发起请求
request({
encoding: null,
url: 'http://top.baidu.com/buzz?b=1&c=513&fr=topbuzz_b341'
},function(error,res,body){
//获取HTML代码的字符串,使用iconv-lite解决乱码问题
var html = iconv.decode(body,'gb2312').toString()
//解析DOM,获取超链接数据对象
let data = setDatas(html)
//打印数据
console.log(data);
})
//解析DOM数据的函数
function setDatas(html){
//用于存放对象
let datas = []
//使用cheerio解析
var $ = cheerio.load(html)
var table = $('table.list-table').children()
//遍历table标签的子元素
table.each(function(index,element){
//获取所有带有标题的a标签
let a = $(this).find('a.list-title')
//遍历所有的a标签
a.each(function(){
//获取所有a标签上的href和title属性
let href = $(this).attr('href')
let title = $(this).text()
//把数据追加到数组中
datas.push({
title,
href
})
})
})
return datas
}
代码编写完成后,在命令行工具中执行:
node index
即可打印数据: