四大爬虫管理平台
- Crawlab
- Gerapy
- Scrapydweb
- SpiderKeeper
- scrapyd
Crawlab
- 前端:vue-element-admin
- 后端:go
- 不局限于语言和scrapy,
运行
第一步:部署
docker pull tikazyq/crawlab:latest
安装完docker-compose和定义好docker-compose.yml后,只需要运行以下命令就可以启动Crawlab。
注意需要自己参考官网定义这个docker-compose.yml
docker-compose up
第二步,使用
1,节点管理
节点可以看作是一个服务器。节点负责执行爬虫任何、提供API等功能。节点之间是可以相互通信的,节点通信主要通过Redis。
查看节点列表
查看节点拓扑图
2,爬虫
爬虫就是我们通常说的网络爬虫了
创建爬虫
部署爬虫
运行爬虫
统计数据--这一点很好
3,任务
任务其实就是指某一次抓取任务或采集任务。任务与爬虫关联,其执行的也是爬虫指定的执行命令或采集规则。
抓取或采集的结果与任务关联,因此可以查看到每一次任务的结果集。
Crawlab的任务是整个采集流程的核心,抓取的过程都是跟任务关联起来的,因此任务对于Crawlab来说非常重要。
任务被主节点触发,工作节点通过任务队列接收任务,然后在其所在节点上执行任务。
查看任务
操作任务
下载结果
定时任务
4,缺少的功能
异常监控(零值、空值)、可配置爬虫、可视化抓取、日志集中收集
Gerapy
- 前端:vue
- 后端:python-Django
- 基于scrapyd,只支持scrapy
运行
第一步,github下载源码
git clone https://github.com/Gerapy/Gerapy.git
第二步:新建虚拟环境安装依赖,
# python setup.py install
第三步,migrate
cd gerapy
gerapy migrate
第四步,创建超级管理员
gerapy createsuperuser
admin/admin
第五步,运行
gerapy runserver
http://localhost:8000
可以正常登陆进去就成功了
第六步,使用
1,主机管理
添加我们需要管理的 Scrapyd 服务:
需要添加 IP、端口,以及名称,点击创建即可完成添加,点击返回即可看到当前添加的 Scrapyd 服务列表
状态一栏看到各个 Scrapyd 服务是否可用,同时可以一目了然当前所有 Scrapyd 服务列表,另外我们还可以*地进行编辑和删除。
2,项目管理
2.1 新建项目
Gerapy 的核心功能当然是项目管理,在这里我们可以*地配置、编辑、部署我们的 Scrapy 项目,点击左侧的 Projects 。
假设现在我们有一个 Scrapy 项目,如果我们想要进行管理和部署,还记得初始化过程中提到的 projects 文件夹吗?
这时我们只需要将项目拖动到刚才 gerapy 运行目录的 projects 文件夹下,例如我这里写好了一个 Scrapy 项目,名字叫做 jd,这时把它拖动到 projects 文件夹下:
这时刷新页面,我们便可以看到 Gerapy 检测到了这个项目,同时它是不可配置、没有打包的
2.2 打包项目
这时我们可以点击部署按钮进行打包和部署,在右下角我们可以输入打包时的描述信息,类似于 Git 的 commit 信息,
然后点击打包按钮,即可发现 Gerapy 会提示打包成功,同时在左侧显示打包的结果和打包名称
2.3 部署项目
打包成功之后,我们便可以进行部署了,我们可以选择需要部署的主机,点击后方的部署按钮进行部署,同时也可以批量选择主机进行部署
可以发现此方法相比 Scrapyd-Client 的命令行式部署,简直不能方便更多。
2.4 在线编辑
同时 Gerapy 还支持项目编辑功能,有了它我们不再需要 IDE 即可完成项目的编写,我们点击项目的编辑按钮即可进入到编辑页面,
3,监控任务
部署完毕之后就可以回到主机管理页面进行任务调度了,任选一台主机,点击调度按钮即可进入任务管理页面,此页面可以查看当前 Scrapyd 服务的所有项目、所有爬虫及运行状态:
我们可以通过点击新任务、停止等按钮来实现任务的启动和停止等操作,同时也可以通过展开任务条目查看日志详情:
另外我们还可以随时点击停止按钮来取消 Scrapy 任务的运行。
这样我们就可以在此页面方便地管理每个 Scrapyd 服务上的 每个 Scrapy 项目的运行了。
4,代码生成
上面写好的scrapy是不支持配置的,
我们可以借助于 Gerapy 方便地完成编辑、部署、控制、监测等功能,
步骤:
1,我们可以点击项目页面的右上角的创建按钮,增加一个可配置化爬虫,
2,接着我们便可以:
添加提取实体
爬取规则
抽取规则了,
3,最后点击生成按钮即可完成代码的生成。
生成的代码示例结果其结构和 Scrapy 代码是完全一致的。
后续都是一样的操作,部署,启动,监控
缺点:
1,很明显没有告警
2,很明显没有日志解析
但是页面的确非常符合国人
Scrapydweb
- 前端:Element,EChartssssss
- 后端:python-flask
- 基于scrapyd,只支持scrapy
运行
第一步,github下载源码
git clone https://github.com/my8100/scrapydweb.git
第二步:新建虚拟环境安装依赖,
cd scrapydweb
python setup.py install
第三步:运行scrapyd
命令:scrapyd
因为这个服务是基于scrapyd的
第四步:启动scrapydweb
通过运行命令 scrapydweb 启动 ScrapydWeb(首次启动将自动生成配置文件)。
访问 http://127.0.0.1:5000
注意:如果出现6801端口无法连接,这个是因为你没有配置集群环境,不用担心
第五步:配置
(基本上使用默认的就行,根据需要配置)
运行scrapydweb会自动生成scrapydweb_settings_v10.py的文件
配置文件在你当前启动scrapydweb路径下,scrapydweb_settings_v10.py,只有两处需要配置。
①第一处就是username和password,如果是远程的服务器的话,建议开启认证
②第二处是项目路径SCRAPY_PROJECTS_DIR = ''(这里是scrapydweb比较方便的地方,不用事先将项目先上传到scrapyd服务器,scrapydweb能够帮我们上传)
配置完成之后,注意重启scrapydweb
其他配置
1,配置scrapyd服务器节点
然后打开文件, 修改
SCRAPYD_SERVERS = [
'127.0.0.1:6800',
# 'username:password@localhost:6801#group',
# ('username', 'password', 'localhost', '6801', 'group'),
]
2,配置日志解析
有两种方案
一、scrapydweb和scrapyd在同一台服务器
LOCAL_SCRAPYD_LOGS_DIR = '' # 指定scrapyd的logs文件路径
ENABLE_LOGPARSER = False # 不自动启用logparser
二、scrapydweb和scrapyd不在同一个服务器
在scrapyd服务器上安装logparser, 然后运行
logparser -dir scrapyd的日志目录
安装完成以后, 通过http://127.0.0.1:6800/logs/stats.json就可以看到logparser解析出来的日志了
3,开启scrapydweb安全认证
在配置文件scrapydweb_settings_v10.py中
# The default is False, set it to True to enable basic auth for the web UI.
ENABLE_AUTH = True # False是禁用
# In order to enable basic auth, both USERNAME and PASSWORD should be non-empty strings.
USERNAME = '123' # 用户名
PASSWORD = '123' # 密码
开启以后重启服务, 刷新就可以看到需要输入用户名和密码了
4,开启https
在配置文件scrapydweb_settings_v10.py中
ENABLE_HTTPS = True # True是开启, False关闭
# e.g. '/home/username/cert.pem'
CERTIFICATE_FILEPATH = ''
# e.g. '/home/username/cert.key'
PRIVATEKEY_FILEPATH = ''
5,运行爬虫的默认设置
在配置文件scrapydweb_settings_v10.py中
SCHEDULE_EXPAND_SETTINGS_ARGUMENTS = False # Run Spider页面是否自动展开settings & arguments选项卡
SCHEDULE_CUSTOM_USER_AGENT = 'Mozilla/5.0' # 调度爬虫时默认的UA
SCHEDULE_USER_AGENT = ['custom', 'Chrome', 'iPhone', 'iPad', 'Android'] # 可选择的UA 列表
SCHEDULE_ROBOTSTXT_OBEY = None # 是否开启检测robots.txt文件
SCHEDULE_COOKIES_ENABLED = None # 是否开启cookie
SCHEDULE_CONCURRENT_REQUESTS = None # 并发请求数
SCHEDULE_DOWNLOAD_DELAY = None # 下载延迟时间
SCHEDULE_ADDITIONAL = "-d setting=CLOSESPIDER_TIMEOUT=60\r\n-d setting=CLOSESPIDER_PAGECOUNT=10\r\n-d arg1=val1" # Run Spider界面自动附加参数
第六步:功能列表
1,管理scrapyd集群
2,定时任务(定时运行爬虫)
3,任务列表管理
4,部署爬虫
5,手动调用爬虫
6,项目管理
7,配合logparser进行日志解析
8,支持手机ui
第七步:scrapydweb的使用
1,部署爬虫
打开配置文件
SCRAPY_PROJECTS_DIR=爬虫项目的上一级目录, 也就是`scrapy.cfg`文件所在的上一级目录
然后点击左侧Deploy Project
第一个tab是一键部署
第二个tab是上传文件部署
支持一键部署项目到 Scrapyd server 集群。
2,运行爬虫
点击左侧Run Spider 然后选择要运行的服务器、项目、版本、爬虫, 以及要覆盖的配置项、传给爬虫的参数
点击Check CMD按钮生成命令
然后点击Run Spider就可以手动运行爬虫了
timer task是添加一个定时任务.
3,查看爬虫运行情况以及日志
点击左侧的Job按钮, 就可以看到我们所有运行过的任务,
点击蓝色的Stats即可查看爬虫运行产生的日志信息
点击绿色的Start的按钮,可以再次运行爬虫
4,邮件通知
基于后台定时读取和分析 Scrapy log 文件,ScrapydWeb 将在满足特定触发器时发送通知邮件,邮件正文包含当前运行任务的统计信息。
1、添加邮箱帐号:
SMTP_SERVER = 'smtp.qq.com'
SMTP_PORT = 465
SMTP_OVER_SSL = True
SMTP_CONNECTION_TIMEOUT = 10
FROM_ADDR = 'username@qq.com'
EMAIL_PASSWORD = 'password'
TO_ADDRS = ['username@qq.com']
2、设置邮件工作时间和基本触发器,以下示例代表:每隔1小时或某一任务完成时,并且当前时间是工作日的9点,12点和17点,ScrapydWeb 将会发送通知邮件。
EMAIL_WORKING_DAYS = [1, 2, 3, 4, 5]
EMAIL_WORKING_HOURS = [9, 12, 17]
ON_JOB_RUNNING_INTERVAL = 3600
ON_JOB_FINISHED = True
3、除了基本触发器,ScrapydWeb 还提供了多种触发器用于处理不同类型的 log,包括 'CRITICAL', 'ERROR', 'WARNING', 'REDIRECT', 'RETRY' 和 'IGNORE'等。
LOG_CRITICAL_THRESHOLD = 3
LOG_CRITICAL_TRIGGER_STOP = True
LOG_CRITICAL_TRIGGER_FORCESTOP = False
#...
LOG_IGNORE_TRIGGER_FORCESTOP = False
以上示例代表:当发现3条或3条以上的 critical 级别的 log 时,ScrapydWeb 自动停止当前任务,如果当前时间在邮件工作时间内,则同时发送通知邮件。
遗留问题
1,我没有搞懂这个告警是怎么回事
2,我没搞懂这个log解析是怎么回事,
缺点
1,没有统计报表
但是已经比spiderkeeper更加完善了,
SpiderKeeper
- 前后端不分离,
- 使用python-flask
- 基于scrapyd,只支持scrapy
运行
第一步:github下载源码
第二步:新建虚拟环境,安装包
pip install scrapy
pip install scrapyd
pip install scrapyd-client
pip install -r requirements.txt
第三步:运行scrapyd
命令:scrapyd
因为这个服务是基于scrapyd的
第四步:运行SpiderKeeper项目
访问http://0.0.0.0:5000/
admin/admin
第五步:页面使用
1,项目管理
创建项目,
查看运行统计结果,
2,爬虫管理
打包egg文件 scrapyd-deploy --build-egg output.egg
上传egg文件,提交以后看到部署成功即可
查看爬虫列表,
3,任务管理(最重要!!)
3.1 查看执行结果
单次执行 runonce
下一个任务,
正在执行的任务,可以看日志,可以stop,
完成的任务,可以看日志,方便定位问题,
3.2 任务管理
创建任务,定时执行,可以配置执行策略
删除任务,运行任务(单次执行),关闭任务,启动任务,删除任务
缺点
1,页面没有翻页
2,页面没有查询
3,没有节点管理
4,没有任务告警
scrapyd
- 这是scrapy官方提供的部署scrapy的一个service,
- 可以部署你的scrapy项目,并且提供了api,操控你的爬虫
- 官方文档:http://scrapyd.readthedocs.org/
- scrapyd是放在服务端的,有一个scrapy-client,可以和scrapyd交互发布爬虫到远程服务端
- 因为scrapyd的管理界面太丑了(公认的), 并且很多功能都需要自己写接口请求json API才可以, 所以有很多三方的scrapyd的web管理工具.
scrapyd使用-参考官方文档
第一步:安装:
pip install scrapyd
pip install scrapyd-client
第二步:启动服务命令:scrapyd
http://127.0.0.1:6800/
第三步:进入scrapy项目根目录
scrapy项目根目录有一个scrapy.cfg
[deploy]
#url = http://localhost:6800/
project = scrapy_demo1
打开这个url,定义爬虫服务名,[deploy:baby]
第四步:使用scrapy-client打包项目
进入scrapy项目根目录
scrapyd-deploy -l 查看
scrapy list 查看所有爬虫列表
scrapyd-deploy 部署名称 -p 项目名称
比如:scrapyd-deploy baby -p scrapy_demo1
这个时候在web端就能看到项目了
第五步:运行爬虫
curl http://localhost:6800/daemonstatus.json 查看服务的状态
curl http://localhost:6800/schedule.json -d project=myproject -d spider=somespider 运行爬虫
第六步:管理爬虫
curl http://localhost:6800/cancel.json -d project=scrapy项目名称 -d job=运行ID 停止爬虫
curl http://localhost:6800/delproject.json -d project=scrapy项目名称 删除scrapy项目 注意:一般删除scrapy项目,需要先执行命令停止项目下在远行的爬虫
curl http://localhost:6800/listprojects.json 查看有多少个scrapy项目在api中
curl http://localhost:6800/listspiders.json?project=scrapy项目名称 查看指定的scrapy项目中有多少个爬虫
curl http://localhost:6800/daemonstatus.json 查看服务的状态,也可以监控爬虫进程。
curl http://127.0.0.1:6800/listversions.json?project=myproject 获取项目下已发布的爬虫版本列表
curl http://127.0.0.1:6800/listjobs.json?project=myproject 获取爬虫运行状态
http://127.0.0.1:6800/schedule.json (post方式,data={“project”:myproject,“spider”:myspider}) 启动服务器上某一爬虫(必须是已发布到服务器的爬虫)
http://127.0.0.1:6800/delversion.json (post方式,data={“project”:myproject,“version”:myversion}) 删除某一版本爬虫
http://127.0.0.1:6800/delproject.json(post方式,data={“project”:myproject}) 删除某一工程,包括该工程下的各版本爬虫
第七步:常用脚本
循环任务:
while true
do
curl http://127.0.0.1:6800/schedule.json -d project=FXH -d spider=five_sec_info
sleep 10
done
实时时间打印:
echo "$(date +%Y-%m-%d:%H:%M.%S), xx-spider定时启动--"
SwordCaster
- 构思自己的爬虫管理平台
- 前端:vue-element-admin
- 后端:python-flask
- 基于scrapyd,只支持scrapy
项目构思
项目构思
1,节点管理
- 节点注册
- 节点之间通信
- 节点监控
2,项目管理
- 添加项目
- 部署项目
3,爬虫管理
- 查看爬虫运行记录
- 爬虫配置
- 爬虫版本管理
4,任务管理
- 任务添加,删除,修改,
- 任务调度,执行,暂停,
- 定时任务
- 查看任务结果
- 技术路线:APScheduler
5,告警管理
- 监控任务是否正常
- 监控爬取结果是否正常,是否有空值等
- 监控日志是否有异常,
- 上面有异常要进行失败告警,
6,报表管理
- 主机统计
- 项目统计
- 爬虫运行数据统计
- 爬虫日志管理
- 结果导出
7,高级
- 可视化配置抓取规则
- 代理池
- cookie池
- 异常监控
- 在线编辑代码
- 消息通知
- 移动界面
8,持续集成
构建持续集成(CI)工作流
对于企业来说,软件开发一般是一个自动化过程。
它会经历需求、开发、部署、测试、上线这几个步骤。而这个流程一般是不断迭代(Iterative)的,需要不断更新和发布。
以爬虫为例,您上线了一个爬虫,这个爬虫会定期抓取网站数据。
但突然有一天您发现数据抓不到了,您快速定位原因,发现原来是网站改版了,您需要更改爬虫抓取规则来应对网站的改版。
总之,您需要发布一个代码更新。最快的做法是直接在线上更改代码。但这样做非常危险:
第一,您无法测试您更新后的代码,只能通过不断调整线上代码来测试是否抓取成功;
第二,您无法记录这次更改,后期如果出了问题您很可能会忽略掉这次更改,从而导致 bug。
您需要做的,无非是将您的爬虫代码用版本管理工具管理起来。我们有很多版本管理工具,最常用的就是 git、subversion,
版本管理平台包括 Gitlab、Bitbucket、自搭 Git 仓库等。
当我们更新了代码,我们需要将更新后的代码发布到线上服务器。这时您需要用自己写部署脚本,
或者更方便的,用 Jenkins 作为持续集成(Continuous Integration)管理平台。
Jenkins 是一个持续集成平台,可以通过获取版本库来更新部署代码,是非常实用的工具,在很多企业中都有用到。
如果把爬虫管理平台应用到持续集成工作流程中,这是一个问题,
我们做持续集成,步骤如下:
1,用 Gitlab 或其他平台搭建好代码仓库;
2,在 Jenkins 中创建一个项目,在项目中将代码源指向之前创建的仓库;
3,在 Jenkins 项目中编写工作流,将发布地址指向 Crawlab 的CRAWLAB_SPIDER_PATH,如果是 Docker 注意将该地址挂载到宿主机文件系统;
4,Jenkins 项目的工作可以直接编写,也可以用 Jenkinsfile,具体可以查相关资料;
5,这样,每一次代码更新提交到代码仓库后,Jenkins 就会将更新后的代码发布到 Crawlab 里,Crawlab 主节点会将爬虫代码同步到工作节点,以待抓取。
# 使用爬虫管理平台的好处
- 命令行之间来回切换,非常容易出错
- 不用 shell 命令一个一个来查看日志来定位错误原因