You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JS中依次读取文件代理并按原顺序循环重复使用?

解决方案

要实现依次循环使用代理(用完最后一个回到第一个),需要解决两个核心问题:正确解析代理数组和维护一个递增且循环的索引计数器,以下分场景给出实现方案:

第一步:修正代理数组的读取(index.js)

原代码仅读取文件内容,未分割为可直接使用的代理数组,先修改index.js确保代理被解析为每行一个的有效数组:

const fs = require('fs');
// 读取代理文件,分割为数组并过滤空行
const proxies = fs.readFileSync('./proxies.txt', 'utf8')
  .split('\n')
  .map(proxy => proxy.trim())
  .filter(proxy => proxy);

场景1:单Worker循环执行任务

如果你的Worker是长期运行、重复执行任务的单实例,可在Worker内部维护一个持久化的索引计数器:

修改worker.js:

const puppeteer = require('puppeteer');
const { workerData } = require('worker_threads');

// 在Worker模块作用域初始化索引,持久化状态
let currentProxyIndex = 0;

async function runTask() {
  // 获取当前要使用的代理
  const targetProxy = workerData.proxies[currentProxyIndex];
  // 更新索引:用完最后一个后重置为0
  currentProxyIndex = (currentProxyIndex + 1) % workerData.proxies.length;

  // 启动浏览器并使用代理
  const browser = await puppeteer.launch({
    args: [`--proxy-server=${targetProxy}`],
    headless: "new",
    executablePath: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome'
  });

  // 这里添加你的页面访问逻辑...

  await browser.close();
}

// 示例:执行任务
runTask();

场景2:多Worker并行执行任务

如果使用多个Worker进程,需要由主进程统一维护全局索引,避免代理重复或混乱:

修改index.js(基于worker_threads模块):

const fs = require('fs');
const { Worker } = require('worker_threads');

// 解析代理数组
const proxies = fs.readFileSync('./proxies.txt', 'utf8')
  .split('\n')
  .map(proxy => proxy.trim())
  .filter(proxy => proxy);

// 主进程维护全局代理索引
let globalProxyIndex = 0;

// 创建Worker并分配代理索引
function spawnWorker() {
  const currentIndex = globalProxyIndex;
  // 循环更新全局索引
  globalProxyIndex = (globalProxyIndex + 1) % proxies.length;

  const worker = new Worker('./worker.js', {
    workerData: {
      proxies,
      assignedProxyIndex: currentIndex
    }
  });

  // 可选:处理Worker的消息、错误和退出事件
  worker.on('message', msg => console.log('Worker输出:', msg));
  worker.on('error', err => console.error('Worker错误:', err));
  worker.on('exit', code => console.log('Worker退出,代码:', code));
}

// 示例:启动3个Worker
for (let i = 0; i < 3; i++) {
  spawnWorker();
}

对应的worker.js:

const puppeteer = require('puppeteer');
const { workerData } = require('worker_threads');

async function run() {
  // 使用主进程分配的代理索引
  const targetProxy = workerData.proxies[workerData.assignedProxyIndex];
  
  const browser = await puppeteer.launch({
    args: [`--proxy-server=${targetProxy}`],
    headless: "new",
    executablePath: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome'
  });

  // 页面访问逻辑...

  await browser.close();
}

run();

注意事项

  • 确保proxies.txt中的代理为每行一个的格式,且无无效空行
  • 若代理需要认证,需额外添加--proxy-auth=用户名:密码到puppeteer的args参数中

内容的提问来源于stack exchange,提问作者Ferend

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 03:12:21