Node.js爬虫实战:百度图片爬取
const fs = require('fs');
const path = require('path');
const https = require('https');
const querystring = require('querystring');
// 图片保存路径
const IMAGE_DIR = 'baidu_images';
// 检查并创建图片保存目录
if (!fs.existsSync(IMAGE_DIR)) {
fs.mkdirSync(IMAGE_DIR);
}
// 构造请求选项
function buildRequestOptions(query, offset) {
const params = querystring.stringify({
'tn': 'resultjson_com',
'ie': 'utf-8',
'word': query,
'pn': offset,
'rn': 30,
'gsm': '1e'
});
return {
hostname: 'image.baidu.com',
path: `/search/flip?${params}`,
method: 'GET'
};
}
// 下载图片
function downloadImage(imageUrl, filename) {
https.get(imageUrl, (res) => {
const fileStream = fs.createWriteStream(path.join(IMAGE_DIR, filename));
res.pipe(fileStream);
fileStream.on('finish', () => {
console.log(`下载成功: ${filename}`);
});
}).on('error', (e) => {
console.error(`下载失败: ${e.message}`);
});
}
// 处理图片数据
function processImages(data, query) {
data.data.forEach(item => {
const imageUrl = item.middleURL.replace(/\\/g, '/');
const filename = `${query}_${item.fromPageIndex}.jpg`;
downloadImage(imageUrl, filename);
});
}
// 查询图片并保存
function crawlImages(query, offset) {
const options = buildRequestOptions(query, offset);
https.get(options, (res) => {
let data = '';
res.setEncoding('utf8');
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
const parsedData = JSON.parse(data.substring(data.indexOf('{')));
processImages(parsedData, query);
});
}).on('error', (e) => {
console.error(`请求错误: ${e.message}`);
});
}
// 示例:搜索"风景"图片
crawlImages('风景', 0);
这段代码使用了Node.js的HTTPS模块来发送请求,并处理响应。它构建了请求选项,然后使用这些选项向百度图片发送请求。收到响应后,它解析JSON数据并遍历图片数据,下载每个图片,并将其保存到本地文件系统中。这个简单的爬虫示例展示了如何使用Node.js进行基本的网络爬取。
评论已关闭