Python爬取Mamaearth商品时如何为每个商品匹配对应分类?
问题根源
原代码无法正确关联商品和对应分类的核心原因有3个:
category变量仅在分类页遍历循环中赋值,循环结束后变量只会留存最后一个遍历到的分类值,后续所有商品都会被错误标记为最后一个分类- 收集商品链接时仅存储了URL地址,没有同步绑定链接对应的分类信息,进入详情页爬取环节时无法回溯商品所属分类
- 代码存在语法问题:未定义
headers请求变量、字典赋值块缩进错误,会直接导致运行报错
可直接运行的修正代码
from bs4 import BeautifulSoup import requests import pandas as pd # 基础配置 base_url = 'https://mamaearth.in' category_keys = ['for-babies','beauty','hair','skin','body','gift-packs'] # 补全请求头,模拟浏览器访问 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' } product_info = [] # 遍历每个分类页 for cat_suffix in category_keys: cat_url = f'{base_url}/product-category/{cat_suffix}' r = requests.get(cat_url, headers=headers) soup = BeautifulSoup(r.content, 'lxml') # 提取当前分类名称 category_tag = soup.find('a', class_='active') if not category_tag: continue current_category = category_tag.text.strip() print(f'正在爬取分类:{current_category}') # 提取当前分类下所有商品链接 product_cards = soup.find_all('div', class_='Wrapper-sc-1rxgrnt-0 glctKn search-cards') for card in product_cards: white_wrap = card.find('div', class_='uniquewhite') if not white_wrap: continue for a_tag in white_wrap.find_all('a', href=True): product_url = base_url + a_tag['href'] # 存储时同时绑定商品链接和对应分类 product_info.append( (product_url, current_category) ) prod_list = [] # 遍历每个商品详情页提取名称 for product_url, category in product_info: try: r = requests.get(product_url, headers=headers, timeout=10) soup = BeautifulSoup(r.content, 'lxml') name_tag = soup.find('h1', class_='ProductDetailsRevamp__ProdName-sc-1w9tx2u-1 dTITDo') if not name_tag: continue pro_name = name_tag.text.strip() prod_list.append({ 'Category': category, 'Pro_Name': pro_name, }) except Exception as e: print(f'爬取商品{product_url}失败:{str(e)}') continue df = pd.DataFrame(prod_list) print(df)
关键修正说明
- 调整数据存储逻辑:收集商品入口时不再单独存URL,而是将URL和对应的分类名称绑定存储,爬取详情页时直接读取绑定的分类,保证每个商品的分类匹配准确
- 补全缺失的请求头配置,增加超时设置和异常捕获,避免因反爬、网络波动导致程序直接中断
- 增加元素存在性判断,定位不到目标标签时直接跳过对应条目,避免空值触发AttributeError
- 修复原代码中的缩进语法错误,移除未使用的冗余导入包
内容的提问来源于stack exchange,提问作者Abhishek Singh
相关产品推荐
相关产品推荐

