Windows 11下替代InternetExplorer.Application COM对象实现wgmods.net数据抓取的技术方案求助
解决方案:替代IE COM对象抓取wgmods.net模块详情链接
针对你在Windows 11下遇到的IE COM对象失效、Invoke-WebRequest被网站检测拦截的问题,这里有两个可行的方案,均基于真实浏览器自动化来模拟用户行为,完美绕过检测机制:
方案一:使用Playwright for PowerShell(推荐)
Playwright是微软官方推出的自动化测试工具,完美支持Edge等现代浏览器,能精准模拟真实用户的浏览流程,轻松避开大部分网站的反爬检测。
步骤1:安装Playwright模块与浏览器
打开管理员权限的PowerShell,执行以下命令:
# 安装Playwright PowerShell模块 Install-Module -Name Playwright -Force -Scope CurrentUser # 安装Edge浏览器(Playwright会自动匹配对应版本) pwsh bin/playwright.ps1 install msedge
步骤2:编写自动化抓取脚本
替换原IE脚本,用Playwright实现相同功能:
# 导入Playwright模块 Import-Module Playwright # 指定要抓取的模块编号 $mod_nums = @(19, 22) $my_arr = New-Object System.Collections.Generic.List[System.Object] # 启动Edge浏览器(去掉--headless参数可切换为可视化模式) using ($browser = Invoke-Playwright -Browser msedge -Headless) { foreach ($mod_num in $mod_nums) { if ($null -eq $mod_num) { break } # 打开模块页面,等待网络空闲确保页面完全加载 $page = $browser.NewPage() $page.Goto("https://wgmods.net/$mod_num", @{ WaitUntil = 'networkidle' }) # 定位目标元素并获取详情链接 $detailLink = $page.Locator(".ModDetails_hidden--2Rtru").GetAttribute('href') if ($detailLink) { $my_arr.Add($detailLink) Write-Host "成功抓取模块$mod_num的详情链接:$detailLink" } else { Write-Warning "模块$mod_num未找到目标链接" } # 关闭当前页面释放资源 $page.Close() } } # 输出最终抓取结果 Write-Host "`n所有抓取到的链接:" $my_arr | ForEach-Object { Write-Host $_ }
这个方案的优势:
- 完全脱离IE依赖,适配Windows 11现代环境
- 内置智能等待机制,避免页面未加载完成导致的元素定位失败
- 支持无头模式后台运行,适合批量抓取场景
- 模拟真实用户行为,不会被网站的浏览器检测拦截
方案二:使用Selenium配合Edge IE模式(兼容旧网站IE检测)
如果wgmods.net强制要求IE内核环境,你可以配置Edge的IE模式,并用Selenium控制它完成抓取:
步骤1:配置Edge IE模式
- 打开Edge浏览器,进入
edge://settings/defaultBrowser - 将“允许在Internet Explorer模式下重新加载网站”设置为“允许”
- 添加
wgmods.net到“Internet Explorer模式页面”列表
步骤2:安装Selenium与EdgeDriver
# 安装Selenium PowerShell模块 Install-Module -Name Selenium -Force -Scope CurrentUser # 下载与你的Edge版本完全匹配的EdgeDriver,解压后将其路径添加到系统环境变量PATH中
步骤3:编写Selenium抓取脚本
# 导入Selenium模块 Import-Module Selenium $mod_nums = @(19, 22) $my_arr = New-Object System.Collections.Generic.List[System.Object] # 配置Edge IE模式启动选项 $edgeOptions = New-Object OpenQA.Selenium.Edge.EdgeOptions $edgeOptions.AddArgument("--ie-mode") $edgeOptions.AddArgument("--inprivate") # 可选,以隐私模式运行 # 启动Edge浏览器(IE模式) using ($driver = New-Object OpenQA.Selenium.Edge.EdgeDriver($edgeOptions)) { foreach ($mod_num in $mod_nums) { if ($null -eq $mod_num) { break } # 导航到模块页面 $driver.Navigate().GoToUrl("https://wgmods.net/$mod_num") # 等待页面加载(也可使用显式等待替代固定延迟,更可靠) Start-Sleep -Seconds 2 # 定位目标元素并获取详情链接 try { $element = $driver.FindElement([OpenQA.Selenium.By]::ClassName("ModDetails_hidden--2Rtru")) $detailLink = $element.GetAttribute('href') $my_arr.Add($detailLink) Write-Host "成功抓取模块$mod_num的详情链接:$detailLink" } catch { Write-Warning "模块$mod_num未找到目标链接:$_" } } } # 输出最终抓取结果 Write-Host "`n所有抓取到的链接:" $my_arr | ForEach-Object { Write-Host $_ }
注意:必须保证EdgeDriver版本与你的Edge浏览器版本完全一致,否则会出现浏览器启动失败的问题。
方案可行性说明
两种方案均基于真实浏览器渲染页面,完全模拟用户的浏览行为,能够完美绕过Invoke-WebRequest遇到的浏览器检测;Playwright方案无需额外配置IE模式,更适配现代系统;Selenium方案则适合网站强制要求IE内核的场景。
内容的提问来源于stack exchange,提问作者JustDj
相关产品推荐
相关产品推荐

