如何用bs4或Selenium抓取HTML隐藏input值及商品尺码对应库存
解决6pm商品尺码stockId与库存抓取问题
问题分析
你遇到的报错是因为默认页面未选中任何尺码,页面中不存在name="stockId"的<input>元素,soup.find()返回None后调用.get('value')自然触发AttributeError。另外该网站的库存逻辑特殊:仅当选中的尺码库存少于10件时,才会显示“仅剩#件库存”的提示;库存≥10件或缺货时无相关提示,且stockId仅在选中尺码后才会加载到页面中。
解决方案思路
- 提取所有尺码选项:初始页面包含所有可选尺码的元素,先获取每个尺码对应的标识(比如尺码的
value或data属性) - 模拟尺码选择请求:6pm选择尺码时通常会发起AJAX请求或跳转至带尺码参数的页面,需抓取该请求获取对应尺码的页面内容
- 解析目标数据:在尺码对应的页面内容中,提取
stockId和库存提示信息
示例代码实现
import requests from bs4 import BeautifulSoup # 目标商品页面URL base_url = "https://www.6pm.com/p/bogs-b-moc-mid-winter-painted-black-multi/product/9419937/color/80?zlfid=192&ref=pd_detail_1_sims_cv" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } # 1. 获取初始页面,提取所有尺码选项 response = requests.get(base_url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 找到尺码选择容器(需根据页面实际结构调整选择器) size_options = soup.select('div.size-selection option[value]') for size_opt in size_options: size_label = size_opt.text.strip() size_value = size_opt.get('value') # 2. 模拟选中尺码的请求(示例为跳转URL,实际需抓包确认请求方式) size_url = f"{base_url}&size={size_value}" size_response = requests.get(size_url, headers=headers) size_soup = BeautifulSoup(size_response.text, 'html.parser') # 3. 提取stockId stock_id_input = size_soup.find('input', attrs={'name': 'stockId'}) stock_id = stock_id_input.get('value') if stock_id_input else "无对应stockId" # 4. 提取库存提示 stock_notice = size_soup.find('span', text=lambda t: t and '仅剩' in t and '件库存' in t) stock_status = stock_notice.text.strip() if stock_notice else "库存≥10件或缺货" print(f"尺码: {size_label}") print(f"stockId: {stock_id}") print(f"库存状态: {stock_status}") print("---")
注意事项
- 页面结构适配:代码中的元素选择器需要根据当前页面的实际HTML结构调整,建议用浏览器开发者工具查看元素属性
- AJAX请求优化:如果选择尺码是通过AJAX加载数据,直接抓包获取AJAX接口URL和参数,请求接口获取JSON格式数据效率更高
- 反爬应对:设置合理的请求间隔,使用真实的User-Agent,必要时加入登录后的Cookie验证
内容的提问来源于stack exchange,提问作者Said Traore
相关产品推荐
相关产品推荐

