如何在不产生网络请求的情况下运行JavaScript函数?及爬虫403报错问题
问题解答
关于无需网络请求运行JS函数的方法
- 当然有。如果你的JS函数是纯逻辑处理类(比如数据计算、字符串处理、数组转换这类不涉及网络调用的代码),完全可以直接运行,不会在网络面板产生任何请求。举个例子:
function calculateSum(a, b) { return a + b; } // 调用这个函数不会产生任何网络请求 console.log(calculateSum(2, 3)); - 但如果你的函数本身包含
fetch、XMLHttpRequest这类网络请求代码,那运行时必然会产生请求,网络面板里肯定能看到。
为什么HTML调用和VSCode单独运行差异巨大?
核心原因是运行环境不同:
- 浏览器环境(HTML调用):
- 有严格的同源策略限制:如果你的HTML页面域名和目标网站B不同,浏览器会拦截跨域请求,抛出NO-CORS错误。
- 网站B会检测请求头:浏览器发送请求时会自动带上
Origin、Referer等标识来源的头,同时默认的User-Agent是浏览器标识,这些信息可能被网站B的反爬机制识别,直接返回403。
- Node.js环境(VSCode单独运行JS):
- 没有同源策略限制:Node本身不遵循浏览器的CORS规则,所以跨域请求不会被拦截。
- 请求头默认无浏览器标识:Node发送请求时默认的
User-Agent是Node相关的字符串,也不会自动带Origin、Referer,这种请求可能没被网站B的反爬机制判定为“可疑请求”,所以能正常返回数据。
解决建议
- 针对浏览器环境的403问题:在发送请求时手动设置请求头,模拟浏览器的请求特征,比如:
fetch('https://网站B的接口地址', { 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', 'Referer': 'https://网站B的首页地址', // 其他可能需要的头可以从浏览器正常请求里复制 } }) - 如果纯前端爬取受限,建议直接用Node.js编写爬虫脚本(就是你在VSCode里运行的那种),然后把结果通过接口提供给前端页面,这样既能避开浏览器的CORS限制,也更容易处理反爬策略。
内容的提问来源于stack exchange,提问作者Mito
相关产品推荐
相关产品推荐

