无法在下载的网页中 grep 价格

无法在下载的网页中 grep 价格

我使用wget这个网页下载了:

沃尔玛网站.png

使用以下命令:

RobWebsiteAddress="https://www.walmart.ca/en/ip/Dispenser-Set-Tumbler-Organizer-Bathroom-Bin-Holder-Bathroom-Containers-Soap-Set-Accessories-Travel-6Pcs-Accessory-Ejoyous-Dish-Toothbrush/PRD4406MV3EZF75"
DownloadName="Ejoyous1"
wget -O- -q --user-agent=AGENT "$RobWebAddress" > "$DownloadName"

当我尝试打开文件时,gedit它就变得疯狂了。

当我使用时:

grep -i 23.31 Ejoyous1 | wc
      0       0       0

找不到价格。如果我grep输入这个单词,price我会得到一行长 146,329 个字符,这可能就是让人gedit抓狂的原因:

$ grep -i price Ejoyous1 | wc
      1    6292  146329

这个 .5 MB 的文件中有一些提示:

$ grep -i necolas Ejoyous1
/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */

你可以看出这是来自沃尔玛的网站。我只需使用 下载网页并进行 grep 操作,就可以毫无问题地获取 Costco 和 Ikea 的定价wget。我也可以使用 查看从 Costco 或 Ikea 下载的文件gedit

如果它是 HTML 的派生语言,我该如何解释它?我应该使用什么工具?有什么线索可以指引我走上正确的道路吗?

答案1

许多页面会单独从主页(从单独的“文件”)下载内容,因此您使用 来下载的文件中没有任何内容可 grep。Firefoxwget会运行 javascript,从而允许它下载内容。您可以按 (Ctrl+Shift+C) 查看 javascript 控制台。单击“网络”,然后重新加载页面以查看它正在建立哪些连接。其中一个连接是json名为 price-offer 的“文件”。

如果您能够确定内容的位置,就有可能获取数据。否则,您必须执行 javascript,就像 Firefox 一样。但是,这并不像提供 URL 那样简单。您还必须将数据发送到服务器才能获取所需的信息。(APIcmak.fr 描述

我发现我可以用 Firefox 打开网页,因为它有一个“另存为”.html 选项。然后可以从保存的文件中查找价格。

这是因为浏览器将额外的信息(来自json)添加到页面保存它。要跳过手动点击 GUI,您可以使用 Chromium 下载页面。(也可以使用 Firefox,但看起来更复杂 -MDN 无头模式

chromium-browser --headless --disable-gpu --dump-dom "https://example.com/" > example.html

那么grep价格:

sed -i.bak -Ee 's@,@,\n@g' example.html 
grep -wEe '"price"\:[0-9]+\.[0-9]+' example.html 

答案2

价格信息通过 js 脚本使用 API 和 json 显示在网页上,
这就是为什么价格文本不存在于网页源代码中的原因。
浏览器 Web 开发工具将显示价格(以及更多库存信息)来自 json 响应https://www.walmart.ca/api/product-page/price-offer

由于这些过程可以通过身份验证和 cookie 来保护,并且 wget 和 curl 无法下载 json 文件,因此一个想法是注册并使用 Wallmart API
https://developer.walmart.com/
但似乎该 API 是供合作伙伴供应商使用的

另一种想法是逆转公共网页构建过程以发送格式良好的 API 请求......

相关内容