如何用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
相关产品推荐
相关产品推荐

