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

Python 3网页爬取问题:多类别商家结果冗余处理需求

嘿,我之前爬取黄页类网站时也遇到过一模一样的冗余问题!核心原因应该是你在遍历元素的时候,把多类别商家的信息跟着每个类别重复抓取了——比如一个商家有3个类别,你的代码就会把它加3次到data里,对吧?

咱们先理清楚问题根源:如果你的代码是先遍历「类别标签」,再在每个类别下提取商家信息,那多类别商家必然会被重复抓取。正确的姿势应该是先定位每个商家的独立卡片容器,再在卡片内部提取所有类别,这样每个商家只会被处理一次。

先给你补全并修改后的代码(注意要根据目标页面的实际HTML结构调整选择器,我用了黄页常见的类名示例):

# import libraries
from urllib.request import urlopen
from bs4 import BeautifulSoup

quote_page = ['http://www.paginasamarillas.com.ar/buscar/q/farmacia/p-1/']
data = []

for pg in quote_page:
    page = urlopen(pg)
    soup = BeautifulSoup(page, 'html.parser')  # 补全解析器,避免报错
    
    # 第一步:先抓每个商家的独立卡片容器(你需要用浏览器开发者工具确认实际的class/标签)
    business_cards = soup.find_all('div', class_='business-item')
    
    for card in business_cards:
        # 提取商家的唯一标识信息(比如名称、电话,用来避免后续可能的重复)
        merchant_name = card.find('h3', class_='business-name').get_text(strip=True)
        merchant_phone = card.find('span', class_='phone-number').get_text(strip=True) if card.find('span', class_='phone-number') else '无电话'
        
        # 提取该商家的所有经营类别,存为列表
        all_categories = [cat.get_text(strip=True) for cat in card.find_all('span', class_='category-tag')]
        
        # 将商家信息和所有类别打包存入data,每个商家只占一条记录
        data.append({
            'name': merchant_name,
            'phone': merchant_phone,
            'categories': all_categories,
            'address': card.find('p', class_='business-address').get_text(strip=True) if card.find('p', class_='business-address') else '无地址'
        })

# 现在data里每个商家只有一条记录,所有类别都存在categories列表里,没有冗余
for item in data:
    print(f"商家:{item['name']} | 类别:{', '.join(item['categories'])} | 电话:{item['phone']}")

关键调整点:

  • 从「遍历类别」改成「遍历商家卡片」:确保每个商家只被处理一次
  • 把多类别存为列表字段:既保留了所有类别信息,又不会生成冗余记录
  • 增加了容错处理:避免某些字段缺失导致爬虫崩溃

如果万一还是出现了重复(比如页面有重复的商家卡片),可以用唯一标识做去重:

# 用商家电话作为唯一键去重,确保每条记录唯一
unique_merchants = {}
for merchant in data:
    # 用电话当键,后面的重复项会覆盖前面的,也可以根据需求保留第一条
    unique_merchants[merchant['phone']] = merchant

# 转成列表即可
clean_data = list(unique_merchants.values())

最后提醒下:一定要用浏览器的「开发者工具」(F12)查看目标页面的实际HTML结构,调整代码里的class名和标签,比如business-item、category-tag这些都是我假设的,你要换成页面里实际存在的选择器哦!

内容的提问来源于stack exchange,提问作者Zerote

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:50:26