You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

爬取Lazada电商动态页面提取嵌套JSON报NoneType错误求解

问题原因
  • 未携带请求头的默认requests请求会被Lazada反爬机制拦截,返回的是拦截页面而非正常的店铺商品页,源码中不存在包含window.pageData = 的script标签,导致jsonObj始终保持初始的None值,后续取值触发类型错误
  • 原代码没有做异常兜底判断,匹配不到数据时直接崩溃
修复后可用代码
from bs4 import BeautifulSoup
import requests
import json

url = "https://www.lazada.com.ph/chuwi-pilipinas/?q=All-Products&langFlag=en&from=wangpu&lang=en&pageTypeId=2"

# 新增浏览器请求头,伪装成正常用户访问,绕过基础反爬
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8"
}

page = requests.get(url, headers=headers)    
data = page.text
soup = BeautifulSoup(data,'html.parser')

scripts = soup.find_all('script')
jsonObj = None

for script in scripts:
    script_content = script.text
    if 'window.pageData = ' in script_content:
        jsonStr = script_content.split('window.pageData = ')[1]
        # 清理JSON字符串尾部多余的分号、换行符,避免解析失败
        jsonStr = jsonStr.strip().rstrip(';')
        jsonObj = json.loads(jsonStr)
        break

# 取值前先做判断,避免匹配不到数据时报错
if jsonObj and 'mods' in jsonObj and 'listItems' in jsonObj['mods']:
    products = jsonObj['mods']['listItems']
    for item in products:
        print(item['productUrl'])
else:
    print("未获取到商品数据,可打印page.text检查是否触发了更严格的反爬验证")
修改说明
  1. 新增请求头模拟正常浏览器访问,解决反爬拦截导致的无数据问题
  2. 增加JSON字符串清理逻辑,避免格式问题导致解析失败
  3. 新增数据存在性判断,防止无数据时直接抛出异常

内容的提问来源于stack exchange,提问作者Nate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 23:48:01