Scrapy定时爬虫总结&Docker/K8s部署
初识Scrapy
Scrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
https://docs.scrapy.org/en/latest/
scrapy框架结构及工作原理
文章图片
scrapy框架 对于用户来说,Spider 是最核心的组件,scrapy爬虫开发是围绕Spider 展开的。
文章图片
图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分钟启动一次任务代码如下:每天00:00执行scrapy crawlspider_name
schedule.every().hour.do(job)#每隔1小时启动一次任务
schedule.every().day.at("10:30").do(job)#每天10:30执行任务
# -*- coding: utf-8 -*-Docker/k8s集群部署 这是可以选择两种部署方式,各有优点。docker容器意味着环境隔离和可重复性。通俗点,就是指开发人员只要为应用创建一次运行环境,然后打包成容器便可在其他机器上运行。容器消除了开发,测试,生产环境的不一致性。k8s即是容器调度编排产品。https://docs.docker.com/
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()
一、创建镜像
1、拉取基础镜像
docker pull python:3.7.02、创建dockerfile。Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像
docker images 查看镜像
FROMpython:3.7.0#指定基础镜像3、根据dockerfile 构建镜像,在dockerfile路径下运行,也可以在其他路径使用-f
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"] #在容器启动时才进行调用。
docker build -txxscrapy:v1.0 .4.根据镜像,创建容器
docker images
docker inspect images_id
docker run -it -d --name xxscrapy -v /root/scrapy/ spider_name /:/ spider_name /-p 2888:8000xxscrapy:v1.0
-d---------指定容器运行于前台还是后台,默认为false5.查看状态
-v---------给容器挂载存储卷,挂载到容器的某个目录
-p---------指定容器暴露的端口
-env ---------设置环境变量
-n --------------容器名称
xxscrapy:v1.0即我们之前构建的镜像
docker ps查看正常的容器
docker ps -a 查看其他容器
docker inspect container_id查看该容器的配置文件
文章图片
docker ps
【Scrapy定时爬虫总结&Docker/K8s部署】欢迎各位大神交流,交流QQ群:688933850
推荐阅读
- Python爬虫|Python爬虫 --- 1.4 正则表达式(re库)
- 爬虫数据处理HTML转义字符
- 2018-12-05爬虫
- linux定时任务contab
- 芯灵思SinlinxA33开发板Linux内核定时器编程
- Python爬虫技术要学到什么程度才可以找到工作()
- STM32F4|STM32F4 TIM6 TIM7 基本定时器
- python|python 爬虫抓取图片
- 爬虫|若想拿下爬虫大单,怎能不会逆向爬虫,价值过万的逆向爬虫教程限时分享
- 分布式|《Python3网络爬虫开发实战(第二版)》内容介绍