网站使用网络图片做素材 侵权吗,直播带货代运营公司,什么网站做企业邮箱服务器,网站做压测基于MiniCPM-V-2_6的Python爬虫数据清洗实战#xff1a;自动化处理与存储 你是不是也遇到过这样的烦恼#xff1f;写了个爬虫吭哧吭哧爬下来一堆数据#xff0c;结果打开一看#xff0c;全是乱码、广告、导航栏#xff0c;真正有用的内容被埋在各种HTML标签和无关信息里 Win64; x64) AppleWebKit/537.36 } try: response requests.get(url, headersheaders, timeout10) response.raise_for_status() # 假设网页编码是utf-8可根据实际情况调整 response.encoding response.apparent_encoding or utf-8 return response.text except requests.RequestException as e: print(f抓取网页失败 {url}: {e}) return None def html_to_clean_text(html_content): 将HTML转换为相对干净的纯文本供模型处理。 这里使用html2text它能较好地去除标签保留文本结构。 if not html_content: return # 也可以用BeautifulSoup的get_text()但html2text能保留一些格式如换行 converter html2text.HTML2Text() converter.ignore_links False # 保留链接文本 converter.ignore_images False # 保留图片alt文本 converter.body_width 0 # 不换行 markdown_text converter.handle(html_content) # 简单清理过多的空白行 cleaned_lines [line.strip() for line in markdown_text.split(\n) if line.strip()] return \n.join(cleaned_lines[:500]) # 截取前500行避免文本过长关键点这里没有做复杂的解析只是把HTML转成了结构相对清晰的Markdown格式文本。复杂的解析工作我们交给模型。2.3 核心步骤二调用模型进行智能解析这是最核心的部分。我们将清洗任务设计成一系列给模型的“指令”。# model_processor.py import openai from config import MODEL_API_BASE, MODEL_API_KEY, MODEL_NAME # 配置OpenAI客户端指向我们的模型服务 client openai.OpenAI( base_urlMODEL_API_BASE, api_keyMODEL_API_KEY ) def extract_with_model(clean_text, url): 调用MiniCPM-V-2_6模型从文本中提取结构化信息 # 设计一个详细的系统指令告诉模型我们的任务和期望的输出格式 system_prompt 你是一个专业的网页内容分析助手。请仔细阅读用户提供的网页文本内容并从中准确提取出以下结构化信息 1. **文章标题**找出最核心、最主要的标题。 2. **正文内容**提取文章的主要正文去除导航栏、侧边栏、广告、页脚、作者介绍等无关内容。请保持正文的连贯性和完整性。 3. **发布时间**如果文本中包含明确的发布日期或时间请提取出来格式如YYYY-MM-DD HH:MM:SS。如果没有则输出“未找到”。 4. **文章分类**根据文章内容判断它最可能属于哪个类别例如人工智能、区块链、云计算、智能手机、汽车科技、金融科技等。如果无法判断则输出“其他”。 请以纯JSON格式输出且只输出JSON不要有任何额外的解释、标记或前言。JSON键名必须为title, main_content, publish_time, category。 user_prompt f网页URL{url} 网页文本内容如下 {clean_text} 请根据上述系统指令提取信息。 try: response client.chat.completions.create( modelMODEL_NAME, messages[ {role: system, content: system_prompt}, {role: user, content: user_prompt} ], temperature0.1, # 低温度让输出更确定、更稳定 max_tokens2000 ) result_text response.choices[0].message.content.strip() # 尝试解析返回的JSON import json extracted_data json.loads(result_text) return extracted_data except json.JSONDecodeError as e: print(f模型返回结果不是有效JSON: {result_text[:200]}... 错误: {e}) return None except Exception as e: print(f调用模型API失败: {e}) return None这个函数做了啥它把清洗后的网页文本和URL一起扔给模型并通过精心设计的system_prompt要求模型以严格的JSON格式返回标题、正文、时间和分类。模型会利用其强大的语义理解能力从杂乱的文本中“挑”出我们需要的东西。2.4 核心步骤三数据存储与去重信息提取出来后我们需要把它存起来。这里用MongoDB举例你也可以用MySQL、PostgreSQL或者简单的JSON文件。# storage.py from pymongo import MongoClient, UpdateOne from pymongo.errors import DuplicateKeyError from config import MONGO_URI, DATABASE_NAME, COLLECTION_NAME import hashlib def get_database_client(): 获取MongoDB数据库连接 client MongoClient(MONGO_URI) return client[DATABASE_NAME] def generate_doc_id(url, title): 根据URL和标题生成一个唯一ID用于去重 content f{url}_{title} return hashlib.md5(content.encode(utf-8)).hexdigest() def save_article(article_data, url): 将提取的文章数据存入数据库 if not article_data or title not in article_data: print(文章数据无效跳过存储。) return False db get_database_client() collection db[COLLECTION_NAME] # 准备文档 doc_id generate_doc_id(url, article_data[title]) document { _id: doc_id, # 使用自定义ID便于去重 url: url, title: article_data.get(title), main_content: article_data.get(main_content), publish_time: article_data.get(publish_time), category: article_data.get(category), source_text_md5: hashlib.md5(article_data.get(main_content, ).encode()).hexdigest(), # 可选用于内容相似度去重 crawl_time: datetime.datetime.utcnow() } try: # 使用upsert操作如果_id存在则更新不存在则插入 result collection.update_one( {_id: doc_id}, {$set: document}, upsertTrue ) if result.upserted_id: print(f文章已插入: {article_data[title][:50]}...) else: print(f文章已更新: {article_data[title][:50]}...) return True except Exception as e: print(f存储文章到数据库失败: {e}) return False2.5 整合与运行完整的流水线脚本最后我们把所有步骤串起来形成一个完整的处理流程。# main.py import time from crawler import fetch_webpage, html_to_clean_text from model_processor import extract_with_model from storage import save_article def process_single_url(url): 处理单个URL的完整流程 print(f\n开始处理: {url}) # 1. 抓取网页 html fetch_webpage(url) if not html: return False # 2. 转换为干净文本 clean_text html_to_clean_text(html) if not clean_text: print(网页内容为空或转换失败。) return False print(f获取到文本长度: {len(clean_text)} 字符) # 3. 调用模型提取信息 print(正在调用模型进行智能解析...) extracted_data extract_with_model(clean_text, url) if not extracted_data: print(模型解析失败。) return False print(f解析成功标题: {extracted_data.get(title, N/A)}) # 4. 存储到数据库 success save_article(extracted_data, url) return success if __name__ __main__: # 示例URL列表 url_list [ https://example-tech-news.com/article1, https://another-tech-site.com/news/2024/ai-trend, # ... 更多URL ] for url in url_list: success process_single_url(url) if not success: print(f处理 {url} 失败跳过。) # 礼貌性延迟避免给目标网站造成压力 time.sleep(2) print(\n所有URL处理完毕)运行这个脚本你的爬虫就能自动完成从抓取、智能解析到存储的全过程了。3. 效果展示与性能优化建议我用自己的博客和几个新闻网站做了测试效果比预想的好。3.1 实际效果如何正文提取准确率高对于常见的新闻文章页、博客页模型能非常准确地把正文部分“抠”出来自动过滤掉“相关阅读”、“推荐视频”这些干扰块。这比单纯用div.content这类选择器要稳健得多。分类与打标有用让模型自动分类虽然比不上人工标注精准但对于构建初步的标签体系、做内容筛选和聚合已经非常有帮助了。比如它能正确地把一篇讲GPT-4新特性的文章分到“人工智能”类。处理非结构化信息比如从一段产品描述中提取“售价$299”这样的信息或者识别出“发布于三天前”并尝试转换为具体日期模型都能在一定程度上完成。当然它也不是万能的。如果网页文本本身极其混乱、信息密度极低或者模型指令Prompt设计得不好效果也会打折扣。3.2 如何优化与提升想让这套流程跑得更快、更稳、更省钱可以试试下面这些方法Prompt工程优化这是提升效果最关键的一环。多测试、多调整你的system_prompt。比如提供更详细的分类列表、规定输出时间的格式、要求正文至少包含多少字符等。清晰的指令能得到更稳定的输出。批量处理与异步调用如果你有大量网页要处理一个个调用API太慢了。可以先将多个网页的文本收集起来批量发送给模型如果API支持或者使用异步请求库如aiohttp并发调用能极大提升吞吐量。设置合理的文本长度大模型处理长文本成本高、速度慢。在html_to_clean_text阶段可以更激进地截断文本比如只保留前3000个字符。对于新闻文章来说这通常已经包含了所有核心信息。引入缓存机制对于内容更新不频繁的网站可以将模型提取的结果缓存起来比如用Redis。下次遇到相同URL或内容哈希时直接使用缓存省下大量的模型调用开销。模型输出后处理与校验不要完全信任模型的输出。可以写一些简单的后处理规则进行校验比如检查提取的标题是否过短、发布时间格式是否正确。如果不符合可以尝试用更简单的规则如正则进行二次提取或者标记为需要人工复核。成本监控如果使用按Token计费的API一定要监控你的使用量。对于清洗任务通常不需要模型进行长篇大论的思考可以通过设置较低的max_tokens参数来控制单次响应的长度从而控制成本。4. 总结把MiniCPM-V-2_6这样的多模态大模型引入爬虫数据清洗流程算是一个挺有意思的尝试。它最大的价值在于用“语义理解”这个更高级的能力部分替代了传统“规则匹配”的脏活让爬虫在面对结构多样、内容复杂的网页时有了更强的适应性和鲁棒性。从我实际的体验来看这套方案特别适合那些需要从大量不同来源、不同样式的网页中抽取结构化信息的场景比如舆情监控、竞品分析、知识库构建等。它减少了针对每个网站定制解析规则的工作量把开发者的精力从“怎么写规则”转移到了“怎么设计好任务指令”上。当然它也不是没有缺点模型调用有延迟和成本效果也依赖于Prompt的设计和模型本身的能力。但在很多情况下用一点计算成本换取开发效率的极大提升和维护成本的显著降低这笔账是算得过来的。如果你也在为爬虫数据清洗头疼不妨试试这个思路或许能打开一扇新的大门。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。