从数据到洞察:如何用Python爬取大众点评评论做竞品分析
在餐饮行业,了解竞争对手的优劣势是制定市场策略的关键。想象一下,你刚开了一家日料店,想知道同商圈其他日料店的顾客评价集中在哪些方面?是服务态度好、食材新鲜,还是上菜速度慢、价格偏高?这些信息如果仅靠人工收集,不仅效率低下,还容易遗漏重要细节。
Python爬虫技术为我们提供了一种高效的数据采集方式,但真正的价值在于如何将这些原始数据转化为商业洞察。本文将带你从数据采集到分析全流程,用技术手段解决商业问题。
1. 数据采集:构建稳定的爬虫系统
1.1 爬虫基础架构设计
一个健壮的爬虫系统需要考虑以下几个核心组件:
import requests import time import random from lxml import html import pandas as pd class DianPingSpider: def __init__(self): self.headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...', 'Cookie': 'your_cookie_here' } self.base_url = 'https://www.dianping.com' self.request_interval = random.uniform(1, 3)关键设计考虑:
- 请求间隔随机化避免被封禁
- 使用真实浏览器头信息
- 异常处理机制确保稳定性
1.2 店铺信息提取技巧
获取店铺列表后,需要精准提取关键信息:
def parse_shop_list(self, html_content): tree = html.fromstring(html_content) shops = [] for item in tree.xpath('//div[@class="shop-list"]/ul/li'): try: name = item.xpath('.//h4/text()')[0].strip() url = self.base_url + item.xpath('.//a/@href')[0] shops.append({'name': name, 'url': url}) except: continue return shops提示:大众点评的页面结构会不定期更新,建议定期检查XPath表达式是否仍然有效。
1.3 评论数据分页处理
评论数据通常采用分页加载,需要处理翻页逻辑:
| 参数名 | 说明 | 示例值 |
|---|---|---|
| start | 起始偏移量 | 0, 15, 30... |
| limit | 每页数量 | 15 |
| shopId | 店铺唯一标识 | G8yE5sK9j7 |
def get_comments(self, shop_id, max_pages=10): comments = [] for page in range(max_pages): url = f'https://mapi.dianping.com/comments?shopId={shop_id}&start={page*15}' response = requests.get(url, headers=self.headers) data = response.json() comments.extend(data['list']) time.sleep(self.request_interval) return comments2. 数据清洗:从杂乱到规整
2.1 文本预处理流程
原始评论数据往往包含大量噪声:
- 去除特殊字符和表情符号
- 处理简繁体转换
- 识别并过滤广告内容
- 提取评分信息
import re from zhconv import convert def clean_text(text): # 去除HTML标签 text = re.sub(r'<[^>]+>', '', text) # 简体转换 text = convert(text, 'zh-cn') # 去除特殊字符 text = re.sub(r'[^\w\s]', '', text) return text.strip()2.2 关键信息提取
从评论中提取有价值的结构化数据:
常见提取目标:
- 菜品提及频率
- 服务评价关键词
- 环境描述词
- 价格敏感度表达
def extract_keywords(comments): food_keywords = ['刺身', '寿司', '拉面', '新鲜', '口感'] service_keywords = ['服务', '态度', '耐心', '热情', '冷漠'] result = { 'food_mentions': sum(1 for c in comments if any(k in c for k in food_keywords)), 'service_mentions': sum(1 for c in comments if any(k in c for k in service_keywords)) } return result3. 情感分析:量化顾客满意度
3.1 构建情感分析模型
使用预训练模型进行情感倾向判断:
from transformers import pipeline sentiment_analyzer = pipeline("sentiment-analysis", model="uer/roberta-base-finetuned-dianping-chinese") def analyze_sentiment(comments): results = [] for comment in comments: try: result = sentiment_analyzer(comment[:512]) # 限制长度 results.append(result[0]['label']) except: continue return results3.2 情感分析结果可视化
将分析结果转化为直观的图表:
import matplotlib.pyplot as plt def plot_sentiment(sentiments): counts = { 'positive': sentiments.count('positive'), 'negative': sentiments.count('negative'), 'neutral': sentiments.count('neutral') } plt.bar(counts.keys(), counts.values()) plt.title('顾客情感分布') plt.show()分析维度建议:
- 按时间段对比
- 不同店铺对比
- 不同价格区间对比
4. 竞品分析:从数据到决策
4.1 建立多维度评估体系
构建全面的竞品评估指标:
| 评估维度 | 权重 | 数据来源 |
|---|---|---|
| 菜品质量 | 30% | 评论关键词频率 |
| 服务质量 | 25% | 情感分析结果 |
| 环境体验 | 20% | 图片分析 |
| 价格接受度 | 15% | 价格提及频率 |
| 创新性 | 10% | 新品提及次数 |
4.2 生成分析报告
将分析结果整理为结构化报告:
def generate_report(analysis_data): report = f""" ## 竞品分析报告 - {analysis_data['date']} ### 1. 基本情况 - 分析店铺数量: {len(analysis_data['shops'])} - 总评论数: {analysis_data['total_comments']} ### 2. 关键发现 {analysis_data['key_findings']} """ return report4.3 制定改进策略
基于分析结果提出针对性建议:
常见改进方向:
- 优化高频投诉环节
- 强化优势项目宣传
- 调整价格策略
- 改进服务流程
在实际操作中,我们发现中午时段的负面评价往往集中在"上菜速度"上,而晚餐时段则更多关注"环境嘈杂"问题。这种时间维度的洞察可以帮助商家更有针对性地调整运营策略。