爬取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检查是否触发了更严格的反爬验证")
修改说明
- 新增请求头模拟正常浏览器访问,解决反爬拦截导致的无数据问题
- 增加JSON字符串清理逻辑,避免格式问题导致解析失败
- 新增数据存在性判断,防止无数据时直接抛出异常
内容的提问来源于stack exchange,提问作者Nate
相关产品推荐
相关产品推荐

