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

如何用Node.js的request包替换HTML字符串并改造代理链接?

解决你的简易代理服务器两个需求

嘿,我来帮你搞定这两个问题!刚好之前折腾过类似的周末代理小项目,给你一步步拆解解决方案:

一、替换HTML Body中的指定字符串

用request包获取到目标页面的body后,直接用JavaScript的String.replace()方法就能搞定。如果需要全局替换(所有匹配的字符串都换掉),记得加上正则的g标志。

举个简单的例子:

const request = require('request');

// 假设这是你的代理请求处理逻辑
request('https://目标网站.com', (error, response, body) => {
  if (!error && response.statusCode === 200) {
    // 把页面中所有"旧文本"替换成"新文本"
    const modifiedBody = body.replace(/旧文本/g, '新文本');
    // 将修改后的内容返回给用户
    res.send(modifiedBody);
  }
});

二、替换页面所有链接为代理格式

直接字符串替换链接容易踩坑(比如相对路径、不同标签的链接属性),推荐用cheerio库——它是Node.js版的jQuery,能方便地解析和操作HTML。

步骤1:安装依赖

先装cheerio(如果用Express做web服务的话也需要装express):

npm install express request cheerio

步骤2:完整代理代码示例

下面是整合了两个需求的完整代码,同时处理了页面中的<a>链接、样式表<link>和脚本<script>的资源路径:

const express = require('express');
const request = require('request');
const cheerio = require('cheerio');

const app = express();
const PORT = 3000;

app.get('/', (req, res) => {
  // 获取用户传入的目标URL参数
  const targetUrl = req.query.url;
  if (!targetUrl) {
    return res.send('请提供url参数,格式:/?url=https://目标网站.com');
  }

  request(targetUrl, (error, response, body) => {
    if (error || response.statusCode !== 200) {
      return res.status(500).send('获取目标页面失败');
    }

    // 需求1:替换HTML中的指定字符串(示例替换"Stack Overflow"为"Proxy Stack Overflow")
    let modifiedBody = body.replace(/Stack Overflow/g, 'Proxy Stack Overflow');

    // 需求2:替换所有链接为代理格式
    const $ = cheerio.load(modifiedBody);

    // 处理<a>标签的跳转链接
    $('a').each((index, element) => {
      const originalHref = $(element).attr('href');
      if (!originalHref) return;

      // 把相对路径转成绝对路径(避免代理后链接失效)
      const absoluteUrl = new URL(originalHref, targetUrl).href;
      // 替换成代理的URL格式
      $(element).attr('href', `/?url=${encodeURIComponent(absoluteUrl)}`);
    });

    // 处理样式表<link>的资源链接
    $('link[href]').each((index, element) => {
      const originalHref = $(element).attr('href');
      const absoluteUrl = new URL(originalHref, targetUrl).href;
      $(element).attr('href', `/?url=${encodeURIComponent(absoluteUrl)}`);
    });

    // 处理脚本<script>的资源链接
    $('script[src]').each((index, element) => {
      const originalSrc = $(element).attr('src');
      const absoluteUrl = new URL(originalSrc, targetUrl).href;
      $(element).attr('src', `/?url=${encodeURIComponent(absoluteUrl)}`);
    });

    // 返回修改后的页面给用户
    res.send($.html());
  });
});

app.listen(PORT, () => {
  console.log(`代理服务器已启动:http://localhost:${PORT}`);
});

额外提醒

  • request包已经被官方标记为废弃了,如果后续要维护这个项目,建议换成axios或者node-fetch,用法类似,API更现代。
  • 用new URL(相对路径, 目标URL)转绝对路径是关键,不然像/questions这种相对路径代理后会指向你的服务器根目录,而不是目标网站。
  • 一定要用encodeURIComponent()处理目标URL,避免特殊字符(比如&、=)导致URL解析错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:02:10