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

初识Scrapy Scrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
https://docs.scrapy.org/en/latest/
scrapy框架结构及工作原理

Scrapy定时爬虫总结&Docker/K8s部署
文章图片
scrapy框架 对于用户来说,Spider 是最核心的组件,scrapy爬虫开发是围绕Spider 展开的。


Scrapy定时爬虫总结&Docker/K8s部署
文章图片
图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 crawlspider_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中的指令自动生成映像
FROMpython:3.7.0#指定基础镜像
RUNpip install /wheels/schedule-0.6.0-py2.py3-none-any.whl &&
pip install /wheels/Scrapy-1.6.0-py2.py3-none-any.whl#运行命令,即pip安装依赖包
COPYspider_name / spider_name / #复制
EXPOSE 8000# 指定于外界交互的端口
CMD ["/usr/local/bin/python","/ spider_name /sche_work.py"] #在容器启动时才进行调用。
3、根据dockerfile 构建镜像,在dockerfile路径下运行,也可以在其他路径使用-f
docker build -txxscrapy:v1.0 .
docker images
docker inspect images_id
4.根据镜像,创建容器
docker run -it -d --name xxscrapy -v /root/scrapy/ spider_name /:/ spider_name /-p 2888:8000xxscrapy:v1.0
-d---------指定容器运行于前台还是后台,默认为false
-v---------给容器挂载存储卷,挂载到容器的某个目录
-p---------指定容器暴露的端口
-env ---------设置环境变量
-n --------------容器名称
xxscrapy:v1.0即我们之前构建的镜像
5.查看状态
docker ps查看正常的容器
docker ps -a 查看其他容器
docker inspect container_id查看该容器的配置文件
Scrapy定时爬虫总结&Docker/K8s部署
文章图片
docker ps

【Scrapy定时爬虫总结&Docker/K8s部署】欢迎各位大神交流,交流QQ群:688933850

    推荐阅读