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
相关产品推荐
相关产品推荐

