Invoke-WebRequest 不返回标签

时间:2021-04-28 20:14:32

标签: powershell web-crawler invoke-webrequest

我正在尝试抓取网站,但 Invoke-WebRequest 未显示 a 标记。请看以下代码:

$url = "https://groceries.asda.com/search/jack%20daniels"
$url.ParsedHtml.all.tags("a") | forEach-Object -MemberName innertext

以上应返回位于其网站上的任何 a 标记内部文本,但它返回空白。例如它应该返回这个:

Jack Daniel's Old No. 7 Tennessee Whiskey

1 个答案:

答案 0 :(得分:2)

当您在浏览器中导航到 https://groceries.asda.com/search/jack%20daniels 时,它不只是加载单个平面 html 页面 - 该特定站点以包含浏览器执行的一堆 JavaScript 的基本“骨架”页面进行响应发出数十个(数百个?)额外请求以加载实际页面内容并显示产品(如果您禁用 javascript,您将只看到基本页面)。

相比之下,Invoke-WebRequest 只发出一个页面请求,在您的情况下,它只是在您提供的确切 url 处检索“骨架”页面内容 - 它不会模拟浏览器并运行加载的 javascript页面的其余部分。那时产品标签甚至不存在于文档中,这就是它找不到它们的原因。

如果您想检索产品详细信息,您要么需要确定返回给定搜索词的产品结果的正确网址是什么,必须模拟浏览器来执行框架页面中的 javascript 并自动发出所有额外请求(例如使用 Selenium)来构建完整页面。

不幸的是,这都不是一项微不足道的任务:-(

https://groceries.asda.com/search/jack%20daniels 的 Chrome 网络跟踪

Screenshot of a Chrome network trace for https://groceries.asda.com/search/jack%20daniels

Invoke-WebRequest -Uri "https://groceries.asda.com/search/jack%20daniels" 的 Fiddler 跟踪

Screenshot of a Fiddler trace for Invoke-WebRequest -Uri "https://groceries.asda.com/search/jack%20daniels"