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

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

因此,咱们须要解决一个痛点,那就是Python环境配置问题和版本冲突解决问题。若是咱们将Scrapyd直接打包成一个Docker镜像,那么在服务器上只须要执行Docker命令就能够启动Scrapyd服务,这样就不用再关心Python环境问题,也不须要担忧版本冲突问题。python

接下来,咱们就将Scrapyd打包制做成一个Docker镜像。mysql

1、准备工做

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

2、对接Docker

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

[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,其中修改的地方有两个。sql

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

  • bind_address = 0.0.0.0,本来是127.0.0.1,不能公开访问,这里修改成0.0.0.0便可解除此限制。django

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

requests
selenium
aiohttp
beautifulsoup4
pyquery
pymysql
redis
pymongo
flask
django
scrapy
scrapyd
scrapyd-client
scrapy-redis
scrapy-splash复制代码

若是运行的Scrapy项目还须要用到其余的库,这些库能够自行添加到此文件中。flask

最后新建一个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成功在其余服务器上运行。

3、结语

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


本资源首发于崔庆才的我的博客静觅: Python3网络爬虫开发实战教程 | 静觅

如想了解更多爬虫资讯,请关注个人我的微信公众号:进击的Coder

weixin.qq.com/r/5zsjOyvEZ… (二维码自动识别)

相关文章
相关标签/搜索