Python爬虫项目


目录

  • Python爬虫项目
  • 安装虚拟环境
  • 使用Pycharm 进行 依赖管理
  • 项目部署(方法一)
  • 1) 首先安装docker:
  • 2) 下载自定义镜像需要用到的基础镜像:
  • 3) 基础镜像已经准备好了,接下来准备好需要部署的环境服务,以及python项目:
  • 项目部署(方法二)
  • 1)配置部署环境
  • 2)编写Dockerfile
  • 3)执行Dockerfile
  • Docker run 常用参数大全


安装虚拟环境

# 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 .
  1. 需要自定义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

容器内的工作目录