使用requests模块爬取静态网页产品信息报错解决方案
爬取Nordstrom商品标题与描述的解决方案
报错原因
你的代码抛出AttributeError是两个问题共同导致的:
- 仅携带
User-Agent的请求会被Nordstrom的反爬机制拦截,返回的是校验页面而非真实商品页,目标DOM元素不存在于返回内容中,select_one()匹配失败返回None,对None调用.text就会触发属性错误。 - 你写的两个CSS选择器和当前页面实际的元素属性不匹配,就算拿到正常页面内容也无法定位到目标字段。
修正后的可运行代码
通过补全常规浏览器请求头绕过基础反爬,直接提取页面内嵌的Next.js结构化商品数据,比匹配DOM选择器稳定性更高,不会因为前端修改class/id属性失效:
import requests from bs4 import BeautifulSoup import json link = 'https://www.nordstrom.com/s/anine-bing-womens-plaid-shirt/6638030' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.9', 'Referer': 'https://www.nordstrom.com/', 'Connection': 'keep-alive', } with requests.Session() as s: s.headers.update(headers) res = s.get(link, timeout=15) res.raise_for_status() soup = BeautifulSoup(res.text, "lxml") # 提取页面内嵌的结构化商品数据 data_script = soup.select_one("script#__NEXT_DATA__") if not data_script: raise RuntimeError("请求被反爬拦截,未获取到有效商品数据") page_data = json.loads(data_script.text) product_info = page_data['props']['pageProps']['product'] product_title = product_info['title'] product_desc = product_info['description'] print("产品标题:", product_title) print("产品描述:", product_desc)
注意事项
- 如果运行后提示被反爬拦截,可以替换为自己当前浏览器真实的
User-Agent值,适当降低请求频率即可。 - 不要短时间内用同一个IP大量发起请求,否则会触发更严格的IP封禁。
内容的提问来源于stack exchange,提问作者SMTH
相关产品推荐
相关产品推荐

