前言:
使用nodejs开发时,有时需要获取网上的一些资料信息,不可避免的就需要爬虫的功能,这里整理下,主要使用的技术是cheerio。
cheerio用于node环境,用法与语法都类似于jquery。
注意:
如果是遇到 gb2312 格式的导致中文乱码,用cheerio的解码方法以后还是乱码,是正常的,请看下文:
实现效果:
第一张图是:我要个性网 图片地址效果
第二张和第三张是 百度新闻的效果
实现步骤:
1、安装插件
npm install cheerio --save
2、在service下新建一个 spider.js 文件
/*
* @FilePath:\app\service\spider.js
*/
'use strict';
const Service = require('egg').Service;
class SpiderService extends Service {
async spider(url) {
const result = await this.ctx.curl(url);
return result;
}
}
module.exports = SpiderService;
3、在 controller/home.js 中来写我们的具体爬虫方法
首先引入:
const cheerio = require('cheerio')
方法源码1:我要个性网
async getPictureData(ctx) {
var url = 'https://www.woyaogexing.com/touxiang/nv/2021/1159425.html'; // 以爬取 我要个性网图片为例
const list = await ctx.service.spider.spider(url);
// toString是为了解析出buffer数据
const pageXml = list.data.toString();
// decodeEntities参数是为了解决cheerio获取的中文乱码
const $ = cheerio.load(pageXml, { decodeEntities: false });
const imgListData = [];
// 爬取某一个列表数据
$('a img').each(function () {
let text = $(this).attr('src')
imgListData.push(text);
})
ctx.body = imgListData
}
方法源码2:百度新闻
async getHtmlRender2(ctx) {
var url = 'https://news.baidu.com/'; // 百度新闻
const list = await ctx.service.spider.spider(url);
// toString是为了解析出buffer数据
const pageXml = list.data.toString();
// decodeEntities参数是为了解决cheerio获取的中文乱码
const $ = cheerio.load(pageXml, { decodeEntities: false });
const textListData = [];
$('.hotnews a').each(function () {
var text = $(this).html();
console.log(text);
textListData.push(text)
})
ctx.body = textListData
}
4、配置路由 router.local.js
/**
* 路由配置
* @param app
*/
module.exports = app => {
const { router, controller, middleware } = app;
//爬虫
router.get("/getPictureData", controller.home.getPictureData);
router.get("/getHtmlRender", controller.home.getHtmlRender);
router.get("/getHtmlRender2", controller.home.getHtmlRender2);
}
到这里就结束了!
如果有兴趣,可以看看系列里的别的内容,egg系列,自我探索的同时也在进步,欢迎志同道合的朋友。