第52讲:Scrapy 对接 Kubernetes 并实现定时爬取

本文介绍了如何将Scrapy爬虫项目部署到Kubernetes集群,包括Kubernetes的基础知识、准备步骤以及使用Deployment和CronJob进行镜像部署和定时任务设置,帮助读者理解如何在云端高效管理爬虫任务。
摘要由CSDN通过智能技术生成

在上一节我们了解了如何制作一个 Scrapy 的 Docker 镜像,本节课我们来介绍下如何将镜像部署到 Kubernetes 上。

1.Kubernetes

Kubernetes 是谷歌开发的,用于自动部署,扩展和管理容器化应用程序的开源系统,其稳定性高、扩展性好,功能十分强大。现在业界已经越来越多地采用 Kubernetes 来部署和管理各个项目,

如果你还不了解 Kubernetes,可以参考其官方文档来学习一下: https://kubernetes.io/

2.准备工作

如果我们需要将上一节的镜像部署到 Kubernetes 上,则首先需要我们有一个 Kubernetes 集群,同时需要能使用 kubectl 命令。

Kubernetes 集群可以自行配置,也可以使用各种云服务提供的集群,如阿里云、腾讯云、Azure 等,另外还可以使用 Minikube 等来快速搭建,当然也可以使用 Docker 本身提供的 Kubernetes 服务。

比如我这里就直接使用了 Docker Desktop 提供的 Kubernetes 服务,勾选 Enable 直接开启即可。
在这里插入图片描述
kubectl 是用来操作 Kubernetes 的命令行工具,可以参考 https://kubernetes.io/zh/docs/tasks/tools/install-kubectl/ 来安装。

如果以上都安装好了,可以运行下 kubectl 命令验证下能否正常获取节点信息:

kubectl get nodes 

运行结果类似如下:

NAME             STATUS   ROLES    AGE   VERSION 
docker-desktop   Ready    master   75d   v1.16.6-beta.0 

3.部署

要部署的话我们需要先创建一个命名空间 Namespace,这里直接使用 kubectl 命令创建即可,Namespace 的名称这里我们取名为 crawler。

创建命令如下:

kubectl create namespace crawler 

运行结果如下:

namespace/crawler created 

如果出现上述结果就说明命名空间创建成功了。接下来我们就需要把 Docker 镜像部署到这个 Namespace 下面了。
Kubernetes 里面的资源是用 yaml 文件来定义的,如果要部署一次性任务或者为我们提供服务可以使用 Deployment,更多详情可以参考 Kubernetes 对于 Deployment 的说明: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

新建 deployment.yaml 文件如下:

apiVersion: apps/v1 
kind: Deployment 
metadata: 
  name: crawler-quotes 
  namespace: crawler 
  labels: 
    app: crawler-quotes 
spec: 
  replicas: 1 
  selector: 
    matchLabels: 
      app: crawler-quotes 
  template: 
    metadata: 
      labels: 
        app: crawler-quotes 
    spec: 
      containers: 
        - name: crawler-quotes 
          image: germey/quotes 
          env: 
            - name: MONGO_URI 
              value: <mongo> 

这里我们就可以按照 Deployment 的规范声明一个 yaml 文件了,指定 namespace 为 crawler,并指定 container 的 image 为我们已经 Push 到 Docker Hub 的镜像 germey/quotes,另外通过 env 指定了环境变量,注意这里需要将 替换成一个有效的 MongoDB 连接字符串,如一个远程 MongoDB 服务。

接下来我们只需要使用 kubectl 命令即可应用该部署:

kubectl apply -f deployment.yaml 

运行完毕之后会提示类似如下结果:

deployment.apps/crawler-quotes created 

这样就说明部署成功了。如果 MongoDB 服务能够正常连接的话,这个爬虫就会运行并将结果存储到 MongoDB 中。

另外我们还可以通过命令行或者 Kubernetes 的 Dashboard 查看部署任务的运行状态。

如果我们想爬虫定时运行的话,可以借助于 Kubernetes 提供的 cronjob 来将爬虫配置为定时任务,其运行模式就类似于 crontab 命令一样,详细用法可以参考: https://kubernetes.io/zh/docs/tasks/job/automated-tasks-with-cron-jobs/

可以新建 cronjob.yaml,内容如下:

apiVersion: batch/v1beta1 
kind: CronJob 
metadata: 
  name: crawler-quotes 
  namespace: crawler 
spec: 
  schedule: "0 */1 * * *" 
  jobTemplate: 
    spec: 
      template: 
        spec: 
          restartPolicy: OnFailure 
          containers: 
            - name: crawler-quotes 
              image: germey/quotes 
              env: 
                - name: MONGO_URI 
                  value: <mongo>

注意到这里 kind 我们不再使用 Deployment,而是改成了 CronJob,代表定时任务。 spec.schedule 里面定义了 crontab 格式的定时任务配置,这里代表每小时运行一次。其他的配置基本一致,同样注意这里需要将 替换成一个有效的 MongoDB 连接字符串,如一个远程 MongoDB 服务。
接下来我们只需要使用 kubectl 命令即可应用该部署:

kubectl apply -f cronjob.yaml 

运行完毕之后会提示类似如下结果:

cronjob.batch/crawler-quotes created 

出现这样的结果这就说明部署成功了,这样这个爬虫就会每小时运行一次,并将数据存储到指定的 MongoDB 数据库中。

4.总结

以上我们就简单介绍了下 Kubernetes 部署爬虫的基本操作,Kubernetes 非常复杂,需要学习的内容很多,我们这一节介绍的只是冰山一角,还有更多的内容等待你去探索。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
你可以使用定时任务实现定时爬取数据的功能。在Scrapy中,你可以使用类似于APScheduler或者Celery这样的库来实现定时任务的调度。 首先,你需要安装相应的库。对于APScheduler,你可以使用以下命令进行安装: ``` pip install apscheduler ``` 对于Celery,你可以使用以下命令进行安装: ``` pip install celery ``` 接下来,你需要创建一个定时任务的函数。这个函数将会被定时调用,用于触发爬虫的执行。在这个函数中,你需要使用Scrapy提供的命令行接口来启动爬虫。例如,你可以使用以下的代码来启动爬虫: ```python from scrapy.cmdline import execute def run_spider(): execute(["scrapy", "crawl", "your_spider_name"]) ``` 然后,你需要创建一个定时任务的调度器,并设置相应的定时规则。下面是一个使用APScheduler的例子: ```python from apscheduler.schedulers.blocking import BlockingScheduler scheduler = BlockingScheduler() # 每天执行一次定时任务 scheduler.add_job(run_spider, 'interval', days=1) # 开始调度任务 scheduler.start() ``` 对于Celery,你可以使用以下代码来创建定时任务: ```python from celery import Celery from datetime import timedelta app = Celery('your_app_name') app.conf.beat_schedule = { 'run_spider_task': { 'task': 'your_task_module.run_spider', 'schedule': timedelta(days=1), }, } app.conf.timezone = 'UTC' ``` 最后,你需要启动定时任务的调度器。对于APScheduler,你可以使用以下代码: ```python scheduler.start() ``` 对于Celery,你可以使用以下命令来启动调度器: ``` celery -A your_app_name beat ``` 这样,你就实现定时爬取数据的功能。定时任务将会按照你设置的时间规则自动触发爬虫的执行。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值