求Node.js多页面网页抓取示例:含搜索结果页翻页功能
Node.js 多页面搜索结果抓取示例
我之前做过类似的需求,用 axios 发起HTTP请求、cheerio 解析HTML就能实现自动翻页抓取搜索结果的功能,下面是一个完整的可运行示例:
第一步:安装依赖
首先在项目里安装需要的包:
npm install axios cheerio
第二步:完整代码实现
const axios = require('axios'); const cheerio = require('cheerio'); // 模拟浏览器请求头,避免被目标网站拦截 const headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' }; // 存储所有抓取到的结果 let allResults = []; // 核心抓取函数,支持递归翻页 async function scrapeSearchPage(url) { try { console.log(`正在抓取页面:${url}`); // 发起请求获取页面HTML const response = await axios.get(url, { headers }); const $ = cheerio.load(response.data); // ******** 这里根据目标网站的结构提取数据 ******** // 示例:假设搜索结果是在class为"search-result-item"的元素里 $('.search-result-item').each((index, element) => { const title = $(element).find('.result-title').text().trim(); const link = $(element).find('.result-title a').attr('href'); const description = $(element).find('.result-desc').text().trim(); if (title && link) { allResults.push({ title, link, description }); } }); // ******** 检测并处理下一页 ******** // 示例:假设"下一页"按钮的选择器是".next-page-btn",需要根据目标网站调整 const nextPageBtn = $('.next-page-btn'); if (nextPageBtn.length > 0) { let nextPageUrl = nextPageBtn.attr('href'); // 如果是相对路径,拼接成完整URL if (!nextPageUrl.startsWith('http')) { const baseUrl = new URL(url).origin; nextPageUrl = new URL(nextPageUrl, baseUrl).href; } // 递归抓取下一页(加个延迟避免请求太频繁) await new Promise(resolve => setTimeout(resolve, 1000)); await scrapeSearchPage(nextPageUrl); } else { console.log('已抓取完所有页面'); // 所有页面抓取完成后,处理结果(比如保存到文件) console.log('抓取到的总结果数:', allResults.length); console.log('部分结果示例:', allResults.slice(0, 3)); } } catch (error) { console.error(`抓取页面 ${url} 时出错:`, error.message); } } // 启动抓取,替换成你的目标搜索结果页面URL const startUrl = 'https://example.com/search?q=your-keyword'; scrapeSearchPage(startUrl);
关键说明
- 选择器调整:你需要根据目标网站的实际HTML结构,修改提取结果的选择器(
$('.search-result-item')部分)和下一页按钮的选择器($('.next-page-btn')),可以用浏览器的开发者工具(F12)查看元素结构。 - 反爬应对:如果目标网站有反爬机制,可以增加请求延迟(示例里加了1秒)、使用代理IP,或者改用
puppeteer来处理动态渲染的页面(比如下一页按钮是通过JavaScript加载的情况)。 - 错误处理:示例里做了基础的错误捕获,你可以根据需求扩展,比如增加重试机制。
如果是动态渲染的页面(比如用React/Vue生成的搜索结果),用puppeteer的核心思路:
- 安装
puppeteer:npm install puppeteer - 启动浏览器实例打开页面,等待目标元素加载,提取数据后,模拟点击下一页按钮(如果存在),重复抓取逻辑即可。
内容的提问来源于stack exchange,提问作者EKC826
相关产品推荐
相关产品推荐

