python-3.x - 抓取下拉提示
问题描述
我在尝试从下拉按钮获取数据时遇到了一些问题,并且网站中的任何答案(或至少您找到的答案)都没有帮助我。
我要抓取的网站是亚马逊,例如“耐克鞋”。
当我输入属于“耐克鞋”的产品时,我可能会得到这样的产品:
尺寸和颜色随页面一起提供。所以刮很简单。
当我得到这种类型的产品时,问题就来了:
我必须选择一个尺寸,也许是一种颜色,如果我选择不同的尺寸,价格也会发生变化。
我的问题是,有没有办法,例如,访问每个“鞋码”,这样我至少可以检查那个尺码的价格?
如果页面有某种包含源代码中尺码的列表,那不会那么难,但是当我选择尺码并且源代码上没有出现鞋子尺码的“列表”时,页面会发生变化(URL 也没有t 改变)。
解决方案
大多数电子商务网站通过将 json 嵌入 html 并使用 javascript 加载适当的选择来处理变体。因此,一旦您抓取了 html,您很可能拥有所有的变体数据。
在您的情况下,您将鞋码、价格等嵌入到 html 正文中。如果您搜索足够独特的变体名称,您可以在正文中看到一些 json:
现在你需要:
确定它的 json 部分在哪里:
它通常位于
<script>
标签中的某个位置或作为data-<something>
任何标签的属性。提取json部分:
如果它直接嵌入到 javascript 中,您可以使用正则表达式清理提取它:
script = response.xpath('//script/text()').extract_frist() import re # capture everything between {} data = re.findall(script, '(\{.+?\}_')
将 json 加载为 dict 并解析树,例如:
import json d = json.loads(data[0]) d['products'][0]
推荐阅读
- javascript - 在chart.js的甜甜圈图上显示每条弧线的值
- c++ - 如何使用 std::filesystem 编写文件计数谓词?
- java - AWS SQS 发送消息 java.lang.NoSuchFieldError: CLIENT_ENDPOINT
- azure - java.io.IOException:不支持 Blob 操作。dbutils.fs.cp
- python - 多进程平面图抓取问题
- javascript - 如何在 laravel 和 react 应用程序中包含非反应 js javascript 库?
- merge - 使用 Hadd 合并文件
- javascript - 使用 jQuery 加载外部脚本并且没有异步
- c# - 忽略与树的碰撞,检测与地形的碰撞 | 统一 3D
- php - Woocommerce 使用 preg_replace 删除描述产品中的链接