【问题标题】:Get Data from Javascript codes with Python Selenium [closed]使用 Python Selenium 从 Javascript 代码中获取数据 [关闭]
【发布时间】:2022-01-08 04:26:11
【问题描述】:

我正在尝试使用 Selenium 从网站获取 javascript 数据。但是,我无法实现我想要的。下面是javascript代码的截图。我想在这些代码中提取条形码编号和变化值(例如 36 个数字、37 个数字)。我怎样才能最好地做到这一点?感谢您的帮助。

Web page javascript code

编辑 1:

Javascript 代码:

window.PRODUCT_DETAIL_APP_INITIAL_STATE={"product":{"attributes":[],"alternativeVariants":[],"variants":[{"attributeId":338,"attributeName": "Beden","attributeType":"Size","attributeValue":"36","stamps":[{"type":1,"text":"KARGO BEDAVA"},{"type":3," text":"%35"}],"price":{"profitMargin":0,"discountedPrice":{"text":"143,99 TL","value":143.99},"salesPrice":{" text":"159,99 TL","value":159.99},"originalPrice":{"text":"219,99 TL","value":219.99},"currency":"TRY"}," fulfilmentType":"mp","attributeBeautifiedValue":"36","isWinner":true,"listingId":"cb32c614f54395f199628ef7066ab102","stock":null,"sellable":true,"availableForClaim":true,"barcode" :"100406115","itemNumber":118134976,"discountedPriceInfo":"Sepette %10 İndirim","hasCollectable":false,"unitInfo":{"unitPrice":false,"unitPriceText":false},"rushDeliveryMerchantListingExist": false}],"otherMerchants":[],"campaign":{"id":591963,"name":"Kadın Giyimde Avantajlı Ürünler - Sepette %10 İndirim","startDate":"2021-11-30T14:30 :05 ","endDate":"2021-12-07T05:00:00","isMultipleSupplied":false,"stockTypeId":7,"url":"/kadin-giyimde-avantajli-urunler---sepette--10 -indirim/butikdetay/591963","showTimer":false},"category":{"id":103718,"name":"Klasik Topuklu Ayakkabı","hierarchy":"Ayakkabı/Topuklu Ayakkabı/Klasik Topuklu Ayakkabı" ,"refundable":true,"beautifiedName":"klasik-topuklu-ayakkabi","isVASEnabled":false},"brand":{"isVirtual":false,"beautifiedName":"laminta","id":205748 ,"name":"LAMİNTA","path":"/laminta-x-b205748"},"color":"GÜMÜŞŞEFFAF","metaBrand":{"id":205748,"name":"LAMİNTA" ,"beautifiedName":"","isVirtual":false,"path":""},"showVariants":true,"showSexualContent":true,"brandCategoryBanners":[],"allVariants":[{"itemNumber" :118134976,"value":"36","inStock":true,"currency":"TRY","barcode":"100406115","price":143.99},{"itemNumber":118134979,"value" :"37","inStock":true,"currency":"TRY","barcode":"100406116","price":143.99},{"itemNumber":118134975,"value":"38"," inStock":true,"currency":"TRY","barcode":"100406117","p rice":143.99},{"itemNumber":118134983,"value":"39","inStock":true,"currency":"TRY","barcode":"100406118","price":143.99}, {"itemNumber":118123516,"value":"40","inStock":true,"currency":"TRY","barcode":"100406119","price":143.99}]

我的简单代码如下。我得到一个带有以下代码的条形码。但是,我无法为每个变体提取条形码和其他信息。

def barkodBul():
    if ('barcode' in driver.page_source):
        p_id = driver.find_elements_by_tag_name("script")
        for script in p_id:
            innerHTML = script.get_property('innerHTML')
            task = re.search('barcode', innerHTML)
            if (task):
                barkod = [l for l in innerHTML.split("{") if "barcode" in l][0]
                barkod = barkod.split(",")
                for k in range(0,len(barkod)):
                    if('barcode' in barkod[k]):
                        barkod = barkod[k].split(":")
                        print barkod[1]
                        barkod = barkod[1].replace('"', '')
                        print barkod
                        return barkod

    return 0

我想做什么: 36 条码For36 37 BarcodeFor37 等

编辑 2 - 解决方案:谢谢esqew

def barkodBul2():

    time.sleep(3)
    timeout = 30
    WebDriverWait(driver, timeout).until(EC.visibility_of_element_located((By.CLASS_NAME, "pr-new-br")))
    product_detail = driver.execute_script('return window.__PRODUCT_DETAIL_APP_INITIAL_STATE__')
    for variant in product_detail['product']['variants']:
        print variant['attributeValue'] + " " + variant['barcode']

Output:
36 100406115
37 100406116
38 100406117
39 100406118
40 100406119

【问题讨论】:

    标签: javascript python selenium scrape


    【解决方案1】:

    当数据被很好地结构化为对象时,为什么要使用 RegExp 呢?直接用 Selenium 提取内容,然后从那里访问你想要的数据:

    def barkodBul():
        product_detail = driver.execute_script('return window.PRODUCT_DETAIL_APP_INITIAL_STATE'))
        for variant in product_detail['product']['allVariants']:
            print variant['value'] + " " + variant['barcode']
    

    【讨论】:

    • 感谢您的回复和帮助。我正在使用 Python 2.7。我收到了这个错误。对于 product_detail['product']['allVariants'] 中的变体:TypeError: 'NoneType' object has no attribute 'getitem'
    • 你什么时候打电话给barkodBul()?您是否等待页面准备好/完全加载?
    • 是的。等待页面加载。我还使用 time.sleep 添加了更多等待。但是,错误仍然存​​在。当我打印 product_detail 变量时,它显示 None。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 2018-08-08
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 2016-01-13
    相关资源
    最近更新 更多