用scrapyd部署scrapy项目

介绍与安装 scrapyd

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
  • 使用scrapyd时遇到一个天坑*
    在部署的时候,有一个问题:scrapyd-deploy nextst -p dspider
    会抛错:
  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"}

怎么查看scrapy的日志?

一个是spider的 终端log,放在http://localhost:6800/jobs 里面,能看到
其它的自定义log,则看项目自己放在哪里

scrapyd的配置等介绍

我们可以查看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

使用 SpiderKeeper来管理spider和jobs

上面使用了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

sracpyd的常用操作

操作用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

开job

http://127.0.0.1:6800/schedule.json -d project=myob -d spider=StItemDetail

查看job

http://127.0.0.1:6800/

关job

curl http://localhost:6800/cancel.json -d project=dspider -d job=46028aee84bc11e89427e0d55e1da53a

官网可以直接找到:https://scrapyd.readthedocs.io/en/latest/api.html#cancel-json

你可能感兴趣的:(python,scrapy,scrapyd)