文章开头先介绍一下主角 cheerio
cheerio是nodejs的抓取页面模块,为服务器特别定制的,快速、灵活、实施的jQuery核心实现。适合各种Web爬虫程序。
也就是用我们熟悉的jQuery语法,在服务器端对第三方网页的html文档进行操作。
步骤开始:
首先让我们先导入本篇文章的主角
const https = require('https');
const cheerio = require('cheerio');
并且定义一个变量来储存需要爬取的网址,因为我都存在Json文件或者数据库中了,地址都是直接读取,这里就不定义了,这里的‘item.url’就是我所爬取的网址。
接着就是用https打开了
https.get(item.url, function (res) {
let chunks = [],
size = 0;
res.on('data', function (chunk) {
chunks.push(chunk);
size += chunk.length;
});
res.on('end', function () {
console.log('数据包传输完毕');
});
})
代码很简单,通过https模块去get我们这个URL的链接,从这个链接不断下载一个个的字节流数据过来,等到数据流传输完了,监听end,就可以把这些字节码打包成一个完整的数据包,将字节码转成字符,就是我们所需要的数据。
接着我们在end里添加如下代码
let data = Buffer.concat(chunks, size);
let html = data.toString();
let $ = cheerio.load(html);
此时data为获取到的字节码,通过toString()可将其转换为 html文档,再通过 cheerio 的load方法将其注入cheerio,并定义为$,我们就可以使用jQuery语法来对获取到的html进行本地操作了
建议封装成一个方法,通过入参回调函数来得到$,我们就可以方便的为不同的页面编写不同的解析放法了;
crawlDatas(item, getDeful)
function crawlDatas(item, fn) {
https.get(item.url, function (res) {
let chunks = [],
size = 0;
res.on('data', function (chunk) {
chunks.push(chunk);
size += chunk.length;
});
res.on('end', function () {
// console.log('连接成功');
let data = Buffer.concat(chunks, size);
let html = data.toString();
let $ = cheerio.load(html);
//-------------------------------------------------------
let result = {
...item,
logo: '',
getTime: 0,
datas: []
};
result = fn($, result);//解析界面
});
});
}
function getDeful($, result) {
result.logo = $('.b-A').find('img').attr('src')
result.smallLogo = result.logo + '_50x50.png';
$('.jc-c').find('tbody').find('tr').each((i, item) => {
if (i > 9) return false
let map = {};
map.head = $(item).find("td").eq(0).text();
let title = $(item).find('a').text();
title = title.substring(0, title.length - 1);
map.title = title;
map.url = $(item).find('a').attr('href');
map.hot = $(item).find('td').eq(2).text();
result.datas.push(map);
map = {};
});
return result;
}
result用来储存解析页面后的数据,可以把它存进json或数据库,这样就可以为我所用了
本文技术自学于以下文章
https://www.jianshu.com/p/a2f02f5e0cc2
end。