Invoke-WebRequest 不返回标签 https://groceries.asda.com/search/jack%20daniels 的 Chrome 网络跟踪Invoke-WebRequest -Uri "https://groceries.asda.com/search/jack%20daniels" 的 Fiddler 跟踪

问题描述

我正在尝试抓取网站,但 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

解决方法

当您在浏览器中导航到 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"

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...