用node爬取网页并没有大家想象的困难,下面我就向大家讲述如何爬取:
序幕:
首先大家要了解cheerio,这是我们在node中编辑爬取内容的关键
Cheerio 是一个基于核心 jQuery 库的快速、灵活的服务器端 HTML 解析工具。它可以让你使用类似于 jQuery 的语法来解析和操作 HTML 或 XML 文档。Cheerio 主要用于在 Node.js 环境下进行数据爬取、数据提取和 DOM 操作
const cheerio = require('cheerio');
const html = '<div><h1>Hello, World!</h1><p>This is a paragraph.</p></div>';
const $ = cheerio.load(html);
const headingText = $('h1').text();
const paragraphText = $('p').text();
console.log(headingText); // 输出:Hello, World!
console.log(paragraphText); // 输出:This is a paragraph.
通过这种操作 就可以用jQuery的语法来操作、过滤获取的html内容
jQuery语法加强
- jQuery双重遍历
$(".list1").each(function() {
var outerElement = $(this);
outerElement.find(".ist2").each(function() {
var innerElement = $(this);
// 对内部元素进行操作
console.log(innerElement.text());
});
});
首先使用 .each()
遍历 .list1
类名的元素。在每次迭代中,我们获取了外部元素 outerElement
并使用 .find()
方法查找内部的 .list2
元素。然后,使用另一个 .each()
循环遍历每个内部元素 innerElement
并对其进行操作
- jQuery更灵活的获取想要的dom元素
$(`ul li:eq(${index})`) 获取列表中的第index个元素(index 从 0 开始)
jQuery 参考手册 - 选择器
代码展示:
完整爬取代码
var myRequest = require('request')
var myCheerio = require('cheerio')
const fs = require('fs')
// 要爬取的目标网页地址
var myURL = 'https://www.chinanews.com.cn/'
function request(options, callback) {
var options = {
url: options.url, headers: options.headers
}
myRequest(options, callback)
}
// 配置请求
var options = {
url: myURL,
headers: {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36'
},
encoding: null // 添加此行,以便返回二进制数据
}
request(options, function (err, res, body) {
var html = body;
// 将 HTML 内容加载进 cheerio,并指定 { decodeEntities: false } 参数以保留原始的实体编码,而不进行解码
myCheerio.load(html, { decodeEntities: false })
var $ = myCheerio.load(html);
$('.rdph-list2').each(function () {
var child = $(this);
let textLi = ''
child.find("li").each(function () {
var li = $(this);
textLi += li.find("a").text() + '\n'
});
fs.writeFile(`${textLi.slice(0,5)}.txt`, textLi, (err) => {
if (err) throw err;
console.log('文本文件已创建并写入数据');
});
textLi = ''
})
})
爬取效果:
拓展:
爬取网页,记得查看网页的编码格式,如下图:
上述代码爬取是爬取的UTF-8格式,如果用去爬取gb2312等其他格式,返回的文本会乱码,需要去适配