Node.js发送fetch请求需设置哪些请求头模拟真实浏览器请求
Node.js 中模拟浏览器 fetch 请求需配置的请求头(除User-Agent外)
注意所有请求头的值必须和你伪装的浏览器版本、操作系统、当前请求场景完全逻辑自洽,不要直接抄固定模板,错配的头比缺头更容易被反爬识别。
- 基础通用头(普通GET导航场景必带)
Accept:不要用默认的*/*,对应浏览器的默认值有严格的q值权重顺序,比如桌面版Chrome的默认值为text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7Accept-Language:匹配UA对应系统的语言设置,比如简体中文环境一般为zh-CN,zh;q=0.9,en;q=0.8,不要给中文UA配全英文的语言头Accept-Encoding:一般为gzip, deflate, br,注意要和Node端实际支持的解压算法匹配,不要写了br但实际不支持br解压Cache-Control:普通首次导航请求值为max-age=0,手动刷新页面的请求值为no-cache,按需配置Connection:仅HTTP/1.1协议下需要设为keep-alive,走HTTP/2时浏览器会自动省略这个头,不要强行添加Upgrade-Insecure-Requests:值为1,所有浏览器导航请求默认带,标识优先使用HTTPS连接
- Sec 前缀安全头(反爬重点校验项,Node环境默认不会自动生成)
这组头是浏览器强制自动注入、前端代码无法修改的,是识别脚本请求的核心判断依据,必须严格匹配请求场景:Sec-Fetch-Dest:标识请求的目标类型,导航请求填document,加载图片填image,接口请求填empty,加载脚本填script,加载样式填style,类型错配大概率会被直接拦截Sec-Fetch-Mode:导航请求填navigate,跨域接口/资源请求对应填cors/no-corsSec-Fetch-Site:同域请求填same-origin,同站点不同子域填same-site,跨域请求填cross-site,值必须和实际来源匹配Sec-Fetch-User:仅用户主动触发的导航请求带这个头,值为?1,静态资源、接口请求不要加Sec-CH-UA*系列客户端提示头:高版本Chromium内核浏览器(Chrome、Edge等)会携带,值必须和你设置的UA完全对应,包含浏览器版本、运行平台、是否为移动端等信息,Safari、Firefox没有这组头,不要乱加
- 特定场景按需添加的头
Content-Type:POST/PUT等带请求体的请求需要配置,值和实际传输的内容格式匹配,比如表单提交为application/x-www-form-urlencoded,JSON接口为application/json,文件上传为multipart/form-data,对应的boundary值必须和实际生成的表单内容一致Origin:仅跨域请求、带自定义头的请求会携带,值为来源页面的协议+域名+端口,同域请求不要添加Referer:标识请求的来源页面地址,注意标准拼写是Referer(少一个r),值要和页面跳转逻辑匹配,不要所有请求都统一填网站根域名X-Requested-With:仅AJAX异步请求才会带值XMLHttpRequest,普通导航、静态资源加载请求不要加这个头,乱加很容易暴露脚本特征
额外提醒:浏览器发送请求时,请求头的排列顺序是固定的,Node.js默认生成的头顺序和真实浏览器有差异,如果要做到高度拟真,还需要手动调整请求头的排列顺序,和真实浏览器的顺序保持一致。
内容的提问来源于stack exchange,提问作者Foobar
相关产品推荐
相关产品推荐

