如何让PowerShell的Invoke-WebRequest自动拒绝Cookie?
遇到这种需要手动确认Cookie的情况确实很烦人,尤其是需要无人值守运行脚本的时候。这里有几个靠谱的解决方法,你可以根据自己的场景选择:
方法1:使用-UseBasicParsing跳过IE引擎的交互提示
如果目标网站的链接是静态渲染的(不需要JavaScript生成),最简单的办法就是给Invoke-WebRequest加上-UseBasicParsing参数。这个参数会绕过Internet Explorer的DOM解析引擎,也就不会触发Cookie同意的弹窗提示,直接获取页面内容。
示例代码:
$iwr = (Invoke-WebRequest -Uri $categoryLink -UseBasicParsing).Links.Href
方法2:预先添加拒绝Cookie的会话Cookie
如果网站依赖JavaScript渲染链接,必须使用IE引擎的话,你可以预先构造一个包含"拒绝Cookie"指令的Web会话。大多数网站会用特定的Cookie来记录用户的Cookie同意状态,比如常见的cookieconsent_status,值设为deny就表示拒绝非必要Cookie。
步骤如下:
- 手动访问目标网站,打开浏览器的开发者工具(F12),查看Cookie列表,找到记录Cookie同意状态的键值对(比如
cookieconsent_status=deny)。 - 在脚本中创建自定义WebSession,添加这个Cookie:
# 初始化一个空的Web会话 $webSession = New-Object Microsoft.PowerShell.Commands.WebRequestSession # 添加拒绝Cookie的设置,注意替换为目标网站实际的Cookie键值和域名 $cookie = New-Object System.Net.Cookie( "cookieconsent_status", # Cookie名称 "deny", # Cookie值(拒绝) "/", # 路径 ([System.Uri]$categoryLink).Host # 目标网站域名 ) $webSession.Cookies.Add($cookie) # 使用这个会话发起请求 $iwr = (Invoke-WebRequest -Uri $categoryLink -WebSession $webSession).Links.Href
注意:不同网站的Cookie名称可能不一样,比如有些用gdpr_consent、cc_denied等,一定要先确认目标网站的实际Cookie键值再替换。
不推荐的全局设置方法
还有一种方式是修改IE的Internet选项,在"隐私"设置里禁用Cookie提示,但这是全局设置,会影响所有使用IE的程序,所以除非你确定不会有其他影响,否则不建议这么做。
内容的提问来源于stack exchange,提问作者thoudamchitaranjan




