Scrapy定时爬虫总结&Docker/K8s部署

初识Scrapy

Scrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。

https://docs.scrapy.org/en/latest/


scrapy框架结构及工作原理


Scrapy定时爬虫总结&Docker/K8s部署_第1张图片
scrapy框架

对于用户来说,Spider 是最核心的组件,scrapy爬虫开发是围绕Spider 展开的。



Scrapy定时爬虫总结&Docker/K8s部署_第2张图片
图1 Scrapy框架的组成结构

1.当SPIDER要爬取某URL地址的页面时,需使用该URL构造一个Request对象,提交给ENGINE(图1中的①)。

2.Request对象随后进入SCHEDULER按某种算法进行排队,之后的某个时SCHEDULER将其出队,送往DOWNLOADER(图1中的②③④)

3.DOWNLOADER根据Request对象中的URL地址发送一次HTTP请求到网站服务器,之后用服务器返回的HTTP响应构造出一个Response对象,其中包含页面的HTML文本(图1中的⑤)

4.Response对象最终会被递送给SPIDER的页面解析函数(构造Request对象时指定)进行处理,页面解析函数从页面中提取数据,封装成Item后提交给ENGINE,Item之后被送往ITEMPIPELINES进行处理,最终可能由EXPORTER(图1中没有显示)以某种数据格式写入文件(csv,json);另一方面,页面解析函数还从页面中提取链接(URL),构造出新的Request对象提交给ENGINE(图1中的⑥⑦⑧)。

理解了框架中的数据流,也就理解了Scrapy爬虫的工作原理。如果把框架中的组件比作人体的各个器官,Request和Response对象便是血液,Item则是代谢产物


这里具体编写scrapy,暂时不多介绍。下面介绍关于定时的内容

定时调度器:schedule

笔者这里选择一个轻量级的定时任务调度的库:schedule。他可以完成每分钟,每小时,每天,周几,特定日期的定时任务

schedule.every(10).minutes.do(job)#每10分钟启动一次任务

schedule.every().hour.do(job)#每隔1小时启动一次任务

schedule.every().day.at("10:30").do(job)#每天10:30执行任务

代码如下:每天00:00执行scrapy crawl  spider_name

# -*- coding: utf-8 -*-

import schedule

import subprocess

import logging

LOG = logging.getLogger()

from projectname.settings import ON_TIME

def job():

      LOG.info('Start to scrapy crawlspider_name.. ')

      subprocess.Popen('scrapy crawl spider_name',shell=True,cwd='/demo')

      LOG.info('Finished to scrapy。')

if __name__=='__main__':

      LOG.info('start to scrapy。')

      schedule.every().day.at("00:00").do(job)#每天00:00

      while True:

               schedule.run_pending()

Docker/k8s集群部署

这是可以选择两种部署方式,各有优点。docker容器意味着环境隔离和可重复性。通俗点,就是指开发人员只要为应用创建一次运行环境,然后打包成容器便可在其他机器上运行。容器消除了开发,测试,生产环境的不一致性。k8s即是容器调度编排产品。https://docs.docker.com/

一、创建镜像

1、拉取基础镜像

docker pull python:3.7.0

docker images 查看镜像

2、创建dockerfile。Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像

FROM  python:3.7.0  #指定基础镜像

RUN  pip install /wheels/schedule-0.6.0-py2.py3-none-any.whl &&

          pip install /wheels/Scrapy-1.6.0-py2.py3-none-any.whl   #运行命令,即pip安装依赖包

COPY  spider_name / spider_name / #复制

EXPOSE 8000  # 指定于外界交互的端口

CMD ["/usr/local/bin/python","/ spider_name /sche_work.py"] #  在容器启动时才进行调用。

3、根据dockerfile 构建镜像,在dockerfile路径下运行,也可以在其他路径使用-f 

docker build -t  xxscrapy:v1.0 .

docker images 

docker inspect images_id

4.根据镜像,创建容器

docker run -it -d --name xxscrapy -v /root/scrapy/ spider_name /:/ spider_name /   -p 2888:8000   xxscrapy:v1.0

-d   ---------      指定容器运行于前台还是后台,默认为false

-v   ---------      给容器挂载存储卷,挂载到容器的某个目录

-p   ---------      指定容器暴露的端口

-env ---------      设置环境变量

-n --------------  容器名称

xxscrapy:v1.0   即我们之前构建的镜像

5.查看状态

docker ps  查看正常的容器

docker ps -a 查看其他容器

docker inspect container_id  查看该容器的配置文件 

docker ps


欢迎各位大神交流,交流QQ群:688933850

你可能感兴趣的:(Scrapy定时爬虫总结&Docker/K8s部署)