在实现分布式爬虫时,由于主机数量一般较多,使用手动安装scrapyd服务以及python环境较为繁琐又容易出现版本不一致等问题,docker对接scrapyd很好的解决了这一难题。
docker的安装:
1.主机端:
本机使用的win10系统,在官网上下载太慢,选择https://dn-dao-github-mirror.qbox.me/docker/install/windows/InstallDocker.msi
这里进行docker的下载。
下载完后记得打开Hyper_V微软自带虚拟机,因为docker容器在win10系统中是运行在Linux的虚拟机里的。
安装完后cmd运行docker,出现下图所示表示安装成功:
这里把国际库修改为国内库,否则上传下载镜像太慢:
在这里添加国内库:
https://registry.docker-cn.com
配置完成后进行打包
新建目录dockerfile,目录中新建scrapy.conf:
[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 = 127.0.0.1
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
这里修改自scrapyd官方conf文件,bind_address改为0000即可实现外部访问。
新建requirement.txt,将爬虫常用库写入:
requirement.txt
requests
selenium
beautifulsoup4
pyquery
pymysql
redis
flasky
django
scrapy
scrapyd
scrapyd-client
scrapy-redis
scrapy-splash
新建文件dockerfile,此处无后缀名,docker会默认运行此文件
from python:3.7
add . /code
workdir /code
copy ./scrapyd.conf /etc/scrapyd/
expose 6800
run pip3 install -r requirements.txt
cmd scrapyd
第一行要写自己的python版本,也就是说在构建时就已经有了Python 3.7的环境。
cmd进入dockerfile路径,运行:
docker build -t scrapy:1 .
创建镜像,这里scrapy:1可以更改名称,后面的“.”不要忘记。
创建成功后本地进行测试:
docker -d -p 6800:6800 scrapyd
到此打包完成。
上传dockerhub
打包完成后可以把镜像上传到在线库,这样后续主机就可以使用了。
1.cmd运行:
docker login
依次输入账号密码即可登录成功。
2.必须给打包好的镜像打一个标签才能上传:
docker tag scrapyd:1 scrapyd username/scrapyd:1
3.然后使用push命令:
docker push username/scrapyd:1
便可上传。
4.上传完毕后,其他主机使用命令:
docker run -d -p 6800:6800 username/scrapyd
即可运行镜像并启动scrapyd。
上传阿里云仓库
优点:速度很快
示例:
使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
registry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB
$ sudo docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
使用"docker images"命令找到镜像,将该镜像名称中的域名部分变更为Registry专有网络地址。
$ sudo docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
2.目标主机端
待部署的主机为centos7系统
使用curl -sSL https://get.daocloud.io/docker | sh
进行安装。
安装完成后即可使用dockerhub的镜像部署。
3.弊端
这样部署虽然解决了环境等问题,但如果目标主机数量太多就很麻烦,每台主机都要安装docker,所以可以在一台云主机上安装完docker和scrapyd后制作镜像,在新建主机的时候选择安装镜像。