Python爬虫入门教程 78-100 用Scrapy+BloomFilter再写个增量爬虫

本文介绍了如何使用Python的Scrapy框架和BloomFilter实现增量爬虫。通过pybloom_live库处理布隆过滤器,解决网络爬虫的去重问题。文章详细讲解了BloomFilter的应用场景,如邮件黑名单和KV系统快速判断Key。还提供了Scrapy爬虫代码示例,并指导如何设置定时任务来运行爬虫。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面

今天是第78篇Python爬虫博客了,在这里立个Flag,争取在10月1日之前把爬虫百例写完,如果你从第一篇看到现在,你应该是一个合格的爬虫Coder了,继续加油!!

继续搞定增量爬虫,本文涉及两个Python模块,一个为Scrapy,另一个是BloomFilter

BloomFilter(布隆过滤器)使用场景

关于BloomFilter是谁发明的以及为什么发明,本文就不在赘述了,下面主要给大家分享一下BloomFilter使用的场景

  1. 黑名单应用(邮件黑名单)
  2. 网络爬虫去重(和我们要学的增量爬虫产生了关联)
  3. KV系统快速判断Key是否存在
  4. 减少缓存穿透(具体没尝试过,不做过多的解释,可以参照:http://blog.itpub.net/31561269/viewspace-2639083/ 博客内容)

今天需要掌握的一个库叫做pybloom_live 关于它的源码,最新的版本参照 https://pypi.org/project/pybloom_live/

首先去github查阅一下依赖库,这个地方蛮重要的,如果不注意后续很容易翻车https://github

<think>好的,我现在需要帮助用户构建一个基于关键词爬虫的AI知识库,并涉及ChromaDB的应用。首先,我应该先理清整个流程,确保每个步骤都正确无误。用户可能对爬虫、知识库构建以及ChromaDB的使用不太熟悉,所以需要分步骤详细说明。 首先,用户提到了关键词爬虫,所以第一步应该是如何实现爬虫功能。根据引用[4]和[5],用户可能需要使用Python的库如requests和BeautifulSoup来发送请求和解析网页。同时,引用[2]提到了其他爬虫库比如Scrapy和portia,不过考虑到用户可能更倾向于简单实现,用requests和BeautifulSoup会更合适。此外,引用[4]还提到安装这些库的命令,我需要确保用户正确安装依赖。 接下来是数据存储部分。用户需要将爬取的数据结构化存储,可能用SQLite或者文本文件。根据引用[3],知识图谱的数据存储可能需要更复杂的结构,但这里用户只需要关键词相关的数据,所以简单的数据库或文件存储即可。 然后是文本向量化,这部分需要用到自然语言处理模型。引用[4]提到了使用dashscope库,这可能是指阿里云的通义千问模型,或者其他预训练模型如Sentence Transformers。这里需要确认用户是否有访问这些模型的权限,并指导如何将文本转换为向量。 接下来是使用ChromaDB进行向量存储和检索。ChromaDB是一个向量数据库,用户需要知道如何安装和初始化,如何将向量数据存入,并进行相似性搜索。需要详细说明每一步的操作,包括代码示例。 最后,整合整个系统,确保爬虫、处理、存储和检索各环节衔接顺畅。可能需要提供完整的代码框架,并解释各部分的功能。 同时,用户可能关心性能优化、扩展性以及实际应用中的问题,比如爬虫的合法性、反爬措施处理、模型选择等。引用[5]提到知识图谱的重要性,可能需要考虑数据的关系和结构,但当前项目可能更侧重于关键词和向量检索,所以这部分可以简要提及。 在编代码时,要注意异常处理,比如网络请求失败、解析错误等,确保系统的健壮性。同时,数据清洗和预处理也是关键步骤,避免无效数据影响知识库质量。 还需要考虑ChromaDB的具体用法,比如如何创建集合、插入数据、查询等。可能需要参考官方文档,确保代码的正确性。 总结下来,步骤大致分为:爬虫实现、数据存储、文本向量化、ChromaDB集成、系统整合。每个步骤都需要详细说明,并给出示例代码。同时,要提醒用户注意法律合规性和伦理问题,确保爬虫行为符合目标网站的规则。</think>以下是使用Python构建基于关键词爬虫的AI知识库,并结合ChromaDB的实现方案: ### 一、系统架构设计 ```mermaid graph TD A[网络爬虫] --> B[数据清洗] B --> C[向量化处理] C --> D[ChromaDB存储] D --> E[语义检索] ``` ### 二、实现步骤详解 #### 1. 关键词爬虫开发 ```python import requests from bs4 import BeautifulSoup from urllib.parse import urljoin class KeywordSpider: def __init__(self, seed_url, keywords): self.seed_url = seed_url self.keywords = keywords self.visited = set() def crawl(self, max_depth=2): results = [] queue = [(self.seed_url, 0)] while queue: url, depth = queue.pop(0) if depth > max_depth or url in self.visited: continue try: response = requests.get(url, timeout=10) soup = BeautifulSoup(response.text, 'html.parser') text = soup.get_text() # 关键词匹配逻辑 if any(keyword.lower() in text.lower() for keyword in self.keywords): results.append({ 'url': url, 'content': text[:2000] # 截取前2000字符 }) # 提取新链接 for link in soup.find_all('a', href=True): absolute_url = urljoin(url, link['href']) if absolute_url.startswith('http'): queue.append((absolute_url, depth+1)) self.visited.add(url) except Exception as e: print(f"Error fetching {url}: {str(e)}") return results ``` *说明:该爬虫支持关键词过滤和层级控制,使用BeautifulSoup解析HTML[^4]* #### 2. 数据向量化处理 ```python from sentence_transformers import SentenceTransformer # 加载预训练模型 model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2') def vectorize_text(texts): return model.encode(texts) ``` *说明:使用轻量级多语言模型生成文本向量[^4]* #### 3. ChromaDB集成 ```python import chromadb from chromadb.config import Settings # 初始化客户端 client = chromadb.Client(Settings( chroma_db_impl="duckdb+parquet", persist_directory=".chromadb" )) # 创建集合 collection = client.create_collection("knowledge_base") # 添加数据示例 def add_to_chroma(data): ids = [str(hash(item['url'])) for item in data] documents = [item['content'] for item in data] embeddings = vectorize_text(documents) collection.add( embeddings=embeddings.tolist(), documents=documents, ids=ids, metadatas=[{"source": item['url']} for item in data] ) ``` ### 三、完整工作流程 1. 初始化爬虫并获取数据 ```python spider = KeywordSpider( seed_url="https://example.com", keywords=["人工智能", "机器学习"] ) data = spider.crawl() ``` 2. 数据清洗(示例) ```python import re def clean_text(text): text = re.sub(r'\s+', ' ', text) # 去除多余空格 text = re.sub(r'<[^>]+>', '', text) # 去除HTML标签 return text.strip() for item in data: item['content'] = clean_text(item['content']) ``` 3. 存储到ChromaDB ```python add_to_chroma(data) client.persist() # 持久化存储 ``` 4. 知识检索示例 ```python def semantic_search(query, top_k=3): query_vec = vectorize_text([query])[0] results = collection.query( query_embeddings=[query_vec.tolist()], n_results=top_k ) return results ``` ### 四、性能优化建议 1. 使用异步请求提升爬虫效率(如aiohttp) 2. 添加Bloom Filter进行URL去重[^5] 3. 实现增量爬取机制 4. 添加请求速率限制避免被封禁 ### 五、法律与伦理注意事项 1. 遵守robots.txt协议 2. 设置合理的请求间隔(建议≥2秒) 3. 仅爬取公开可用数据 4. 尊重网站版权声明
评论 45
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想橡皮擦

如有帮助,来瓶可乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值