Python爬取Myntra商品调用get_text()报AttributeError问题咨询
报错核心原因
触发AttributeError: 'NoneType' object has no attribute 'get_text'是因为soup.find()查找目标元素时返回了空值None,根本没找到对应id的DOM节点,具体诱因有两个:
- 代码中使用了未定义的
headers变量发起请求,requests默认的请求头会被Myntra的反爬机制直接识别为爬虫,返回拦截页面而非正常商品详情页,拦截页里自然不存在商品标题、价格对应的元素。 - 即使补全基础请求头,Myntra的商品详情页是基于Next.js框架做的客户端渲染,普通
requests.get()拿到的初始静态HTML里只有页面骨架,你要找的id='pdp-name'、id='pdp-price'节点是后续JS执行后才动态插入到页面里的,静态源码里根本不存在这两个元素。
另外代码中对页面内容做两次BeautifulSoup解析属于冗余操作,prettify()只是格式化输出HTML字符串,不会带来任何解析上的收益,反而会浪费性能。
修复方案
- 首先补全合法的请求头,至少携带浏览器标识
User-Agent,模拟真实用户的浏览器请求,避免第一时间被反爬拦截。 - 放弃查找动态渲染的DOM节点的思路,Myntra会把全量商品数据直接存在页面内
id='__NEXT_DATA__'的Script标签中,数据为标准JSON格式,直接解析这个标签里的内容就能拿到稳定的标题、价格信息,不需要使用Selenium等浏览器自动化工具做动态渲染。 - 移除冗余的二次解析逻辑,单次解析页面内容即可。
修复后可运行代码
from bs4 import BeautifulSoup import requests import json URL = 'https://www.myntra.com/casual-shoes/highlander/highlander-men-white-sneakers/11097156/buy' # 配置请求头模拟Chrome浏览器访问 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", "Accept-Language": "en-US,en;q=0.9" } resp = requests.get(URL, headers=headers) # 先校验请求状态,非200状态直接抛出问题 if resp.status_code != 200: print(f"请求异常,状态码:{resp.status_code},被反爬机制拦截") else: soup = BeautifulSoup(resp.content, "html.parser") data_tag = soup.find(id="__NEXT_DATA__") if not data_tag: print("页面中未找到商品数据容器,请求被拦截") else: # 加载JSON格式的商品数据 page_data = json.loads(data_tag.string) product_detail = page_data['props']['pageProps']['product'] title = product_detail['name'] price = product_detail['price']['discounted'] print(f"商品标题:{title}") print(f"商品价格:{price}")
补充注意事项
- 如果运行后仍然提示被拦截,可以补充更多请求头字段,比如
Referer、Accept、sec-ch-ua等字段,和真实浏览器请求头保持一致即可。 - 批量爬取时需要增加随机请求间隔,不要高频次请求,否则容易被封IP。
- Myntra前端迭代可能调整JSON内部的字段路径,如果运行时提示KeyError,可以打印
page_data逐层确认字段位置即可。
内容的提问来源于stack exchange,提问作者Nikhil Anirudh
相关产品推荐
相关产品推荐

