gte-base-zh实战爬取互联网公开数据构建竞品分析知识库你是不是也遇到过这种情况老板突然让你分析一下竞争对手最近在干什么或者想了解某个新兴赛道的市场动态。你手忙脚乱地打开十几个网页从新闻稿、行业报告到论坛帖子信息散落各处看得眼花缭乱最后整理出来的东西还是零零散散抓不住重点。传统的竞品分析往往依赖人工搜索、阅读和整理效率低不说还容易遗漏关键信息。今天我想跟你分享一个我们团队正在用的新方法用Python爬虫自动抓取互联网上的公开信息再用一个叫gte-base-zh的模型把海量文本变成计算机能理解的“向量”最后建成一个能“听懂人话”的智能知识库。你只需要像聊天一样问它“XX公司最近在AI芯片方面有什么新动作”它就能从成千上万篇文章里把最相关、最重要的信息提炼出来给你。这听起来有点技术别担心我会用最直白的方式带你走一遍从零搭建的完整过程。我们不讲复杂的理论就聚焦在怎么用这些工具实实在在地解决“信息过载”和“分析低效”这两个痛点。1. 为什么需要智能化的竞品分析在做这个项目之前我们的分析师每天要花大量时间在重复性的信息搜集工作上。一个分析师可能同时盯着五六个竞争对手每个对手又要关注技术动态、产品发布、市场活动、招聘信息等多个维度。信息来源更是五花八门科技媒体的新闻报道、公司的官方博客、行业研究机构的报告、社交平台上的用户讨论等等。手动操作的问题很明显慢、累、不全。慢是因为需要一个个网站去翻看累是因为阅读和摘要完全是体力活不全是因为人的精力有限很难做到7x24小时监控很容易错过那些非头版头条但可能很重要的信息。我们想要的是一个能自动运转的“信息雷达”。它能按照我们设定的目标持续地从互联网上抓取信息然后自动理解、归纳、存储。当我们需要的时候能用最自然的方式也就是说话向它提问并立刻得到一份脉络清晰、重点突出的简报。gte-base-zh模型和向量数据库技术的结合正好能帮我们实现这个目标。简单来说gte-base-zh就像一个超级高效的中文阅读器能把一段话的意思浓缩成一个数学向量你可以理解为一串有意义的数字指纹而向量数据库则擅长快速查找和这些“指纹”最匹配的内容。2. 实战第一步规划与采集数据源动手之前先想清楚我们要什么。竞品分析不是漫无目的地爬取数据而是要有明确的指向性。2.1 定义分析维与目标我们以“智能驾驶”赛道为例假设要分析几家头部公司。我们通常会关注以下几个维度产品与技术新车发布、系统升级、芯片合作、算法突破。商业动态战略合作、投融资、市场扩张、订单消息。组织与人才高管变动、大规模招聘、组织架构调整。行业与政策相关法规出台、行业标准制定、重大展会信息。基于这些维度我们可以列出需要监控的信息类型新闻、深度分析文章、行业报告、公司官方公告、招聘信息等。2.2 选择合适的公开数据源互联网上的公开数据源质量参差不齐。为了保证信息的时效性和权威性我们会优先选择以下几类科技与财经媒体如36氪、虎嗅、钛媒体等提供及时的行业新闻和深度解读。公司官方渠道公司官网的新闻中心、官方微信公众号、微博等。行业研究机构发布白皮书、市场报告的网站或公众号。招投标平台与政府网站了解To B/G领域的项目动态。社交媒体与社区如知乎特定话题、行业论坛用于了解市场口碑和潜在问题。重要提示爬虫开发必须遵守法律法规和网站的robots.txt协议尊重版权控制请求频率避免对目标网站造成压力。本案例仅用于技术思路分享在实际应用中务必合规操作。2.3. 编写爬虫脚本Python示例这里我们用Python的requests和BeautifulSoup库来做一个简单的演示爬取一个科技媒体网站的列表页和文章详情。实际项目中可能会用到Scrapy框架或Playwright来处理更复杂的页面。import requests from bs4 import BeautifulSoup import time import json def fetch_article_list(base_url, pages3): 抓取文章列表页提取文章链接和标题 articles [] headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } for page in range(1, pages 1): url f{base_url}/page/{page} try: resp requests.get(url, headersheaders, timeout10) resp.raise_for_status() soup BeautifulSoup(resp.text, html.parser) # 假设文章链接在 class 为 post-title 的 a 标签里 for item in soup.find_all(a, class_post-title): link item.get(href) title item.get_text(stripTrue) if link and title: articles.append({title: title, url: link}) print(f已抓取第 {page} 页共 {len(articles)} 篇文章) time.sleep(1) # 礼貌延迟避免请求过快 except Exception as e: print(f抓取列表页 {url} 时出错: {e}) continue return articles def fetch_article_detail(article_info): 抓取单篇文章详情页提取正文、发布时间等 url article_info[url] headers {User-Agent: 你的浏览器User-Agent} detail {title: article_info[title], url: url, content: , publish_time: } try: resp requests.get(url, headersheaders, timeout10) resp.raise_for_status() soup BeautifulSoup(resp.text, html.parser) # 提取正文这里需要根据目标网站的实际HTML结构调整 content_div soup.find(div, class_article-content) # 示例class if content_div: # 移除脚本、样式等无关标签 for tag in content_div([script, style, nav, footer]): tag.decompose() detail[content] content_div.get_text(separator\n, stripTrue) # 提取发布时间 time_tag soup.find(time) if time_tag: detail[publish_time] time_tag.get(datetime) or time_tag.get_text(stripTrue) except Exception as e: print(f抓取文章详情 {url} 时出错: {e}) return detail # 使用示例 if __name__ __main__: # 假设我们要爬取某个科技媒体的智能汽车栏目 base_url https://example-tech-site.com/category/auto-driving article_list fetch_article_list(base_url, pages2) all_articles_data [] for article in article_list: detail fetch_article_detail(article) if detail[content]: # 只保存有内容的文章 all_articles_data.append(detail) time.sleep(1.5) # 增加请求间隔 # 将数据保存为JSON文件供后续处理 with open(competitor_articles.json, w, encodingutf-8) as f: json.dump(all_articles_data, f, ensure_asciiFalse, indent2) print(f数据采集完成共保存 {len(all_articles_data)} 篇文章。)这个脚本跑完后你会得到一个competitor_articles.json文件里面包含了文章的标题、链接、正文和发布时间。这就是我们后续处理的原材料。3. 核心处理用gte-base-zh理解文本爬下来的原始文本是“非结构化”数据计算机看不懂。我们需要用gte-base-zh模型将它们转换成“向量”也叫嵌入Embedding。这个向量就像是文本的“数学指纹”语义相近的文本其向量在空间中的距离也更近。3.1. 什么是gte-base-zhgte-base-zh是一个专门针对中文优化的文本向量生成模型。比起通用的多语言模型它在中文任务上表现更好能更精准地捕捉中文的语义和上下文关系。你不需要理解它复杂的神经网络结构只需要知道你给它一段中文文本它就能返回一个固定长度的、能代表这段话意思的数字数组向量。3.2. 安装环境与模型准备首先确保你的Python环境建议3.8以上已经安装好。然后我们通过Hugging Face的transformers库来使用这个模型。pip install transformers torch sentence-transformerssentence-transformers库是对transformers的封装用它来生成句子向量更方便。3.3. 批量生成文本向量接下来我们读取刚才爬取的数据并用gte-base-zh为每一篇文章的正文或标题正文生成向量。from sentence_transformers import SentenceTransformer import json # 加载gte-base-zh模型 print(正在加载 gte-base-zh 模型...) model SentenceTransformer(Alibaba-NLP/gte-base-zh-v1.5) # 使用阿里云开源的版本 print(模型加载完毕。) # 加载爬取的文章数据 with open(competitor_articles.json, r, encodingutf-8) as f: articles json.load(f) # 准备文本。这里我们简单地将“标题”和“正文”前200字拼接起来作为输入。 # 在实际应用中你可能需要更精细的文本清洗去重、去噪、分段等。 texts_to_encode [] for article in articles: # 简单的文本预处理取正文前500字符避免过长 content_preview article[content][:500] combined_text f{article[title]}。{content_preview} texts_to_encode.append(combined_text) # 批量生成向量。模型会自动将文本转换为768维的向量对于gte-base-zh。 print(f开始为 {len(texts_to_encode)} 段文本生成向量...) embeddings model.encode(texts_to_encode, normalize_embeddingsTrue, # 归一化方便后续计算相似度 show_progress_barTrue) print(f向量生成完成。向量维度{embeddings.shape}) # 应该是 (文章数量, 768) # 将向量存回文章数据中 for i, article in enumerate(articles): article[embedding] embeddings[i].tolist() # 将numpy数组转为列表 # 保存带有向量的数据 with open(articles_with_embeddings.json, w, encodingutf-8) as f: json.dump(articles, f, ensure_asciiFalse, indent2) print(已保存带有文本向量的数据。)运行这段代码后每篇文章都多了一个embedding字段里面是一个包含768个数字的列表。这就是文本的“灵魂”。4. 构建与查询向量知识库有了向量我们还需要一个能高效存储和检索它们的数据库。这就是向量数据库的用武之地。这里我们选用轻量且流行的Chroma。4.1. 初始化Chroma向量数据库pip install chromadbimport chromadb from chromadb.config import Settings import uuid # 创建或连接一个本地的Chroma数据库 chroma_client chromadb.PersistentClient(path./competitor_knowledge_db) # 创建一个集合Collection类似于数据库中的表 collection chroma_client.get_or_create_collection( namecompetitor_articles, metadata{description: 存储竞品分析文章的向量知识库} ) # 准备存入数据库的数据 ids [] documents [] metadatas [] for i, article in enumerate(articles): # 生成唯一ID doc_id str(uuid.uuid4()) ids.append(doc_id) # 文档内容我们存储标题和正文的摘要或前一部分 doc_content f标题{article[title]}\n内容摘要{article[content][:300]}... # 存储部分内容 documents.append(doc_content) # 元数据存储原文链接、发布时间等方便溯源 metadatas.append({ source_url: article[url], publish_time: article.get(publish_time, ), full_content_link: saved_local_file # 实际可关联本地存储的全文 }) # 添加数据到集合 # 注意这里我们使用之前生成好的embeddings collection.add( idsids, embeddings[article[embedding] for article in articles], # 传入我们预先计算好的向量 documentsdocuments, metadatasmetadatas ) print(f成功将 {len(ids)} 篇文章存入向量数据库。)4.2. 实现自然语言智能查询最激动人心的部分来了现在我们可以用最自然的方式向这个知识库提问了。def query_knowledge_base(question, top_k5): 向竞品知识库提问 :param question: 自然语言问题如“A公司最近发布了什么新车” :param top_k: 返回最相关的几条结果 # 1. 将问题同样转换为向量 question_embedding model.encode([question], normalize_embeddingsTrue)[0] # 2. 在向量数据库中搜索相似度最高的文档 results collection.query( query_embeddings[question_embedding.tolist()], n_resultstop_k ) # 3. 整理并返回结果 print(f\n 针对问题{question}为您找到以下{len(results[documents][0])}条相关信息\n) for i, (doc, meta) in enumerate(zip(results[documents][0], results[metadatas][0])): print(f【结果 {i1}】) print(f内容摘要{doc[:200]}...) # 打印部分摘要 print(f信息来源{meta[source_url]}) print(f发布时间{meta.get(publish_time, 未知)}) print(- * 50) # 尝试提问 if __name__ __main__: # 示例问题 questions [ XX公司在智能驾驶领域有什么最新合作, 关于激光雷达技术最近有哪些新的进展或应用, 新能源车企在2024年上半年的市场策略有什么变化 ] for q in questions: query_knowledge_base(q) input(\n按Enter键查看下一个问题...)当你运行这段代码并提问时系统会瞬间从几百上千篇文章中找到语义上最相关的那几篇。它不再是关键词匹配比如只搜“合作”二字而是真正理解了“合作”在商业语境下的含义从而把涉及战略合作、投资入股、技术联合研发等内容都找出来。5. 从信息到洞察构建分析报告检索到相关文章只是第一步。一个优秀的分析师还需要从这些信息中提炼出观点、趋势和洞察。我们可以进一步利用大语言模型LLM的能力对检索结果进行总结、分析和报告生成。这里我们可以设计一个简单的流水线智能检索如上所述用gte-base-zh向量数据库找到最相关的N篇文章。内容提炼将检索到的文章全文或关键段落提供给LLM如ChatGLM、Qwen等开源模型或通过API调用云端大模型让它进行要点总结、观点归纳。报告生成给LLM一个报告模板和提炼出的要点让它生成结构化的分析简报包括动态概述、关键事件、潜在影响等。这个过程可以实现高度自动化将分析师从基础的信息整理工作中解放出来专注于更高层次的策略思考。6. 总结走完这一整套流程你会发现构建一个智能竞品分析知识库并没有想象中那么遥不可及。它的核心逻辑非常清晰采集 - 理解向量化- 存储 - 智能检索 - 深度分析。我们用Python爬虫解决了“信息从哪里来”的问题用gte-base-zh这样的专用模型解决了“计算机如何理解中文”的问题再用向量数据库解决了“如何从海量信息中瞬间找到答案”的问题。这套组合拳打下来最大的感受就是“提效”。以前需要半天才能完成的竞品动态梳理现在可能喝杯咖啡的功夫一份由AI初步整理好的简报就出来了。当然这只是个起点。在实际应用中你还可以考虑数据源扩展接入更多类型的源如PDF报告、社交媒体流、专利数据库等。流程自动化用定时任务如Apache Airflow让爬虫、向量化、入库全过程自动运行。前端展示做一个简单的Web界面让业务人员也能直接提问和查看报告。多模态分析不仅分析文本未来还可以结合图像识别分析产品图片用语音识别分析发布会视频。技术最终是为了解决问题。这个案例展示的正是如何用当前唾手可得的AI工具去解决一个非常普遍的业务痛点。如果你也在为信息处理效率发愁不妨试着用这个思路搭建一个属于你自己的“信息雷达”相信它会给你带来不一样的体验。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。