python - 源 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 位于包含它的瀑布下方。
所以说真的,我有三个问题:
为什么服务器可能会在相同的 cookie 和用户代理配置下为相同的 url 提供不同的 html?
有没有办法在刷新调用之前在硒中旋转我的用户代理?
如果在对浏览器发出的请求的任何响应中都找不到该值,那么当它未在源 html 中加载时,如何跟踪获得响应值的请求?
任何信息都将不胜感激,因为这个问题似乎是谷歌和这里的搜索功能开始让我失望的地方。如果需要,我非常愿意尝试新的实用程序(例如,splash 会在这些工作中帮助我吗?我看不出它与 selenium 有什么不同,但我对此知之甚少,无法说出一种方式或其他)。
解决方案
推荐阅读
- c# - 将功能绑定到 QR 码或用作提交按钮 blazor
- amazon-web-services - 手动触发 50 多个 AWS 代码管道
- c# - 调用存储过程时如何测试 C# EF 核心 DbContext.Database.ExecuteSqlRaw()?
- android - 使用 Android Studio UI 组件创建通知
- oracle - 关于 AWS 性能问题的 ORDS
- java - 当tomcat工作线程重用时会发生什么?
- angularjs - 使用 ASP.NET Web API、存储过程和 AngularJs 创建登录表单
- javascript - 如何从数组中对所有匹配的对象进行分组,匹配将在多个键上
- r - tidyr中的gather(),两个不同的代码,一个是正确的,另一个是错误的
- android - Telegram android项目中的断点未命中本机c/c++