0

我正在尝试从使用 Javascript 结构加载数据的网站上抓取数据。我使用了这个问题的解决方案,使用 html 标签来解决这个问题,同时使用漂亮的汤来完成这个问题。之后,获取 JSON 数据字典,我对其进行迭代以成功获取设备名称和价格数据。

上述问题的解决方案中提到的代码实际上是从具有设备名称和价格的窗口中提取数据,其属性在代码中提到为window.rates

问题:如果你看一下网站的结构,它有 3 个部分。

  1. 第一部分包含带有计划名称及其其他详细信息的窗口
  2. 第二部分包含带有设备名称和价格的窗口(这是我当前正在从中抓取数据的窗口)
  3. 第三部分包含计划名称、设备名称、价格及其每月价格

我想从第三部分中提取数据,因为我想要所有 4 个字段(计划名称、设备名称、价格、每月价格)。不过,我可以使用上述问题的解决方案从第一和第二部分抓取数据。

现在,我无法找到在第 3 部分中加载数据的 javascript,以及我必须用来获取第 3 部分数据的 JSON 字典的属性(例如,第 2 部分的 window.rates)。

此外,当我们滚动第二部分的窗口时,网站第三部分中的数据会发生变化。

PS:我尝试打印页面上运行的所有脚本以找出在第三部分加载数据的脚本,但这没有任何帮助。

请帮我解决这个问题。

4

1 回答 1

0

您提供了指向您之前的问题的链接,其中提到了您感兴趣的网站:

http://www.vodafone.de/privat/tarife/red-smartphone-tarife.html

你只需要看看代码。

假设您选择“Red M”作为计划和“Samsung Galaxy SIII Blau (Blue) / 16 GB。底部将显示:

详细项目

Einmalige Kosten(一次性费用)

  1. Anschlusspreis(激活费用):29.99
  2. Einmalzahlung(一次性付款)智能手机:9.90

    Monatliche Kosten(月费)

  3. 红色 M 59.99

  4. 24 x 10 % 拉巴特(折扣)-6.00
  5. 24 x 5 欧元智能手机-拉巴特 -5.00

  6. 学生、年轻人或残障人士也可享受三种 10.00/月折扣中的一种。

您需要解析(可能使用 Python 的 JSON 模块)这些 JavaScript 分配:

window.phones
window.rates
window.discounts
window.goodies
window.promotions

我将带您了解数据结构。您必须自己编写代码。

windows.phones, 包含此条目(与我们的示例保持一致):

window.phones = {
    sku1224225:{
        name:"Samsung Galaxy SIII Blau 16 GB",
        image:"/images/m1057472_300599.jpg",
        deliveryTime:"Lieferbar innerhalb 48 Stunden",
        sku1444275:{p:"prod1334441",e:"49.90"}, // "Vodafone Red S"
        sku1444283:{p:"prod1334441",e:"9.90"},  // "Vodafone Red M"
        sku1444291:{p:"prod1334441",e:"9.90"},  // "Vodafone Red Premium"
        sku1444286:{p:"prod1334441",e:"9.90"},  // "Vodafone Red L"
        sku1104261:{p:"prod1334441",e:"99.90"}  // "Vodafone Basic 100"
    },
    // . . .
}

我添加了注释以显示计划名称。

在这里,我们看到了细节项目 2。

此处列出的 SKU 是在 中定义的计划子 SKU window.rates。对于“红色 M”,我们有:

window.rates = {
    sku1444279:{
        label:"Vodafone Red M",
        propId:"prod1564453",
        subsku:{
            sku1444283:{    // "Samsung Galaxy SIII Blau 16 GB", etc.
                monthlyChargest:"59.99",
                activationCharge:"29.99",
                discounts:[
                    "sku140988",    // "Ich bin 18-25 Jahre jung" (-10)
                    "sku140989",    // "Ich habe einen Schwerbehindertenausweis" (-10)
                    "sku140990"     // "Ich bin Student und jünger als 30" (-10)
                ],
                promotions:["27"],  // "24 x 5 Euro Smartphone-Rabatt" (-5)
                Goodies:[
                    "prod1674486"   // "24 x 10 % Rabatt" (-6)
                ]
            },
            // more subskus here . . .
        }
    },
    // . . .
}

我再次为链接数据添加了评论。请注意,许多设备可以链接到同一个 subsku。

我们看到细节项目 1 和 3 以及指向项目 4、5 和 6 的链接。

Goodieswindows.goodies通过prod号码的链接:

window.goodies = {
    prod1674486:{
        SkuId:"prod1674486",
        Name:"24 x 10 % Rabatt",
        Value:"-6",
        Type:"absolute",
        DurationInMonth:"24"
    },
    // . . .
}

这给了我们细节项目 4。

window.rateswindows.promotions还通过subskupromotions列表链接到:

window.promotions = {
    27:{
        promotionId:"27",
        promotionName:"24 x 5 Euro Smartphone-Rabatt",
        promotionValue:"-5",
        Type:"absolute",
        duration_in_months:"24",
        deeplinkParameter:""
    },
    // . . .
}

这为我们提供了详细信息 5。

windows.discounts包含详细信息项目 6 的特别折扣:

window.discounts = {
    sku140988:{
        SkuId:"sku140988",
        Name:"Ich bin 18-25 Jahre jung",
        Type:"absolute",
        DurationInMonth:"24",
        Value:{
            sku1444295:"-10",   // "Vodafone Red Premium"
            sku1444279:"-10",   // "Vodafone Red M"
            sku1444290:"-20"}   // "Vodafone Red L"
    },
    sku140989:{
        SkuId:"sku140989",
        Name:"Ich habe einen Schwerbehindertenausweis",
        Type:"absolute",
        DurationInMonth:"24",
        Value:{
            sku1444295:"-10",   // "Vodafone Red Premium"
            sku1444279:"-10",   // "Vodafone Red M"
            sku1444290:"-20"}   // "Vodafone Red L"
    },
    sku140990:{
        SkuId:"sku140990",
        Name:"Ich bin Student und jünger als 30",
        Type:"absolute",
        DurationInMonth:"24",
        Value:{
            sku1444295:"-10",   // "Vodafone Red Premium"
            sku1444279:"-10",   // "Vodafone Red M"
            sku1444290:"-20"}   // "Vodafone Red L"
    }
};

适当的折扣金额由计划主要 SKU 选择(通过 下列出的 SKU value)。

就是这样。只需将这 5 个对象解析为 Python 对象,您就会拥有所需的所有数据。

于 2013-01-10T18:54:22.930 回答