记录一下node爬虫的使用经历,这里分为静态页面和动态页面
静态页面
使用的包 node-fetchcheerio
使用node-fetch 请求页面,得到HTML,cheerio加载HTML,以jQuery的使用方法获取页面信息
js
const getHtml = (url) => {
return fetch(url,
{
method: "GET",
encoding: null,
header: {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.6',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'Referer': 'https://www.xxxx'
}
}).then(res => {
if(res.status == 200) {
return res.text();
} else {
return null;
}
})
}
const spider = async () => {
const url = 'https://www.xxxx';
const rsData = await getHtml(url);
// 通过cheerio对获取到的html文本进行解析
const $ = cheerio.load(rsData);
// 这里就可以像jquery一样查找自己需要的页面内容了
}
动态页面
使用的包 puppeteer
js
async function puppeteerMain(url) {
const browser = await puppeteer.launch()
console.log('服务正常启动');
try {
// 打开一个新的页面
const page = await browser.newPage()
// 监听页面内部的console消息
page.on('console', msg => {
if (typeof msg === 'object') {
console.dir(msg)
} else {
log(chalk.blue(msg))
}
})
// 打开页面
await page.goto(url);
console.log('页面加载完毕');
await page.content();
const links = []
// 延迟执行 等待异步数据加载
setTimeout(async () => {
const list = await page.evaluate(() => {
const links = []
// 获取a标签
const a = document.querySelectorAll('.list-box a');
for(let i=0; i<a.length; i++) {
console.log(a[i].href + '---'+ a[i].title)
links.push({ title: a[i].title, link: a[i].href });
}
return links;
})
关闭浏览器
await browser.close();
}, 10)
} catch (error) {
}
}
puppeteerMain('https://www.xxxx');
其他node相关方法
创建目录
js
function mkdir(dirPath) {
return new Promise((resolve, reject) => {
// 判断目录是否存在
try {
const stats = fs.statSync(path.join(__dirname,dirPath));
if(stats.isDirectory()) {
resolve(true);
} else {
fs.mkdirSync(path.join(__dirname,dirPath));
console.log('目录创建成功');
resolve(true);
}
} catch (error) {
console.log('目录不存在');
try {
fs.mkdirSync(path.join(__dirname,dirPath));
console.log('目录创建成功');
resolve(true);
} catch (error) {
resolve(false)
}
}
})
}
下载文件
js
/**
*
* @param {*} url 文件下载地址
* @param {*} title 文件名
* @param {*} dirPath 存储路径
*/
const downloadFile = async (url, title, dirPath) => {
// 创建目录
const hadDir = await mkdir(dirPath);
// 写入文件
if(hadDir) {
return new Promise((resolve, reject) => {
fetch(url)
.then(res => {
const dest = fs.createWriteStream( `${dirPath}\\${title}`);
dest.on('finish', function() {
console.log('完成');
resolve(true);
})
dest.on('error', function(e) {
console.log(e);
reject(false);
})
res.body.pipe(dest);
})
.catch(err => {
console.log(err);
reject(false);
})
})
}
}
downloadFile('xxx', 'xxx', '/test');