我使用wget
这个网页下载了:
使用以下命令:
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 请求......