Kubernetes上的爬虫排队术——任务调度与弹性扩缩容实战

简介: 本教程介绍如何在 Kubernetes 上构建可扩展的爬虫系统,解决传统单机爬虫瓶颈。核心内容包括:使用 Docker 打包爬虫任务、RabbitMQ 实现任务队列、爬虫代理防限制、随机 User-Agent 模拟请求,以及通过 Horizontal Pod Autoscaler (HPA) 实现根据任务压力自动扩缩容。适合需要处理大规模网页采集的开发者学习与实践。

爬虫代理

一、背景介绍:为什么要在 Kubernetes 上跑爬虫?

随着网站反爬技术日益严格,传统单机爬虫系统逐渐面临瓶颈。Kubernetes(简称 K8s)作为容器编排利器,天然具备任务调度、负载均衡、故障自动恢复等特性,非常适合构建可水平扩展的爬虫队列系统

本次实战将实现:

  • 📦 使用 Docker 容器打包爬虫任务
  • 📊 使用 RabbitMQ 任务队列实现爬虫任务排队
  • ⛽ 使用爬虫代理(域名、端口、用户名、密码)
  • 🛡 设置随机 User-Agent 防止封禁
  • ☁ 自动根据任务压力扩展 Pod 实例(Horizontal Pod Autoscaler)

二、环境准备

1. 技术栈

  • Python 3.10
  • Scrapy + requests
  • RabbitMQ(任务队列)
  • Kubernetes(使用 kubectl / minikube / cloud K8s 均可)
  • Docker(打包爬虫镜像)
  • 亿牛云爬虫代理

2. 安装依赖

pip install scrapy pika requests

三、核心步骤:任务调度 + 爬虫代理 + 弹性伸缩

1. 创建 RabbitMQ 队列生产者

用于生产任务(汽车新闻栏目页链接)。

# task_producer.py
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(host='rabbitmq-service'))
channel = connection.channel()

channel.queue_declare(queue='news_tasks', durable=True)

# 示例:推送任务
for page in range(1, 11):
    url = f"https://news.yiche.com/qichexinwen/p{page}/"
    channel.basic_publish(exchange='',
                          routing_key='news_tasks',
                          body=url,
                          properties=pika.BasicProperties(delivery_mode=2))  # 持久化消息

print("✅ 已推送任务")
connection.close()

2. 编写爬虫消费者(Worker)

# news_spider.py
import pika
import requests
from bs4 import BeautifulSoup
import random

# 亿牛云爬虫代理配置 
PROXY = "http://16YUN:16IP@proxy.16yun.cn:3100"

USER_AGENTS = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64)...",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)...",
    # 更多 User-Agent 可加入
]

def fetch_and_parse(url):
    headers = {
   
        "User-Agent": random.choice(USER_AGENTS)
    }
    proxies = {
   
        "http": PROXY,
        "https": PROXY
    }

    resp = requests.get(url, headers=headers, proxies=proxies, timeout=10)
    if resp.status_code != 200:
        print(f"❌ 请求失败:{url}")
        return []

    soup = BeautifulSoup(resp.text, "html.parser")
    articles = []
    for item in soup.select(".module .item"):
        title = item.select_one("h3")
        link = item.select_one("a")
        if title and link:
            articles.append({
   
                "title": title.get_text(strip=True),
                "url": link["href"]
            })
    return articles

def callback(ch, method, properties, body):
    url = body.decode()
    print(f"📥 正在处理:{url}")
    articles = fetch_and_parse(url)

    # 将数据写入本地归档
    with open("news_data.txt", "a", encoding="utf-8") as f:
        for a in articles:
            f.write(f"{a['title']} - {a['url']}\n")

    print(f"✅ 完成:{len(articles)}条")
    ch.basic_ack(delivery_tag=method.delivery_tag)

# 连接 RabbitMQ
connection = pika.BlockingConnection(pika.ConnectionParameters(host='rabbitmq-service'))
channel = connection.channel()
channel.queue_declare(queue='news_tasks', durable=True)

channel.basic_qos(prefetch_count=1)
channel.basic_consume(queue='news_tasks', on_message_callback=callback)

print("🔄 等待任务中...")
channel.start_consuming()

3. Dockerfile 构建爬虫镜像

# Dockerfile
FROM python:3.10-slim

WORKDIR /app
COPY . /app

RUN pip install -r requirements.txt

CMD ["python", "news_spider.py"]

4. Kubernetes 部署配置

创建 deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: news-spider
spec:
  replicas: 1
  selector:
    matchLabels:
      app: news-spider
  template:
    metadata:
      labels:
        app: news-spider
    spec:
      containers:
      - name: spider
        image: your-registry/news-spider:latest
        env:
        - name: PROXY
          value: "http://testuser:testpass@proxy.enewcloud.cc:10001"
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: spider-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: news-spider
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

四、完整代码仓库结构

k8s-news-spider/
├── Dockerfile
├── news_spider.py
├── task_producer.py
├── requirements.txt
├── deployment.yaml

requirements.txt 内容:

requests
pika
beautifulsoup4

五、常见错误排查

问题 解决方法
容器连接 RabbitMQ 报错 确保 RabbitMQ 在同一 namespace 下并已启用服务
访问目标站返回 403 检查 User-Agent 是否合理,代理是否被封
无法扩容 检查是否部署 HPA controller,Pod 是否配置资源限制
数据采集为空 检查 HTML 结构是否有变,必要时更新解析逻辑

六、总结提升

本教程构建了一个完整的容器化 + 队列化 + 可扩缩容的爬虫系统。通过 RabbitMQ 实现任务调度,通过爬虫代理与随机 User-Agent 防止限制,通过 Kubernetes 实现容器水平扩展,适合构建大规模网页采集系统的原型架构。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
4月前
|
数据采集 弹性计算 Kubernetes
单机扛不住,我把爬虫搬上了 Kubernetes:弹性伸缩与成本优化的实战
本文讲述了作者在大规模爬虫项目中遇到的挑战,包括任务堆积、高失败率和成本失控。通过将爬虫项目迁移到Kubernetes并使用HPA自动伸缩、代理池隔离和Redis队列,作者成功解决了这些问题,提高了性能,降低了成本,并实现了系统的弹性伸缩。最终,作者通过这次改造学到了性能、代理隔离和成本控制的重要性。
168 2
单机扛不住,我把爬虫搬上了 Kubernetes:弹性伸缩与成本优化的实战
|
3月前
|
数据采集 Web App开发 数据安全/隐私保护
实战:Python爬虫如何模拟登录与维持会话状态
实战:Python爬虫如何模拟登录与维持会话状态
|
5月前
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
5月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
496 0
|
3月前
|
数据采集 运维 监控
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
本文系统解析爬虫与自动化核心技术,涵盖HTTP请求、数据解析、分布式架构及反爬策略,结合Scrapy、Selenium等框架实战,助力构建高效、稳定、合规的数据采集系统。
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
|
3月前
|
数据采集 监控 数据库
Python异步编程实战:爬虫案例
🌟 蒋星熠Jaxonic,代码为舟的星际旅人。从回调地狱到async/await协程天堂,亲历Python异步编程演进。分享高性能爬虫、数据库异步操作、限流监控等实战经验,助你驾驭并发,在二进制星河中谱写极客诗篇。
Python异步编程实战:爬虫案例
|
3月前
|
数据采集 人工智能 JSON
Prompt 工程实战:如何让 AI 生成高质量的 aiohttp 异步爬虫代码
Prompt 工程实战:如何让 AI 生成高质量的 aiohttp 异步爬虫代码
|
4月前
|
数据采集 存储 XML
Python爬虫技术:从基础到实战的完整教程
最后强调: 父母法律法规限制下进行网络抓取活动; 不得侵犯他人版权隐私利益; 同时也要注意个人安全防止泄露敏感信息.
842 19
|
3月前
|
数据采集 机器学习/深度学习 人工智能
反爬虫机制深度解析:从基础防御到高级对抗的完整技术实战
本文系统阐述了反爬虫技术的演进与实践,涵盖基础IP限制、User-Agent检测,到验证码、行为分析及AI智能识别等多层防御体系,结合代码实例与架构图,全面解析爬虫攻防博弈,并展望智能化、合规化的发展趋势。
1194 0
反爬虫机制深度解析:从基础防御到高级对抗的完整技术实战
|
5月前
|
数据采集 存储 NoSQL
Scrapy 框架实战:构建高效的快看漫画分布式爬虫
Scrapy 框架实战:构建高效的快看漫画分布式爬虫