使用Node.js和Redis构建Web爬虫:如何高效地抓取数据
const redis = require('redis');
const request = require('request');
const { promisify } = require('util');
// 创建Redis客户端
const redisClient = redis.createClient({
host: 'localhost',
port: 6379
});
// 将Redis客户端的get和set方法转为Promise版本
const getAsync = promisify(redisClient.get).bind(redisClient);
const setAsync = promisify(redisClient.set).bind(redisClient);
// 异步请求网页内容的函数
async function fetchPage(url) {
return new Promise((resolve, reject) => {
request(url, (error, response, body) => {
if (error) reject(error);
resolve(body);
});
});
}
// 抓取数据的函数
async function crawlData(url) {
// 尝试从Redis缓存中获取数据
let data = await getAsync(url);
if (data) {
console.log('数据已缓存,直接使用缓存数据。');
return data;
}
// 如果缓存中没有数据,则从网络抓取
data = await fetchPage(url);
// 将抓取到的数据存储到Redis中
await setAsync(url, data);
console.log('数据未缓存,已抓取并存储到缓存中。');
return data;
}
// 使用示例
const url = 'https://example.com/data';
crawlData(url).then(data => {
console.log(data); // 处理data
}).catch(error => {
console.error(error); // 处理错误
});
这段代码展示了如何使用Redis和Node.js的request库来创建一个简单的Web爬虫。首先,它创建了一个Redis客户端,并将Redis客户端的get和set方法转换为Promise版本,以便使用async/await语法处理异步操作。fetchPage
函数用于异步请求网页内容,而crawlData
函数首先尝试从Redis缓存中获取数据,如果缓存中没有数据则从网络抓取,并将抓取的数据存储到Redis缓存中。最后,提供了一个使用示例来展示如何调用crawlData
函数。
评论已关闭