美文网首页笑笑酱项目部署
分布式爬虫的部署之Scrapyd对接Docker

分布式爬虫的部署之Scrapyd对接Docker

作者: Aedda | 来源:发表于2019-03-30 11:38 被阅读32次

    来源:https://juejin.im/entry/5b14d2a2e51d4506db4e81ff

    我们使用了Scrapyd-Client成功将Scrapy项目部署到Scrapyd运行,前提是需要提前在服务器上安装好Scrapyd并运行Scrapyd服务,而这个过程比较麻烦。如果同时将一个Scrapy项目部署到100台服务器上,我们需要手动配置每台服务器的Python环境,更改Scrapyd配置吗?如果这些服务器的Python环境是不同版本,同时还运行其他的项目,而版本冲突又会造成不必要的麻烦。

    所以,我们需要解决一个痛点,那就是Python环境配置问题和版本冲突解决问题。如果我们将Scrapyd直接打包成一个Docker镜像,那么在服务器上只需要执行Docker命令就可以启动Scrapyd服务,这样就不用再关心Python环境问题,也不需要担心版本冲突问题。

    接下来,我们就将Scrapyd打包制作成一个Docker镜像。

    一、准备工作

    请确保本机已经正确安装好了Docker。

    二、对接Docker

    新建一个项目,新建一个scrapyd.conf,即Scrapyd的配置文件,内容如下:

    [scrapyd]

    eggs_dir    = eggs

    logs_dir    = logs

    items_dir  =

    jobs_to_keep = 5

    dbs_dir    = dbs

    max_proc    = 0

    max_proc_per_cpu = 10

    finished_to_keep = 100

    poll_interval = 5.0

    bind_address = 0.0.0.0

    http_port  = 6800

    debug      = off

    runner      = scrapyd.runner

    application = scrapyd.app.application

    launcher    = scrapyd.launcher.Launcher

    webroot    = scrapyd.website.Root

    [services]

    schedule.json    = scrapyd.webservice.Schedule

    cancel.json      = scrapyd.webservice.Cancel

    addversion.json  = scrapyd.webservice.AddVersion

    listprojects.json = scrapyd.webservice.ListProjects

    listversions.json = scrapyd.webservice.ListVersions

    listspiders.json  = scrapyd.webservice.ListSpiders

    delproject.json  = scrapyd.webservice.DeleteProject

    delversion.json  = scrapyd.webservice.DeleteVersion

    listjobs.json    = scrapyd.webservice.ListJobs

    daemonstatus.json = scrapyd.webservice.DaemonStatus

    这里实际上是修改自官方文档的配置文件:https://scrapyd.readthedocs.io/en/stable/config.html#example-configuration-file,其中修改的地方有两个。

    max_proc_per_cpu=10,原本是4,即CPU单核最多运行4个Scrapy任务,也就是说1核的主机最多同时只能运行4个Scrapy任务,这里设置上限为10,也可以自行设置。

    bind_address = 0.0.0.0,原本是127.0.0.1,不能公开访问,这里修改为0.0.0.0即可解除此限制。

    新建一个requirements.txt,将一些Scrapy项目常用的库都列进去,内容如下:

    requests

    selenium

    aiohttp

    beautifulsoup4

    pyquery

    pymysql

    redis

    pymongo

    flask

    django

    scrapy

    scrapyd

    scrapyd-client

    scrapy-redis

    scrapy-splash

    如果运行的Scrapy项目还需要用到其他的库,这些库可以自行添加到此文件中。

    最后新建一个Dockerfile,内容如下:

    FROM python:3.6

    ADD . /code

    WORKDIR /code

    COPY ./scrapyd.conf /etc/scrapyd/

    EXPOSE 6800

    RUN pip3 install -r requirements.txt

    CMD scrapyd

    第一行的FROM是指在python:3.6这个镜像上构建,也就是说在构建时就已经有了Python 3.6的环境。

    第二行的ADD是将本地的代码放置到虚拟容器中。它有两个参数:第一个参数是. ,即代表本地当前路径;第二个参数/code代表虚拟容器中的路径,也就是将本地项目所有内容放置到虚拟容器的/code目录下。

    第三行的WORKDIR是指定工作目录,这里将刚才添加的代码路径设成工作路径,这个路径下的目录结构和当前本地目录结构是相同的,所以在这个目录下可以直接执行库安装命令。

    第四行的COPY是将当前目录下的scrapyd.conf文件复制到虚拟容器的/etc/scrapyd/目录下,Scrapyd在运行的时候会默认读取这个配置。

    第五行的EXPOSE是声明运行时容器提供服务端口,注意这里只是一个声明,运行时不一定会在此端口开启服务。这个声明的作用,一是告诉使用者这个镜像服务的运行端口,以方便配置映射,二是在运行使用随机端口映射时,容器会自动随机映射EXPOSE的端口。

    第六行的RUN是执行某些命令,一般做一些环境准备工作。由于Docker虚拟容器内只有Python 3环境,而没有Python库,所以我们运行此命令来在虚拟容器中安装相应的Python库,这样项目部署到Scrapyd中便可以正常运行。

    第七行的CMD是容器启动命令,容器运行时,此命令会被执行。这里我们直接用scrapyd来启动Scrapyd服务。

    基本工作完成了,我们运行如下命令进行构建:

    docker build -t scrapyd:latest .

    构建成功后即可运行测试:

    docker run -d -p 6800:6800 scrapyd

    打开:http://localhost:6800,即可观察到Scrapyd服务,如下图所示。

    这样,Scrapyd Docker镜像构建完成并成功运行。

    我们可以将此镜像上传到Docker Hub。例如,我的Docker Hub用户名为germey,新建一个名为scrapyd的项目,首先可以为镜像打一个标签来标识一下:

    docker tag scrapyd:latest germey/scrapyd:latest

    这里请自行替换成你的项目名称。

    然后 Push 即可:

    docker push germey/scrapyd:latest

    之后在其他主机运行此命令即可启动Scrapyd服务:

    docker run -d -p 6800:6800 germey/scrapyd

    Scrapyd成功在其他服务器上运行。

    三、结语

    我们利用Docker解决了Python环境的问题。接下来,我们再解决批量部署Docker的问题。

    相关文章

      网友评论

        本文标题:分布式爬虫的部署之Scrapyd对接Docker

        本文链接:https://www.haomeiwen.com/subject/ywejbqtx.html