You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 13:57:13