Qwen3实战爬虫数据清洗与智能归类可视化报告生成你是不是也遇到过这种情况辛辛苦苦用爬虫抓了一大堆市场数据结果发现全是乱糟糟的文本——产品描述长短不一价格信息藏在各种奇怪的格式里用户评论更是五花八门。面对这些非结构化数据手动整理简直是一场噩梦效率低不说还容易出错。最近我在做一个竞品分析项目时就遇到了这个头疼的问题。我需要从几十个电商页面抓取竞品信息然后整理成一份给团队看的报告。传统方法要么是手动复制粘贴要么写一堆复杂的正则表达式费时费力。后来我尝试用Qwen3来处理结果发现整个过程变得出奇地简单。今天我就来分享一下这个实战过程如何用爬虫抓取数据然后用Qwen3进行智能清洗、信息提取和自动归类最后生成一份清晰的可视化报告。整个过程不需要复杂的代码效果却相当不错。1. 场景与痛点为什么需要智能数据处理在做市场分析时我们经常需要从各种网站抓取竞品信息。比如你想了解某个品类在主流电商平台上的情况就需要收集产品名称、价格、销量、评价等数据。爬虫工具能帮我们把这些信息抓下来但抓下来的数据往往很“脏”。数据“脏”在哪里格式混乱价格可能是“199”、“199元”、“199.00”甚至“特价199”信息混杂产品描述里可能包含规格、功能、促销信息等各种内容混在一起结构缺失用户评论可能是长段落没有明确的情感倾向和关键词噪声干扰页面上的广告语、推荐信息、无关文本都被一起抓了下来以前的做法是写一堆规则来清洗数据——用正则表达式匹配价格格式用关键词过滤无关内容。但这种方法很脆弱网站稍微改版或者数据格式稍有变化规则就失效了。而且对于更复杂的任务比如从大段描述中提取关键特性或者对评论进行情感分类规则方法几乎无能为力。这就是Qwen3能大显身手的地方。它不仅能理解自然语言还能根据你的指令进行智能处理把杂乱的非结构化数据变成整洁的结构化信息。2. 整体方案设计从数据到洞察的完整流程我设计的这个流程分为三个主要阶段每个阶段Qwen3都扮演着关键角色。第一阶段数据抓取用Python爬虫从目标网站抓取原始数据。这部分相对标准我用的是Requests和BeautifulSoup的组合。抓取的数据包括产品标题、价格、描述、用户评论等保存为JSON格式。第二阶段智能处理这是Qwen3的核心舞台。我把抓取的原始数据喂给Qwen3让它完成三件事数据清洗统一格式去除噪声标准化表达信息提取从非结构化文本中提取关键信息智能归类根据内容特征自动分类第三阶段报告生成把处理好的结构化数据用可视化工具呈现出来。我选择生成一个“视觉黑板报”——不是传统的图表报告而是更直观、重点更突出的信息展示形式适合团队快速浏览和决策。整个流程的亮点在于Qwen3处理的部分几乎不需要我写复杂的业务逻辑。我只需要用自然语言告诉它我想要什么它就能理解并执行。3. 实战第一步爬虫数据抓取我们先从数据抓取开始。为了演示我选择了一个公开的电商网站作为数据源。实际工作中请务必遵守网站的Robots协议和相关法律法规。import requests from bs4 import BeautifulSoup import json import time def fetch_product_data(url): 抓取单个产品页面的数据 headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } try: response requests.get(url, headersheaders, timeout10) response.raise_for_status() soup BeautifulSoup(response.text, html.parser) # 提取产品信息这里需要根据实际网站结构调整选择器 product_data { title: extract_title(soup), price: extract_price(soup), description: extract_description(soup), reviews: extract_reviews(soup), specifications: extract_specs(soup), source_url: url } return product_data except Exception as e: print(f抓取失败 {url}: {e}) return None def extract_title(soup): 提取产品标题 # 实际使用时需要根据目标网站调整选择器 title_elem soup.find(h1, class_product-title) return title_elem.text.strip() if title_elem else def extract_price(soup): 提取价格信息 price_elem soup.find(span, class_price) if price_elem: return price_elem.text.strip() return # 其他提取函数类似根据实际网站结构编写 def crawl_multiple_products(product_urls): 批量抓取多个产品数据 all_products [] for url in product_urls: print(f正在抓取: {url}) product_data fetch_product_data(url) if product_data: all_products.append(product_data) print(f成功抓取: {product_data[title][:50]}...) # 礼貌性延迟避免给服务器造成压力 time.sleep(1) # 保存原始数据 with open(raw_products.json, w, encodingutf-8) as f: json.dump(all_products, f, ensure_asciiFalse, indent2) print(f抓取完成共获取 {len(all_products)} 个产品数据) return all_products # 示例使用 if __name__ __main__: # 这里替换成实际的产品URL列表 sample_urls [ https://example.com/product/1, https://example.com/product/2, # ... 更多URL ] products crawl_multiple_products(sample_urls[:3]) # 先测试3个抓取下来的数据大概长这样{ title: 【旗舰款】智能手机 256GB 星空黑 全网通5G, price: 3,999 | 活动价: 3,599, description: 这款旗舰手机采用最新处理器6.8英寸AMOLED屏幕支持120Hz刷新率。电池容量5000mAh支持65W快充。后置三摄主摄1亿像素。限时优惠赠原装耳机, reviews: [ 拍照效果真的很棒夜景特别清楚, 电池续航不错一天一充够用, 价格有点贵但性能确实强, 物流很快第二天就到了 ] }可以看到价格信息里混入了“活动价”描述里产品参数和促销信息混在一起评论也是各种角度都有。这样的数据直接分析很困难。4. Qwen3智能清洗与信息提取现在轮到Qwen3上场了。我会把抓取的原始数据交给它让它帮我们整理干净。4.1 数据清洗统一格式去除噪声首先处理最乱的价格字段。不同商家写法各异我们需要统一成数字格式。import json from openai import OpenAI # 假设使用OpenAI兼容的API # 初始化Qwen3客户端 client OpenAI( base_urlhttp://localhost:8080/v1, # Qwen3服务地址 api_keyyour-api-key ) def clean_price_data(raw_price_text): 使用Qwen3清洗价格数据 prompt f 请从以下文本中提取商品价格数字。如果有多个价格提取最低价格。 只返回纯数字不要任何单位、符号或文字。 示例 输入3,999 | 活动价: 3,599 输出3599 输入特价优惠原价899元现价799 输出799 输入价格面议 输出0 现在请处理 输入{raw_price_text} 输出 response client.chat.completions.create( modelqwen3, # 根据实际部署的模型名称调整 messages[ {role: user, content: prompt} ], temperature0.1 # 低温度确保输出稳定 ) try: price int(response.choices[0].message.content.strip()) return price except: return 0 def clean_product_description(description): 清洗产品描述分离产品参数和促销信息 prompt f 请将以下产品描述分为两部分 1. 产品规格参数屏幕、电池、摄像头等硬性参数 2. 促销优惠信息限时优惠、赠品等 用以下格式返回 规格参数[提取的参数] 促销信息[提取的促销信息] 描述文本{description} response client.chat.completions.create( modelqwen3, messages[ {role: user, content: prompt} ] ) return response.choices[0].message.content4.2 关键信息提取从描述中挖出宝藏产品描述里藏着很多重要信息但都是非结构化的文本。我们需要把它们提取出来变成结构化的数据。def extract_specifications_from_description(description): 从描述文本中提取规格参数 prompt f 请从以下产品描述中提取关键规格参数并以JSON格式返回。 需要提取的字段包括 - 屏幕尺寸如6.8英寸 - 电池容量如5000mAh - 快充功率如65W - 摄像头配置如后置三摄主摄1亿像素 - 存储容量如256GB - 颜色如星空黑 - 网络类型如5G 如果某个信息在描述中未提及对应字段值为空字符串。 描述文本{description} 请返回纯JSON格式不要额外解释。 response client.chat.completions.create( modelqwen3, messages[ {role: user, content: prompt} ], response_format{type: json_object} # 要求返回JSON ) specs json.loads(response.choices[0].message.content) return specs def analyze_reviews_sentiment(reviews): 分析用户评论情感倾向并提取关键词 prompt f 请分析以下用户评论完成两个任务 1. 对每条评论进行情感分析正面、负面、中性 2. 从所有评论中提取最常提到的3个优点和2个缺点 评论列表 {json.dumps(reviews, ensure_asciiFalse)} 请以JSON格式返回 {{ sentiment_analysis: [ {{review: 评论1, sentiment: 正面/负面/中性}}, ... ], top_advantages: [优点1, 优点2, 优点3], top_disadvantages: [缺点1, 缺点2] }} response client.chat.completions.create( modelqwen3, messages[ {role: user, content: prompt} ], response_format{type: json_object} ) return json.loads(response.choices[0].message.content)4.3 批量处理整个数据集现在我们把所有功能组合起来批量处理抓取的所有产品数据。def process_all_products(raw_data_file, output_file): 批量处理所有产品数据 with open(raw_data_file, r, encodingutf-8) as f: raw_products json.load(f) processed_products [] for i, product in enumerate(raw_products): print(f处理第 {i1}/{len(raw_products)} 个产品: {product[title][:30]}...) # 清洗价格 clean_price clean_price_data(product.get(price, )) # 提取规格参数 specs extract_specifications_from_description(product.get(description, )) # 分析评论 review_analysis analyze_reviews_sentiment(product.get(reviews, [])) # 构建处理后的产品数据 processed_product { id: i 1, title: product[title], clean_price: clean_price, specifications: specs, review_summary: { total_reviews: len(product.get(reviews, [])), sentiment_distribution: calculate_sentiment_distribution(review_analysis), top_advantages: review_analysis.get(top_advantages, []), top_disadvantages: review_analysis.get(top_disadvantages, []) }, source_url: product.get(source_url, ) } processed_products.append(processed_product) # 保存处理后的数据 with open(output_file, w, encodingutf-8) as f: json.dump(processed_products, f, ensure_asciiFalse, indent2) print(f处理完成共处理 {len(processed_products)} 个产品) return processed_products def calculate_sentiment_distribution(review_analysis): 计算情感分布 sentiments [item[sentiment] for item in review_analysis.get(sentiment_analysis, [])] total len(sentiments) if total 0: return {positive: 0, negative: 0, neutral: 0} return { positive: sentiments.count(正面) / total * 100, negative: sentiments.count(负面) / total * 100, neutral: sentiments.count(中性) / total * 100 } # 执行批量处理 processed_data process_all_products(raw_products.json, processed_products.json)处理后的数据就整洁多了{ id: 1, title: 【旗舰款】智能手机 256GB 星空黑 全网通5G, clean_price: 3599, specifications: { 屏幕尺寸: 6.8英寸, 电池容量: 5000mAh, 快充功率: 65W, 摄像头配置: 后置三摄主摄1亿像素, 存储容量: 256GB, 颜色: 星空黑, 网络类型: 5G }, review_summary: { total_reviews: 4, sentiment_distribution: { positive: 75.0, negative: 25.0, neutral: 0.0 }, top_advantages: [拍照效果好, 电池续航强, 性能优秀], top_disadvantages: [价格较高, 物流问题] } }现在数据已经结构化每个字段都很清晰可以直接用于分析了。5. 智能归类与洞察发现有了整洁的结构化数据我们还可以让Qwen3帮我们发现更深层次的洞察。比如自动给产品分类或者找出价格与配置的关系。5.1 产品智能归类根据产品的规格和价格自动划分到不同的市场定位区间。def categorize_products(products_data): 智能归类产品 prompt f 请根据以下产品信息将它们归类到合适的市场定位中。 市场定位分类 1. 旗舰高端价格4000元配置全面顶级 2. 中端主力价格2000-4000元配置均衡 3. 性价比款价格2000元基础配置够用 4. 入门级价格1000元满足基本需求 产品数据 {json.dumps(products_data, ensure_asciiFalse)} 请为每个产品添加category字段值为上述分类之一。 同时请分析每个分类的特点和优势。 返回JSON格式。 response client.chat.completions.create( modelqwen3, messages[ {role: user, content: prompt} ], response_format{type: json_object} ) categorized_data json.loads(response.choices[0].message.content) return categorized_data5.2 竞争格局分析让Qwen3帮我们分析市场竞争情况找出机会点和威胁点。def analyze_competitive_landscape(products_data): 分析竞争格局 prompt f 你是一个资深市场分析师。请基于以下竞品数据分析市场格局 1. 价格分布分析目前市场主要集中在哪个价格段 2. 配置趋势哪些配置是当前产品的标配哪些是差异化亮点 3. 用户关注点从评论看用户最关心什么最满意和最不满意的是什么 4. 机会识别基于以上分析市场还有哪些机会点 数据 {json.dumps(products_data, ensure_asciiFalse)} 请提供详细的分析报告用markdown格式返回包含具体的数据支持和洞察。 response client.chat.completions.create( modelqwen3, messages[ {role: user, content: prompt} ] ) return response.choices[0].message.content6. 生成可视化报告从数据到洞察最后一步我们把分析结果变成团队能快速理解的视觉报告。我选择生成一个“视觉黑板报”风格的报告重点突出一目了然。6.1 生成报告内容先用Qwen3生成报告的文字内容。def generate_report_content(analysis_results, categorized_products): 生成报告核心内容 prompt f 基于以下市场分析结果和产品数据生成一份给产品团队看的竞品分析报告。 报告要求 1. 语言简洁明了重点突出 2. 用项目符号列出关键发现 3. 包含具体数据支持 4. 给出明确的行动建议 分析结果 {analysis_results} 产品分类数据 {json.dumps(categorized_products, ensure_asciiFalse)} 报告结构 - 市场概况价格分布、主流配置 - 用户反馈洞察最关注的优点和痛点 - 竞争格局分析各定位产品特点 - 机会与建议具体行动项 请用markdown格式返回。 response client.chat.completions.create( modelqwen3, messages[ {role: user, content: prompt} ] ) return response.choices[0].message.content6.2 创建视觉化展示我们可以用简单的HTML和CSS创建一个视觉黑板报。这里我用Python生成HTML文件。def create_visual_report(report_content, products_data, output_file竞品分析报告.html): 创建可视化HTML报告 # 提取关键数据用于可视化 price_range [p[clean_price] for p in products_data if p[clean_price] 0] avg_price sum(price_range) / len(price_range) if price_range else 0 # 生成HTML内容 html_template f !DOCTYPE html html head meta charsetutf-8 title竞品分析视觉报告/title style body {{ font-family: Segoe UI, Arial, sans-serif; max-width: 1200px; margin: 0 auto; padding: 20px; background: #f8f9fa; }} .board {{ background: white; border-radius: 12px; padding: 30px; box-shadow: 0 4px 20px rgba(0,0,0,0.1); }} .header {{ text-align: center; margin-bottom: 40px; border-bottom: 3px solid #4a6fa5; padding-bottom: 20px; }} .header h1 {{ color: #2c3e50; margin: 0; }} .header .subtitle {{ color: #7f8c8d; font-size: 1.2em; }} .insight-card {{ background: #fff; border-left: 5px solid #3498db; padding: 20px; margin: 20px 0; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.05); }} .insight-card h3 {{ color: #2c3e50; margin-top: 0; }} .metric {{ display: inline-block; background: #e8f4fc; padding: 10px 20px; margin: 10px; border-radius: 20px; font-weight: bold; color: #2980b9; }} .product-grid {{ display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 20px; margin: 30px 0; }} .product-card {{ background: white; border: 1px solid #e0e0e0; border-radius: 10px; padding: 20px; transition: transform 0.2s; }} .product-card:hover {{ transform: translateY(-5px); box-shadow: 0 5px 15px rgba(0,0,0,0.1); }} .price-tag {{ background: #2ecc71; color: white; padding: 5px 15px; border-radius: 15px; display: inline-block; font-weight: bold; }} .sentiment-bar {{ height: 10px; background: #ecf0f1; border-radius: 5px; margin: 10px 0; overflow: hidden; }} .positive-bar {{ height: 100%; background: #2ecc71; float: left; }} .negative-bar {{ height: 100%; background: #e74c3c; float: left; }} .recommendation {{ background: #fffde7; border: 2px dashed #f1c40f; padding: 20px; border-radius: 10px; margin: 30px 0; }} /style /head body div classboard div classheader h1 竞品分析视觉报告/h1 div classsubtitle基于{len(products_data)}款产品数据分析 · {time.strftime(%Y年%m月%d日)}/div /div div classinsight-card h3 市场快照/h3 div span classmetric平均价格¥{avg_price:,.0f}/span span classmetric分析产品{len(products_data)}款/span span classmetric价格区间¥{min(price_range):,.0f} - ¥{max(price_range):,.0f}/span /div /div div classinsight-card h3 用户最关注的3个优点/h3 div stylemargin: 15px 0; # 添加用户关注点 all_advantages [] for product in products_data: all_advantages.extend(product[review_summary][top_advantages]) from collections import Counter top_advantages Counter(all_advantages).most_common(3) for advantage, count in top_advantages: html_template fdiv stylemargin: 10px 0; padding: 10px; background: #d5f4e6; border-radius: 5px;{advantage} small(在{count}款产品中被提及)/small/div html_template /div /div div classinsight-card h3⚠️ 主要用户痛点/h3 # 添加用户痛点 all_disadvantages [] for product in products_data: all_disadvantages.extend(product[review_summary][top_disadvantages]) top_disadvantages Counter(all_disadvantages).most_common(3) for disadvantage, count in top_disadvantages: html_template fdiv stylemargin: 10px 0; padding: 10px; background: #fadbd8; border-radius: 5px;{disadvantage} small(在{count}款产品中被提及)/small/div html_template f /div h2️ 产品定位分布/h2 div classproduct-grid # 添加产品卡片 for product in products_data[:6]: # 展示前6个产品 positive_pct product[review_summary][sentiment_distribution][positive] html_template f div classproduct-card h4{product[title][:30]}.../h4 div classprice-tag¥{product[clean_price]:,}/div div stylemargin: 15px 0; div屏幕{product[specifications].get(屏幕尺寸, N/A)}/div div电池{product[specifications].get(电池容量, N/A)}/div div存储{product[specifications].get(存储容量, N/A)}/div /div div用户满意度/div div classsentiment-bar div classpositive-bar stylewidth: {positive_pct}%/div div classnegative-bar stylewidth: {100-positive_pct}%/div /div div stylefont-size: 0.9em; color: #666; 正面评价{positive_pct:.1f}% /div /div html_template /div div classrecommendation h3 核心建议/h3 div stylemargin: 15px 0; div stylemargin: 10px 0;• strong价格策略/strong考虑在¥{price_range_midpoint}价位段推出竞争力产品/div div stylemargin: 10px 0;• strong产品配置/strong重点提升用户最关注的{top_advantage}体验/div div stylemargin: 10px 0;• strong差异化/strong针对{top_disadvantage}痛点提供解决方案/div /div /div div stylemargin-top: 40px; padding-top: 20px; border-top: 1px solid #eee; color: #7f8c8d; font-size: 0.9em; 报告生成时间{time.strftime(%Y-%m-%d %H:%M:%S)} | 数据来源公开电商平台 /div /div script // 简单的交互效果 document.querySelectorAll(.product-card).forEach(card {{ card.addEventListener(click, function() {{ alert(产品详情 this.querySelector(h4).textContent); }}); }}); /script /body /html # 保存HTML文件 with open(output_file, w, encodingutf-8) as f: f.write(html_template) print(f可视化报告已生成{output_file}) return output_file # 生成报告 report_html create_visual_report(report_content, processed_data)这个HTML报告打开后团队同事一眼就能看到关键信息市场平均价格、用户最关注的优点和痛点、各产品定位分布还有具体的行动建议。比传统的Excel表格或PPT要直观得多。7. 实际应用与效果在实际项目中应用这套方案后效果相当明显。以前需要2-3天才能完成的数据清洗和报告整理工作现在半天就能搞定。而且质量还更高——Qwen3能发现一些人工分析时容易忽略的细节。几个实际的应用场景市场监控日报每天自动抓取竞品信息生成每日市场动态报告。产品经理每天早上打开邮件就能看到最新的市场情况包括价格变动、新品上市、用户反馈变化等。产品定位分析当我们考虑推出新产品时用这个流程快速分析当前市场格局找到价格空白点或者配置差异化机会。Qwen3能帮我们识别出“用户想要但现有产品没做好”的功能点。营销策略制定基于用户评论的情感分析我们可以了解用户对竞品的真实评价从而制定更有针对性的营销话术。比如如果发现用户普遍抱怨某竞品“电池续航短”我们就可以在营销中强调自己产品的长续航特性。技术选型参考对于技术产品Qwen3可以从技术文档、论坛讨论中提取关键信息帮我们了解竞品的技术架构、采用的框架和工具为我们的技术选型提供参考。8. 总结这套基于Qwen3的爬虫数据处理方案最大的价值在于它把原本需要大量人工劳动的工作自动化了而且做得比人工更好。Qwen3能理解自然语言的细微差别能从杂乱的数据中提取出真正有用的信息这是传统规则方法做不到的。实际用下来我觉得最爽的点是灵活性。今天要分析电商数据明天要处理技术文档后天要整理用户反馈我都不需要重写整个处理流程。只需要调整给Qwen3的提示词它就能适应不同的任务。这种“一句话描述需求自动得到结果”的体验确实能大幅提升工作效率。当然这套方案也不是完美的。对于特别专业或者小众的领域Qwen3可能需要更多的示例来学习。另外处理大量数据时API调用成本和时间也需要考虑。不过对于大多数常见的商业分析场景它已经足够好用了。如果你也在做市场分析、竞品调研或者数据整理的工作建议试试这个思路。先从一个小规模的数据集开始看看Qwen3能不能理解你的业务需求。一旦跑通了你会发现很多重复性的数据分析工作都可以交给它你能更专注于真正的洞察和决策。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。