scrapyd是一个服务器,类似于nginx,tomcat,会暴露web接口 ,
我们的scrapy爬虫类似作为一个webapp部署进来,然后通过webapi进行开启关闭等操作
安装:
pip install scrapyd
我们部署的前提是自己已经有一个scrapy工程了,没有的请具体可参考:https://blog.csdn.net/mingover/article/details/80717974
新建一个目录 如 cd E:\scrapyd_fold\dspider , 这是用来放之后的部署文件的
spiderd命令开启一个服务
>cd E:\scrapyd_fold\dspider
>scrapyd
默认的访问地址 是 http://localhost:6800/
可以看到jobs,里面的表格内容即是我们要部署上去的scrapy服务,现在还没部署,所以啥都没有
* /etc/scrapyd/scrapyd.conf (Unix)
* c:\scrapyd\scrapyd.conf (Windows)
* /etc/scrapyd/conf.d/* (in alphabetical order, Unix)
* scrapyd.conf
* ~/.scrapyd.conf (users home directory)
上面的几个配置文件都可以生效,具体的配置直接看官网的说明,http://scrapyd.readthedocs.io/en/stable/config.html
如果scrapyd是放在服务器的,别忘记把 bind_address给改成 0.0.0.0 表示不限制访问ip
安装scrapyd-client,这是一个类似打包工具,把我们的scrapy程序打包成egg后扔给scrapyd,
这是一个打包和部署的工具,就像是maven…
pip install scrapyd-client
进到scrapy工程的根目录,然后执行打包与部署命令:
(p3scrapy) λ scrapyd-deploy nextst -p dspider
Packing version 1531231887
Deploying to project "dspider" in http://localhost:6800/addversion.json
Server response (200):
{"node_name": "gih-d-15336", "status": "ok", "project": "dspider", "version": "1531231887", "spiders": 75}
确保scrapy list 可用.
scrapy.cfg中[deploy] ->[deploy:xxx] 这个xxx是自定义的
把路径加到python可以搜索的路径 ,在settings.js中加上
import sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0,os.path.join(BASE_DIR,'dspider'))
在windows中,scrapyd-client的工具有个问题,没有exe或bat可执行文件,要自己去创建一个
@echo off
"xxxx\python_env\p3scrapy\Scripts\python.exe" "xxx\python_env\p3scrapy\Scripts\scrapyd-deploy" %1 %2 %3 %4 %5 %6 %7 %8 %9
File "d:\netease\work\code\python_env\p3scrapy\lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "" , line 994, in _gcd_import
File "" , line 971, in _find_and_load
File "" , line 955, in _find_and_load_unlocked
File "" , line 656, in _load_unlocked
File "" , line 626, in _load_backward_compatible
File "c:\users\denggu~1\appdata\local\temp\dspider-1531231546-kluup944.egg\dspider\settings.py", line 183, in
File "E:\python36\Lib\logging\config.py", line 795, in dictConfig
dictConfigClass(config).configure()
File "E:\python36\Lib\logging\config.py", line 566, in configure
'%r: %s' % (name, e))
ValueError: Unable to configure handler 'error': [Errno 2] No such file or directory: 'c:\\users\\denggu~1\\appdata\\local\\temp\\dspider-1531231546-kluup944.egg\\error.log'
这是因为使用scrapyd部署上去的时候,BASE_DIR会被其覆盖,导致我们很多的log都找错了地方,显示错误,我们要新建一个 LOG_DIR,写死路径,不要使用BASE_DIR在系统中拼装!!!!!(这个问题找了我一天,主要是最开始是用error.log,非常规范的log,一直以为是scrapyd自己的log,但实际上,这个error.log是代码里面的,因为其path用了BASE_DIR,导致路径很错误,导致错误)
实际上这个问题准确的说是 os.path.dirname(os.path.dirname(os.path.abspath(file)))这一串有问题,这个生成的路径变奇怪了,多试了几次,os.path.abspath(file) 是这个路径c:\users\xxxxx\appdata\local\temp\dspider-1531277157-jjulp4yq.egg\dspider\settings.py
.应该是打包的时候路径变了(有点神奇,打包的时候(也有可能是打成egg扔给服务端解析的时候),为啥会运行这个py?)
原网址:
https://stackoverflow.com/questions/50453479/valueerror-while-deploying-scrapy
查看有哪些项目扔上去了 http://127.0.0.1:6800/listprojects.json
运行某一个spider
(p3scrapy) λ curl http://localhost:6800/schedule.json -d project=dspider -d spider=StItemDetail
{"node_name": "gih-d-15336", "status": "ok", "jobid": "a648e682844c11e8946ae0d55e1da53a"}
运行后,查看http://localhost:6800/jobs, 就能看到一个在运行的job(即spider)
关闭一个job
(p3scrapy) λ curl http://localhost:6800/cancel.json -d project=dspider -d job=cd581540844d11e8a017e0d55e1da53a
{"node_name": "gih-d-15336", "status": "ok", "prevstate": "running"}
一个是spider的 终端log,放在http://localhost:6800/jobs 里面,能看到
其它的自定义log,则看项目自己放在哪里
我们可以查看XXX/python_env\p3scrapy\Lib\site-packages\scrapyd/default_scrapyd.conf 中的内容,可以看到相应的配置,具体的问题,自行查看官网
[scrapyd]
eggs_dir = eggs
logs_dir = logs
items_dir =
jobs_to_keep = 5
dbs_dir = dbs
max_proc = 0
max_proc_per_cpu = 4
finished_to_keep = 100
poll_interval = 5.0
bind_address = 127.0.0.1
http_port = 6800
debug = on
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
上面使用了spiderd-client来打包和部署,同时使用spderd来创建一个job和执行,但都是命令行,不方便,可以直接使用spiderKepper来界面显示,比较好用
spiderKepper是一个web应用,配置指向spiderd的 web访问接口即可.
由于使用简单,直接看官网即可,
1,这里有个坑,有时候即使部署egg不成功,他也显示成功,导致建job的时候,找不到 spider,就会有点蒙
2,spiderkeeper是要在本地先打包egg后把这个egg扔到服务端的,界面有提示,扔完后记得查看一下spiderd中有没有这个项目http://xxxxx:5000/api.html
具体参考:
https://github.com/DormyMo/SpiderKeeper
操作用spiderKeeper是OK的,不过因为有些不直接,如有错也不抛….
保险点还是直接用spiderd的api接口:
scrapyd-deploy –build-egg output4.egg
curl http://localhost:6800/addversion.json -F project=oo -F version=1 -F egg=@nextspi\output4.egg
egg选项后面是文件
scrapyd-deploy target -p dspider
如果使用这种方式,则scrapy.cfg中的deploy要配置好, 如配置成这样:
[deploy:target]
url = http://localhost:6800/
project = dspider
curl http://localhost:6800/delproject.json -d project=dspider
curl http://localhost:6800/listprojects.json
http://127.0.0.1:6800/schedule.json -d project=myob -d spider=StItemDetail
http://127.0.0.1:6800/
curl http://localhost:6800/cancel.json -d project=dspider -d job=46028aee84bc11e89427e0d55e1da53a
官网可以直接找到:https://scrapyd.readthedocs.io/en/latest/api.html#cancel-json