上次我讲解了Python程序开发所依赖的Win10开发环境搭建,开发环境准备好后我们提交了程序框架代码,按照开发习惯,我们需要优先把整个开发流程走通,这也是敏捷开发的思路,快速迭代开发,通过快速试错来降低开发的成本,提高开发效率。(收一收,理解下,最近写论文对敏捷管理研究得有点多~)
本文介绍第三节“Python爬虫应用运行(Docker)镜像准备”,详细讲解编写好的python代码提交到代码库之后,如何在运行环境打包构建、部署运行,建议收藏有空参照试试。
再来回顾一下本主题“Python抓取上市公司财务数据”的内容体系,分成9节来为大家讲解,从0到1来详细拆解程序开发流程和编码实现,这套体系内容适合给Python零基础的小白学者学习,同时也对熟悉python但对数据采集不熟练的量化专家提供一套Python抓取的最佳实践。其包含的主要章节如下:
1. Centos7搭建代码库和Python运行环境
2. Win10搭建Python开发环境
3. Python爬虫应用运行(Docker)镜像准备
4. 编码实现上市公司列表抓取
5. 编码实现上市公司简介和行业板块抓取
6. 编码实现上市公司企业财务摘要抓取
7. 编码实现上市公司历年财务数据抓取
8. 编码实现上市公司财务数据抓取结果入库(Mysql)
9. Python代码提交及部署运行
本文讲解的是其中的第3章节,希望让开发者能做到自行实现开发流程中的代码构建和部署(升级)运行,非常适合零python代码基础的初学者以及对python有兴趣的个人开发者。本节讲解的内容主要包括:
1)编写运行环境的Dockerfile;
2)打包构建docker镜像;
3)编写启动程序的shell脚本;
4)提交脚本代码到代码库。
一、编写运行环境的Dockerfile
第一步:创建Dockerfile
切换到centos7系统的scrapy-finance文件夹并拉取最新代码,之前通过git克隆了python抓取程序的代码到该目录,命令如下:
cd /root/opdir/scrapy-finance git pull |
可见之前在windows编写的代码被拉取到了该文件夹下,如下:
创建文本文件Dockerfile
touch Dockerfile |
第二步:编写构建镜像的Dockerfile指令
通过vi Dockerfile来编辑内容,编写如下:
FROM python:3.8 #MAINTAINER ysedu-python RUN pip install scrapy==2.6.1 && pip install pymysql==1.0.2 ENV APP_HOME=/usr/local/scrapy_finance WORKDIR $APP_HOME COPY main.py scrapy_list.py scrapy_detail.py save_to_db.py $APP_HOME/ ENTRYPOINT ["python", "main.py"] |
以上编写的指令解释如下:
1. FROM python:3.8代表我们以官方仓库中的python镜像(版本3.8)为基础来构建我们的镜像;
2. MAINTAINER指令为备注维护人员,一般可填写作者的名称或邮箱等标识,这里我加了一个前缀#,代表注释,构建时不执行该指令;
3. RUN指令为在上层镜像中执行命令,上述指令是通过pip命令安装python依赖包到镜像中;
4. ENV指令为设置环境变量,我们设置python抓取应用的安装运行目录为/usr/local/scrapy_finance;
5. WORKDIR指令是用来指定后续的工作目录,后续的指令都将在这个工作目录中执行;
6. COPY命令为拷贝本地文件到镜像中,如果要一次性拷贝多个文件,则必须指定带/后缀的文件夹路径。另外还有一个ADD命令也可以实现拷贝,这个命令可以将压缩文件或url远程文件拷贝到镜像并自动解压;
7. ENTRYPOINT指令是指定镜像以容器运行时执行的命令,它不可以被命令行参数替换,如果需要在启动时能被替换,则需要使用CMD指令来替代。
二、打包构建docker镜像
第一步:运行docker打包命令
在Dockerfile所在目录执行打包命令,我们定义镜像名称为scrap-finance-app,本次打包的镜像版本号为v0.1,通过vi创建编辑build_image.sh脚本文件,编写脚本内容如下:
#!/bin/bash docker build -t"scrap-finance-app:v0.1" . |
其中,#!/bin/bash代表该脚本使用/bin/bash来解释执行,docker build为构建镜像的命令,通过-t参数来指定构建结果镜像的名称,版本号通过冒号拼接。最后,我们需要注意下docker build命令最后有个参数点,代表以当前目录为构建目录。
docker build命令可以直接执行,也可以通过sh build_images.sh的方式来执行,效果相同。执行后会需要等待几分钟来下载相关基础镜像和依赖包,如下:
执行完之后,我们就得到了运行python爬虫程序的docker镜像,如下图:
第二步:查看打包镜像信息
我们可以通过docker images命令查看镜像列表,镜像列表显示了镜像的大小和镜像ID等信息,如下:
同时我们也可以使用docker inspect scrap-finance-app:v0.1命令查看镜像的更详细信息,如下:
我们发现镜像详情中包含了比dockerfile中的指令还要丰富的信息,那是因为基础镜像python里面定义了相关指令,在构建后继承给了当前构建的镜像。
至此,通过Dockerfile来打包构建镜像就完成了。
三、编写启动程序的shell脚本
第一步:编写run_app.sh脚本
使用vi run_app.sh命令来创建并编辑启动程序的shell脚本,内容如下:
#!/bin/bash DATA_DIR=/root/opdir/finance_data APP_HOME=/usr/local/scrapy_finance param=$1 docker run --name=scrap-finance-app \ -v $DATA_DIR/list_data:$APP_HOME/list_data \ -v $DATA_DIR/detail_data:$APP_HOME/detail_data \ -d scrap-finance-app:v0.1 $param |
其中:
1. DATA_DIR和APP_HOME为脚本内变量,分别代表数据在本地的存储目录、应用在容器内运行目录;
2. param为脚本变量,赋值为$1,其代表脚本执行的第一个参数,无参数时则为空;
3. docker run则为docker启动容器的命令,需要通过:
a) --name来指定容器名称(如果不指定则随机命名);
b) -v来指定宿主机映射到容器内路径,用冒号拼接映射关系,最后也可以拼接读写权限,比如-v /data:/data:ro代表/data目录映射到容器后,容器有只读权限(ro代表只读,rw代表读写);
c) -d代表后台运行,不加该参数则直接当前命令行运行,等待运行结束后才能继续执行其他命令;
d) 最后指明要运行的镜像,以及相关运行参数(根据程序需要来传递,可传多个)。
第二步:以docker容器来运行程序
直接执行脚本,使用如下命令:
sh run_app.sh |
运行成功后会返回容器的ID,如下:
可以通过docker ps -a命令来查看容器运行状态,如下:
可知程序已经运行结束了,并返回0(代表python程序正常结束)。再使用docker logs命令查看运行打印的日志,如下:
通过日志我们进一步确认程序正常执行完毕了。
第三步:设置命令行参数来运行容器
在再次启动新容器来运行程序之前,需要先删除同名的容器,否则会报错误,如下:
通过docker rm命令删除已经运行结束的容器,再增加参数来运行python程序,命令如下:
docker rm scrap-finance-app sh run_app.sh --scrap-list |
运行结果和在开发环境IDE中运行的输出结果一致,如下:
至此,启动程序的shell脚本编写完毕。
四、提交脚本代码到代码库
第一步:git添加文件
在之前克隆的代码项目根目录/root/opdir/scrapy-finance,执行如下命令:
git add . |
注意后面一个点,代表添加当前目录下有改动的文件。
第二步:提交文件变动到本地代码库
提交变动到本地代码库时,依赖前面git add的文件范围,另外还需要填写备注信息,如下:
git commit -m "add dockerfile, package and run shell script" |
执行后,会告诉你本次提交变动的代码差异,如下:
第三步:推送本地提交到远程代码库
通过git push命令来推送代码到远程代码库的master分支,如下:
至此,我们完成了运行镜像所需的dockerfile和相关脚本的开发。
五、结语
本文讲解了Python抓取的第三步运行docker镜像准备,如果我们不想用docker,直接在开发环境的windows上跑,那这一节可以选择跳过。只是在容器技术流行的时代,我们作为一个小白用户,也简单快速地了解下docker其实是有必要的。另外,如果你只有windows电脑,可以使用虚拟机来创建centos环境,或者直接在windows上安装docker也可以,步骤类似,只是命令稍有不同,这里就不赘述,有疑问可在评论里聊聊。
实现了python程序的构建和部署运行,我们就能将提交到代码库的代码在服务器上快速运行起来了,至此我们将一套简易的开发流程给搭建完了,咋一看还有些DevOps和CI/CD式呢,再加上k8s来做容器编排,妥妥的生产环境级别流程啦!下一节将会步入正题讲解python抓取代码的编写啦,赶紧关注起来吧~
版权声明:内容来源于互联网和用户投稿 如有侵权请联系删除