使用Python中的漂亮汤从网站上的javascript结构中提取数据的问题

时间:2013-01-10 15:26:03

标签: javascript python json python-2.7 html-parsing

我正在尝试从使用Javascript结构加载数据的网站中抓取数据。我使用解决方案来解决这个问题Issue with html tags while scraping data using beautiful soup。之后,获取JSON数据字典,我迭代它以成功获取设备名称和价格数据。

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

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

  1. 第1部分包含带有计划名称的窗口及其他详细信息
  2. 第二部分包含设备名称和价格的窗口(这是我正在抓取数据的窗口)
  3. 第三部分包含计划名称,设备名称,价格及其每月价格
  4. 我想从第三部分提取数据,因为我想要所有4个字段(计划名称,设备名称,价格,每月价格)。我能够从第一和第二中获取数据。第二部分使用上述问题的解决方案。

    现在,我无法找到第三部分加载数据的javascript ,还有我必须使用的属性(例如,第二部分的window.rates)第三部分的JSON数据字典。

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

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

    请帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

您提供了上一个问题的链接,提及您感兴趣的网站:

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

你只需要查看代码。

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

详细信息项

Einmalige Kosten(一次性费用)

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

    Monatliche Kosten(每月收费)

  3. Red M 59.99

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

  6. 此外,还有三个10.00 /月折扣中的一个可用于学生,年轻人或残障人士。

  7. 您需要解析(可能使用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是window.rates中定义的计划子SKU。对于“Red 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 . . .
            }
        },
        // . . .
    }
    

    我再次为链接数据添加了评论。请注意,许多设备可以链接到相同的子库。

    我们看到细节项目1& 3和项目4,5和6的链接。

    Goodies通过windows.goodies号码链接到prod

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

    这给了我们细节项目4。

    window.rates还通过windows.promotions的{​​{1}}列表链接到subsku

    promotions

    这给了我们细节项目5。

    window.promotions = { 27:{ promotionId:"27", promotionName:"24 x 5 Euro Smartphone-Rabatt", promotionValue:"-5", Type:"absolute", duration_in_months:"24", deeplinkParameter:"" }, // . . . } 包含详情第6项的特别折扣:

    windows.discounts

    计划主要SKU(通过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)选择适当的折扣金额。

    就是这样。只需将这5个对象解析为Python对象,您就可以获得所需的所有数据。