在千万级数据抓取需求下,传统单机爬虫面临严峻挑战:
分布式爬虫优势:
[分布式节点集群]
├─ Node1: Spider1 → Redis调度队列
├─ Node2: Spider2 → Redis数据管道
├─ Node3: Spider3 → BloomFilter去重
└─ ...
↓
[统一存储层]
├─ MySQL/ClickHouse(结构化存储)
└─ HDFS/MinIO(非结构化存储)
模块 | 原生Scrapy | Scrapy-Redis |
---|---|---|
调度器 | 内存队列 | Redis优先队列 |
去重机制 | 内存set | RedisSet/BloomFilter |
请求分发 | 单机处理 | 多节点协同消费 |
状态持久化 | 手动维护 | 自动持久化 |
扩展性 | 垂直扩展 | 水平扩展 |
# 安装Scrapy-Redis
pip install scrapy-redis redis
# 启动Redis集群(Docker版)
docker run -d --name redis-master -p 6379:6379 redis
docker run -d --name redis-replica1 -p 6380:6379 redis replicaof redis-master 6379
# settings.py核心配置
SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 启用Redis调度
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # Redis去重
REDIS_URL = 'redis://:[email protected]:6379' # Redis连接
SCHEDULER_PERSIST = True # 保持爬虫状态
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue' # 优先级队列
# 数据管道配置
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 300
}
from scrapy_redis.spiders import RedisSpider
class DistributedSpider(RedisSpider):
name = 'cluster_spider'
redis_key = 'myspider:start_urls' # Redis起始键
def parse(self, response):
# 提取详情页链接
detail_links = response.css('a.detail::attr(href)').getall()
for link in detail_links:
yield scrapy.Request(link, callback=self.parse_detail)
# 自动翻页逻辑
next_page = response.css('li.next-page a::attr(href)').get()
if next_page:
yield self.make_next_request(next_page)
def make_next_request(self, url):
# 携带优先级参数
return scrapy.Request(url,
priority=100, # 优先级权重
meta={'retry_times': 0} # 重试次数记录
)
from pybloom_live import ScalableBloomFilter
class BloomDupeFilter(RFPDupeFilter):
def __init__(self, server, key):
super().__init__(server, key)
self.bf = ScalableBloomFilter(
initial_capacity=1000000,
error_rate=0.001
)
def request_seen(self, request):
fp = self.request_fingerprint(request)
if fp in self.bf:
return True
self.bf.add(fp)
self.server.sadd(self.key, fp)
return False
# 根据URL深度自动调整优先级
def adjust_priority(request):
depth = request.meta.get('depth', 0)
return 1000 // (depth + 1)
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_START_DELAY = 1.0
AUTOTHROTTLE_MAX_DELAY = 60.0
AUTOTHROTTLE_TARGET_CONCURRENCY = 50.0
# 自定义Redis连接池
import redis
pool = redis.ConnectionPool(
host='cluster.example.com',
port=6379,
max_connections=100,
socket_timeout=10
)
REDIS_PARAMS = {'connection_pool': pool}
class ShardingPipeline:
def process_item(self, item, spider):
# 根据时间分片存储
ts = int(time.time() * 1000)
shard_id = ts % 16 # 16个分片
self.conn.hset(f"data:shard:{shard_id}", ts, json.dumps(item))
# 节点健康检查脚本
import redis
r = redis.StrictRedis()
def node_heartbeat():
while True:
r.zadd('nodes:alive', {NODE_ID: time.time()})
time.sleep(30)
规模:10节点Docker集群(8核16G/节点)
数据目标:日均抓取100万新闻条目
技术栈:
指标 | 单机模式 | 分布式模式 |
---|---|---|
请求处理QPS | 120 | 8500 |
去重效率 | 98.5% | 99.99% |
故障恢复时间 | 15分钟+ | <30秒 |
日均抓取量 | 20万 | 120万+ |
Python爬虫介绍 | Python爬虫(1)Python爬虫:从原理到实战,一文掌握数据采集核心技术 |
HTTP协议解析 | Python爬虫(2)Python爬虫入门:从HTTP协议解析到豆瓣电影数据抓取实战 |
HTML核心技巧 | Python爬虫(3)HTML核心技巧:从零掌握class与id选择器,精准定位网页元素 |
CSS核心机制 | Python爬虫(4)CSS核心机制:全面解析选择器分类、用法与实战应用 |
静态页面抓取实战 | Python爬虫(5)静态页面抓取实战:requests库请求头配置与反反爬策略详解 |
静态页面解析实战 | Python爬虫(6)静态页面解析实战:BeautifulSoup与lxml(XPath)高效提取数据指南 |
Python数据存储实战 CSV文件 | Python爬虫(7)Python数据存储实战:CSV文件读写与复杂数据处理指南 |
Python数据存储实战 JSON文件 | Python爬虫(8)Python数据存储实战:JSON文件读写与复杂结构化数据处理指南 |
Python数据存储实战 MySQL数据库 | Python爬虫(9)Python数据存储实战:基于pymysql的MySQL数据库操作详解 |
Python数据存储实战 MongoDB数据库 | Python爬虫(10)Python数据存储实战:基于pymongo的MongoDB开发深度指南 |
Python数据存储实战 NoSQL数据库 | Python爬虫(11)Python数据存储实战:深入解析NoSQL数据库的核心应用与实战 |
Python爬虫数据存储必备技能:JSON Schema校验 | Python爬虫(12)Python爬虫数据存储必备技能:JSON Schema校验实战与数据质量守护 |
Python爬虫数据安全存储指南:AES加密 | Python爬虫(13)数据安全存储指南:AES加密实战与敏感数据防护策略 |
Python爬虫数据存储新范式:云原生NoSQL服务 | Python爬虫(14)Python爬虫数据存储新范式:云原生NoSQL服务实战与运维成本革命 |
Python爬虫数据存储新维度:AI驱动的数据库自治 | Python爬虫(15)Python爬虫数据存储新维度:AI驱动的数据库自治与智能优化实战 |
Python爬虫数据存储新维度:Redis Edge近端计算赋能 | Python爬虫(16)Python爬虫数据存储新维度:Redis Edge近端计算赋能实时数据处理革命 |
反爬攻防战:随机请求头实战指南 | Python爬虫(17)反爬攻防战:随机请求头实战指南(fake_useragent库深度解析) |
反爬攻防战:动态IP池构建与代理IP | Python爬虫(18)反爬攻防战:动态IP池构建与代理IP实战指南(突破95%反爬封禁率) |
Python爬虫破局动态页面:全链路解析 | Python爬虫(19)Python爬虫破局动态页面:逆向工程与无头浏览器全链路解析(从原理到企业级实战) |
Python爬虫数据存储技巧:二进制格式性能优化 | Python爬虫(20)Python爬虫数据存储技巧:二进制格式(Pickle/Parquet)性能优化实战 |
Python爬虫进阶:Selenium自动化处理动态页面 | Python爬虫(21)Python爬虫进阶:Selenium自动化处理动态页面实战解析 |