Python爬虫项目
目录
安装虚拟环境
# linux 安装
pip3 install virtualenv
# windows10
# virtualenvwrapper-win
pip install virtualenv
# 创建虚拟环境
mkvirtualenv <虚拟环境名称>
使用Pycharm 进行 依赖管理
# 获取requirements.txt 配置文件
pip freeze>requirements.txt
# 根据 requirements.txt 安装依赖
pip install -r requirements.txt
项目部署(方法一)
这是一种复杂的构建方案,目的是为了学习Dockerfile的使用 (不推荐使用方法部署)
—1)手动构建一个python 可用的执行容器
—2)线上部署不推荐
—3)可以使用官方镜像 直接发布,避免容器 映射 copy 的麻烦
1) 首先安装docker:
# 用 yum 安装并启动
yum install docker -y && systemctl start docker
2) 下载自定义镜像需要用到的基础镜像:
# 这里以centos7为例
docker pull centos:centos7
3) 基础镜像已经准备好了,接下来准备好需要部署的环境服务,以及python项目:
# 安装下载工具
yum install wget
### 创建 dockerfile 文件
mkdir dockerfile && cd dockerfile
### 下载 python(这里以3.7为例)
wget https://www.python.org/ftp/python/3.7.9/Python-3.7.9.tgz
### 下载 openssl (非必要操作)
### wget http://www.openssl.org/source/openssl-1.1.1.tar.gz
### 将 python 项目<复制/上传>到此目录
### cp ~/test.py .
### 以及 python 项目的依赖库
### cp ~/requirements.txt .
- 需要自定义docker镜像的大致内容准备好了,接下来编写dockerfile:
### 使用执行容器
FROM centos:centos7
### 设置镜像创建者名称
MAINTAINER Amewin
### 下载编译需要用到的软件 python
RUN yum install -y gcc gcc-c++ autoconf automake libtool make zlib* libffi-devel
### 下载编译需要用到的软件 openssl
RUN yum install -y zlib zlib-dev openssl-devel sqlite-devel bzip2-devel libffi libffi-devel gcc gcc-c++
### 安装openssl
ADD openssl-1.1.1.tar.gz /usr/local/src
### 示例:将得到如下文件夹 /usr/local/src/openssl-1.1.1
# 等价如下命令
#COPY openssl-1.1.1.tar.gz /usr/local/src
#WORKDIR /usr/local/src
#RUN tar -zxvf openssl-1.1.1.tar.gz
### ADD 和 COPY 两个命令类似 都可以拷贝 文件或文件夹
### (只要不是压缩包 ADD COPY 没有本质区别,官方建议使用:COPY)
### ADD 解压到指定文件夹<文件夹不存在会自动创建> 注意:源压缩文件不会复制进images
### 设置切换目录
WORKDIR /usr/local/src/openssl-1.1.1
### 设置ssl环境变量
RUN ./config --prefix=$HOME/openssl shared zlib && make && make install
### RUN 执行指定命令 多条指令可以 && 连接
RUN source $HOME/.bash_profile
### 安装openssl end
### 将dockerfile目录下的python-3.7.3.tgz复制到docker容器内
COPY Python-3.7.9.tgz /usr/local/src
WORKDIR /usr/local/src
RUN tar -xf Python-3.7.9.tgz
### 类似于如下命令 但 /usr/local/src/Python-3.7.9.tgz 不存在
### ADD Python-3.7.9.tgz /usr/local/src
WORKDIR /usr/local/src/Python-3.7.9
### --with-openssl=$HOME/openssl (非必要参数)
RUN ./configure --prefix=/usr/local/python37 --with-openssl=$HOME/openssl && make && make install
### 设置环境变量
ENV PATH /usr/local/python37/bin:$PATH
### 将python项目复制到 /spider工作目录下
COPY ./proxy /spider
### 设置 /spider 为工作目录
WORKDIR /spider
### 下载 python 项目的依赖库
RUN pip3 install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com -r requirements.txt
### 在创建个爬取的数据存放的目录,这个需要根据自己代码里面设置的目录来创建,例如:
### VOLUME /data
### 更改openssl 避免 No module named _ssl
### 必须安装编译后,在执行,该命令不然那报错
RUN echo '_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto' \
>> /usr/local/src/Python-3.7.9/Modules/Setup
### WORKDIR 切换目录
WORKDIR /usr/local/src/Python-3.7.9
### 进行安装
RUN make && make install
### 修改 docker exec -it <id/imagesName> bash 进入默认路径
WORKDIR /spider
### 最后一步,运行docker镜像时运行自己的python项目
### 可以多个参数: CMD ["python3","a","main.py"]
CMD ["python3","main.py"]
### CMD 该方法是可被 /bin/bash -c "nohup ping -i 1000 www.baidu.com" 覆盖
### docker run -d centos /bin/bash -c "nohup ping -i 1000 www.baidu.com"
### ENTRYPOINT ["python3","main.py"]
### ENTRYPOINT CMD 类似 但ENTRYPOINT 不允许 更改run 参数
更改COMMAND 启动参数
[root@A python2]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cd0bc9ff8cf3 python1:v1 "python3 main.py" 4 hours ago Up 4 hours proxy1
be8263c3b5b3 python1:v1 "/bin/bash -c 'nohup…" 4 hours ago Up 4 hours proxy2
项目部署(方法二)
1)配置部署环境
# 获取python images 环境 根据实际需求选择
docker pull python:3.9
#docker pull python:3.8
#docker pull python:3.7
# 创建目录
mkdir -p /mydata/python-spider
cd /mydata/python-spider
touch Dockerfile
# 将运行项目copy到proxy内
mkdir proxy
vi Dockerfile
[root@Amewin python-spider]# ls
Dockerfile proxy
[root@A test]# vi Dockerfile
2)编写Dockerfile
# 使用python3.9镜像创建
FROM python:3.9
# 作者名称
MAINTAINER Amewin
# 将spider 拷贝到容器内/data
# COPY (宿主机目录/文件) (容器目录)
COPY ./proxy /spider
# 切换工作目录
WORKDIR /spider
# 执行shell 下载相关依赖
RUN pip3 install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com -r requirements.txt
# 容器启动 run 启动参数
CMD ["python3","main.py"]
3)执行Dockerfile
### docker build -t 镜像名:版本号 镜像名:版本号 均为自定义 别忘了末尾的点“.”
docker build -t pythonspider:v1 .
### 通过 docker images命令就可以看到刚刚创建的镜像
docker images
### 运行
docker run -d --name spider pythonspider:v1
### -d为后台运行,--name 后面设置容器名,-v 是目录共享,主机目录和docker容器内目录共享。创建dockerfile的时候,有这一句 VOLUME /data 就是作为共享目录使用的,“:”前的目录为主机目录,后面的目录为容器内目录。。。 最后一个参数 pythonspider:v1 镜像名
Docker run 常用参数大全
–add-host list | 添加自定义主机到ip映射(书写格式为:主机:ip) |
---|---|
-a, --attach list | 附加到STDIN、STDOUT或STDERR上 |
–blkio-weight uint16 | Block IO (相对权重),取值10到1000之间,0为禁用(默认0) |
–blkio-weight-device list | Block IO weight (相对于设备的权重) (默认为数组的形式) |
–cap-add list | 添加Linux功能 |
–cap-drop list | 删除Linux功能 |
–cgroup-parent string | 容器的可选父级对照组项 |
–cidfile string | 将容器ID写入文件 |
–cpu-period int | 限制CPU CFS(完全公平调度程序)周期 |
–cpu-quota int | 限制CPU CFS(完全公平的调度程序)上限 |
–cpu-rt-period int | 限制CPU运行时周期(以微秒为单位) |
–cpu-rt-runtime int | 限制CPU实时运行时间(以微秒为单位) |
-c, --cpu-shares int | CPU 共享 (相对权重的设定) |
–cpus decimal | 设定cpu的数量 |
–cpuset-cpus string | 允许执行的cpu (0-3,0,1) |
–cpuset-mems string | 允许执行的MEMs (0-3,0,1) |
-d, --detach | 在后台运行容器并打印容器ID |
–detach-keys string | 覆盖分离容器的键序列 |
–device list | 向容器添加主机设备 |
–device-cgroup-rule list | 向 cgroup 允许的设备列表中添加一个或多个规则 |
–device-read-bps list | 限定设备的读取速率(单位: byte/s)(默认为 []) |
–device-read-iops list | 限定设备的读取速率(单位:IO/s)(默认为 []) |
–device-write-bps list | 限定设备的写入速率(单位: byte/s)(默认为 []) |
–device-write-iops list | 限定设备的写入速率(单位:IO/s)(默认为 []) |
–disable-content-trust | 跳过镜像验证(默认为 true) |
–dns list | 设置自定义DNS服务器 |
–dns-option list | 设置DNS选项 |
–dns-search list | 设置自定义的DNS搜索域 |
–entrypoint string | 覆盖镜像的默认入口点 |
-e, --env list | 设置环境变量 |
–env-file list | 读取环境变量内容 |
–expose list | 公开一个端口或多个端口 |
–group-add list | 添加其他要加入的组 |
–health-cmd string | 命令运行以检查健康 |
–health-interval duration | 运行检查之间的时间(ms|s|m|h)(默认为 0s) |
–health-retries int | 连续的失败需要报告不健康 |
–health-start-period duration | 启动健康重试倒计时前容器初始化的启动周期(ms|s|m|h)(默认为 0s) |
–health-timeout duration | 健康检查运行情况的最大时间值 格式为:(ms|s|m|h) (默认 0s) |
–help | 打印出使用情况 |
-h, --hostname string | 定义容器主机名 |
–init | 在容器中运行初始化,以转发信号并获取进程 |
-i, --interactive | 即使没有连接,也保持STDIN开放 |
–ip string | 设定容器的 IPv4 地址 (例如,192.168.155.139) |
–ip6 string | 设定IPv6地址(例如,2001:db8::33) |
–ipc string | 使用IPC模式 |
–isolation string | 容器隔离技术 |
–kernel-memory bytes | 内核内存限制 |
-l, --label list | 在容器上设置元数据 |
–label-file list | 在以行分隔的标签文件中读取 |
–link list | 向另一个容器添加链接 |
–link-local-ip list | 容器 IPv4/IPv6 链接本地地址 |
–log-driver string | 设定容器的日志驱动 |
–log-opt list | 设定日志驱动器选项 |
–mac-address string | 配置容器MAC地址(例如,92:d0:c6:0a:29:33) |
-m, --memory bytes | 设定内存限额 |
–memory-reservation bytes | 内存软限制 |
–memory-swap bytes | 交换限制等于内存加上交换:’-1’,以启用无限交换 |
–memory-swappiness int | 优化容器内存交换 (0 到 100) (默认为 -1) |
–mount mount | 将文件系统挂载附加到容器 |
–name string | 为容器指定一个名称 |
–network string | 将容器连接到网络 |
–network-alias list | 为容器连接的网络添加别名 |
–no-healthcheck | 禁止任何容器指定 HEALTHCHECK |
–oom-kill-disable | 禁止OOM事件被杀死 |
–oom-score-adj int | 优化主机的OOM事件 ,参数范围 (-1000 到 1000) |
–pid string | 设定PID命名 |
–pids-limit int | 优化容器pid限制(如果设置-1则为无限制) |
–privileged | 赋予容器扩展的权限 |
-p, --publish list | 将容器的端口发布到主机 |
-P, --publish-all | 将所有公开的端口发布到随机端口 |
–read-only | 将容器的根文件系统挂载为只读(后面会详细讲到) |
–restart string | 配置容器的重启策略,当容器退出时重新启动(默认为“no”) |
–rm | 当容器退出时自动移除这个容器 |
–runtime string | 使用容器的运行时 |
–security-opt list | 指定docker启动的安全项 |
–shm-size bytes | /dev/shm 的大小(这个可以使其容量进行动态的扩展) |
–sig-proxy | 设置代理接收京城信号 (默认为 true) |
–stop-signal string | 停止容器的信号 (默认为 “SIGTERM”) |
–stop-timeout int | 设置超时停止容器(以秒为单位) |
–storage-opt list | 设定容器的存储驱动程序选项 |
–sysctl map | 指定系统控制项 (默认为 map[] 的格式) |
–tmpfs list | 挂载tmpfs目录 |
-t, --tty | 为当前容器分配一个客户端 |
–ulimit ulimit | 启动需要限制的项(默认为数组的形式) |
-u, --user string | 用户名或UID(格式为: <name|uid>[:<group|gid>]) |
–userns string | 使用用户名称空间 |
–uts string | 使用UTS名称空间 |
-v, --volume list | 绑定安装卷(关于容器卷,在Docker容器数据卷中会具体的讲解) |
–volume-driver string | 容器的可选卷驱动程序 |
–volumes-from list | 指定容器装载卷 |
-w, --workdir string | 容器内的工作目录 |