0

0

如何利用 JavaScript 实现一个支持并发请求的简单爬虫程序?

紅蓮之龍

紅蓮之龍

发布时间:2025-09-29 12:16:02

|

1012人浏览过

|

来源于php中文网

原创

答案:通过控制并发数的异步爬虫可避免服务器压力过大。使用async/await结合Promise实现并发池,限制同时请求的数量,完成一个再发起下一个;配合错误重试、随机延迟和User-Agent设置,提升稳定性;Node.js环境下推荐axios进行请求管理,确保爬虫高效且友好。

如何利用 javascript 实现一个支持并发请求的简单爬虫程序?

实现一个支持并发请求的简单爬虫程序,核心是使用 JavaScript 的异步能力(如 fetchaxios)结合控制并发数的机制,避免一次性发起太多请求导致目标服务器压力过大或被封禁。

1. 基本思路:控制并发请求数量

直接用 Promise.all 可能会同时发起所有请求,不适合大量目标。更好的方式是使用“并发池”策略:限制同时进行的请求数量,完成一个再加入下一个。

以下是一个基于 async/awaitPromise 实现的并发控制示例:

Type
Type

生成草稿,转换文本,获得写作帮助-等等。

下载

立即学习Java免费学习笔记(深入)”;

async function concurrentCrawler(urls, maxConcurrency = 5) {
  const results = [];
  let currentIndex = 0;

async function fetchNext() { const index = currentIndex++; if (index >= urls.length) return null;

const url = urls[index];
try {
  const response = await fetch(url, {
    timeout: 5000 // Node.js 需要额外处理超时,浏览器中可忽略
  });
  const html = await response.text();
  results[index] = { url, success: true, data: html };
} catch (error) {
  results[index] = { url, success: false, error: error.message };
}

// 继续下一个请求
return fetchNext();

}

// 启动 maxConcurrency 个并发任务 const activePromises = []; for (let i = 0; i

// 等待所有任务完成 await Promise.all(activePromises); return results; }

2. 使用示例

假设你要抓取多个页面内容:

立即学习Java免费学习笔记(深入)”;

const urls = [
  'https://httpbin.org/delay/1',
  'https://httpbin.org/delay/2',
  'https://httpbin.org/status/200',
  // 更多 URL...
];

concurrentCrawler(urls, 3).then(results => { results.forEach(r => { if (r.success) { console.log(✅ ${r.url} - 获取成功,内容长度: ${r.data.length}); } else { console.log(❌ ${r.url} - 失败: ${r.error}); } }); });

3. 注意事项与优化建议

实际使用中还需考虑以下几点:

  • 请求头设置:添加 User-Agent,模拟正常浏览器行为,避免被拦截
  • 错误重试机制:对失败请求可增加重试次数
  • 延时控制:在每次请求后加随机延迟(如 await new Promise(r => setTimeout(r, Math.random() * 1000))),降低被封风险
  • HTML 解析:在 Node.js 中可用 cheerio 解析 HTML 内容
  • 运行环境:浏览器端受限于 CORS,通常爬虫更适合在 Node.js 中运行(配合 axios 或 node-fetch)

4. Node.js 版本 + Axios 示例(推荐用于真实项目)

在 Node.js 中使用 axios 更灵活,支持超时、重试等配置:

立即学习Java免费学习笔记(深入)”;

const axios = require('axios');

async function nodeConcurrentCrawler(urls, maxConcurrency = 3) { const results = []; let currentIndex = 0;

const fetchUrl = async () => { while (currentIndex < urls.length) { const index = currentIndex++; const url = urls[index];

  try {
    const response = await axios.get(url, {
      timeout: 8000,
      headers: {
        'User-Agent': 'Mozilla/5.0 (compatible; Mini Crawler)'
      }
    });
    results[index] = { url, success: true, status: response.status, data: response.data };
  } catch (error) {
    results[index] = { url, success: false, error: error.message };
  }

  // 每次请求后随机延迟
  await new Promise(r => setTimeout(r, Math.random() * 1000));
}

};

// 创建并发任务 const promises = Array(maxConcurrency).fill().map(fetchUrl); await Promise.all(promises); return results; }

基本上就这些。通过控制并发数量 + 错误处理 + 请求间隔,就能写出一个简单但稳定的并发爬虫。关键是不要贪快,尊重服务器承载能力。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

531

2023.09.20

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

36

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

61

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

42

2025.11.27

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

514

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

244

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号