首页 > 解决方案 > 源 HTML 不可预测 - Python Scrapy

问题描述

我一直在玩网络抓取,必要时使用带有scrapy和selenium的python。我的最新项目是使用 UPC 从各个网站上抓取价格来比较价格。通常通过一些故障排除,当scrapy在源HTML中看不到价格时,我可以模仿XHR请求或使用selenium来呈现页面。然而,Lowe 的网站让我完全被难住了。示例网址https://www.lowes.com/search?searchTerm=041333740645应重定向到某些 AAA 电池的页面。试图从 html 中获取价格的棘手部分是,提供的源 html 似乎以完全随机的时间间隔发生变化。例如,以下两个片段成功获得价格的几率约为 50%:

price = '$' + response.xpath('//div[@id="atc"]/input/@data-productprice').get()
#OR
price = response.xpath('//script[@type="application/ld+json"]/text()').get()
script = chompjs.parse_js_object(price)
price = "$" + str(script[2]["offers"]["price"])

顶部调用从有时在源中呈现的 div 获取价格,但有时价格仅在 javascript 文本中,因此如果第一个返回 null,第二个应该捕获它。但是,在对此进行测试时,我发现有时 javascript 中的字段也具有空值。如果我在一小时后在同一组 UPC 上运行相同的脚本,某些产品将突然在这些字段中不再显示 null,但其他并非突然显示的产品会。我尝试的下一步是尝试使用 selenium 呈现页面。但是,即使在复制了我的浏览器的每个 cookie 之后,价格字段也不会加载,而是显示一个位置选择框。使用私人浏览器,我能够验证如果发生这种情况时设置了“sn”(商店编号)cookie,则可以刷新页面并加载价格。因此,我在获取价格之前尝试在 selenium 中刷新页面,但出现 403 错误。此外,我搜索了 chrome 为加载价格而发出的请求,但我在任何回复中都找不到价格,只有几个 url 位于包含它的瀑布下方。

所以说真的,我有三个问题:

任何信息都将不胜感激,因为这个问题似乎是谷歌和这里的搜索功能开始让我失望的地方。如果需要,我非常愿意尝试新的实用程序(例如,splash 会在这些工作中帮助我吗?我看不出它与 selenium 有什么不同,但我对此知之甚少,无法说出一种方式或其他)。

标签: pythonhtmlscrapy

解决方案


推荐阅读