大多数企业都离不开爬虫,爬虫是获取数据的一种有效办法。对搜索引擎来说,爬虫不可或缺;对舆情公司来说,爬虫是根本;对 NLP来说,爬虫可以获取语料;对初创公司来说,爬虫可以获取初始内容。但是爬虫技能纷繁繁芜,不同类型的抓取场景会利用到不同的技能。例如,大略的静态页面可以用 HTTP 要求+HTML 解析器直接搞定;一个动态页面须要用 Puppeteer 或 Selenium等自动化测试工具;有反爬的网站须要用到代理、打码等技能;等等。因此,对爬虫有规模量级哀求的企业或个人须要同时处理不同类别的爬虫,这会凭空增长很多附加的管理本钱。同时,爬虫管理者还须要应对网站内容变更、持续增量抓取、任务失落败等问题。因此一个成熟的爬虫管理流程该当包含一个管理系统,能够有效处理上述问题。
理解什么是爬虫管理平台
定义

爬虫管理平台是一个一站式管理系统,集爬虫支配、任务调度、任务监控、结果展示等模块于一体,常日配有可视化 UI 界面,可以在 Web 端通过与 UI 界面交互来有效管理爬虫。爬虫管理平台一样平常来说是支持分布式的,可以在多台机器上协作运行。
当然,上述这个定义是狭义的,常日针对付技能职员或开拓者或技能经理。企业内部一样平常都会开拓自己的内部爬虫管理系统,以应对繁芜的爬虫管理需求。这样的系统便是上述定义的狭义的爬虫管理平台。
广义爬虫管理平台
而什么是广义的爬虫管理平台呢?您可能听说过神箭手(后转型为后羿采集器)和八爪鱼吧。前者是基于云做事的,可以在线上编写、运行和监控爬虫,在广义爬虫平台中最靠近狭义定义的爬虫管理平台;后者是一个大众的商业爬虫抓取工具,可以让小白用户拖沓拽编写、运行爬虫,导出数据。您也可能见过各种 API 聚合做事商,例如聚合数据,这是一个可以直接调用网站接口获取数据的平台,这实在也算作爬虫平台的一个变种,只是它帮你完成了爬虫编写这一过程。而介于这两者之间的呢,国外有一家叫 Kimonolab 的公司,它开拓了一个叫 Kimono 的 Chrome 插件,可以让用户在页面上可视化的点击元素并天生抓取规则,并在其网站上天生爬虫程序,用户提交任务,后台就可以自动在网站上抓取数据了。Kimono 是一个伟大的爬虫运用,但可惜的是,Kimonolab 已经被大数据公司 Plantir 收购,现在也就无法体验了。
在本文中,我们紧张关注狭义定义的爬虫管理平台,因此后面所讲到的爬虫管理平台都是指狭义的定义。
爬虫管理平台模块
以下是一个范例的爬虫管理平台所涉及的模块。
范例爬虫管理平台的模块紧张包含以下内容:
任务管理:如何实行、调度爬虫抓取任务,以及如何监控任务,包括日志监控等等;爬虫管理:包括爬虫支配,即将开拓好的爬虫支配(打包或复制)到相应的节点上,以及爬虫配置和版本管理;节点管理:包括节点(做事器/机器)的注册和监控,以及节点之间的通信,如何监控节点性能状况等;前端运用:包括一个可视化 UI 界面,让用户可通过与其交互,与后台运用进行通信。当然,有些爬虫管理平台可能还不止这些模块,它可能包括其他比较实用的功能,例如可配置的抓取规则、可视化配置抓取规则、代理池、Cookie 池、非常监控等等。
为什么须要爬虫管理平台
有了爬虫管理平台,开拓者特殊是爬虫工程师就能够方便的添加爬虫、实行任务、查当作果,而不用在命令行之间来回切换,非常随意马虎出错。一个常见的场景便是爬虫工程师最初技能选型用了 scrapy 和 crontab 来管理爬虫任务,他不得欠妥心翼翼的选择定时任务的韶光区间,以至于不会将做事器 CPU 或内存占满;更棘手的问题是,他还须要将 scrapy 产生的日志存到文件里,一旦爬虫出错了,他不得不用 shell 命令一个一个来查看日志来定位缺点缘故原由,严重时会花上一个整天;还有个严重的问题,爬虫工程师可能创造公司业务量在增加,他须要写上百个爬虫来知足公司的业务需求,而用 scrapy 和 crontab 来管理完备便是个噩梦。可怜的爬虫工程师实在完备可以选择一个得当爬虫管理平台来办理他的问题。
如何选择一个得当的爬虫管理平台
当您乐意办理前面提到的爬虫工程师碰着的困难问题,而转而想选择一个得当的爬虫管理平台时。
您首先该当回答的问题是:我们是否须要从零开始开拓一套系统(Start from scratch)?要回答这个问题,您该当先回答下面几个问题:
我们的需求是否繁芜到须要完备定制化开拓一套新系统(例如哀求繁芜的权限管理)?我们的团队是否有足够的技能实力来开拓这套系统(例如有履历丰富的前后端开拓工程师)?我们的韶光资源是否足够我们开拓这套系统(例如项目操持周期为一年)?如果上述三个问题的答案任意一个为“否”,您该当好好考虑利用市情上已有的开源爬虫管理平台来知足您的需求。
以下为市情上已有的开源爬虫管理平台:
平台名称 技能 优点 缺陷 SpiderKeeper Python Flask 基于 scrapyd,开源版 Scrapyhub,非常简洁的 UI 界面,支持定时任务 可能有些过于简洁了,不支持分页,不支持节点管理,不支持 scrapy 以外的爬虫 Gerapy Python Django + Vue Gerapy 是崔庆才大神开拓的爬虫管理平台,安装支配非常大略,同样基于 scrapyd,有精美的 UI 界面,支持节点管理、代码编辑、可配置规则等功能 同样不支持 scrapy 以外的爬虫,而且据利用者反馈,1.0 版本有很多 bug,期待 2.0 版本会有一定程度的改进 Scrapydweb Python Flask + Vue 精美的 UI 界面,内置了 scrapy 日志解析器,有较多任务运行统计图表,支持节点管理、定时任务、邮件提醒、移动界面,算是 scrapy-based 中功能完善的爬虫管理平台 同样不支持 scrapy 以外的爬虫,Python Flask 为后端,性能上有一定局限性 Crawlab Golang + Vue 不局限于 scrapy,可以运行任何措辞和框架的爬虫,精美的 UI 界面,天然支持分布式爬虫,支持节点管理、爬虫管理、任务管理、定时任务、结果导出、数据统计等功能 支配轻微有一些麻烦(不过利用 Docker 可以一键支配),最新版本暂时不支持可配置爬虫 总的来说,SpiderKeeper 可能是最早的爬虫管理平台,但功能相对来说比较局限;Gerapy 虽然功能完好,界面精美,但有不少 bug 须要处理,建议有需求的用户等待 2.0 版本;Scrapydweb是一个比较完善的爬虫管理平台,不过和前两者一样,都是基于 scrapyd 的,因此只能运行 scrapy 爬虫;而Crawlab是一个非常灵巧的爬虫管理平台,可以运行 Python、Nodejs、Java、PHP、Go 写的爬虫,而且功能比较完好,只是支配起来相对付前三者来说要麻烦一些,不过对付 Docker 利用者来说可以做到一件支配(后面我们会讲)。
因此,对付重度 scrapy 爬虫依赖的、又不想折腾的开拓者,可以考虑 Scrapydweb;而对付有各种类型的、繁芜技能构造的爬虫开拓者来说,该当优先考虑更灵巧的 Crawlab。当然,不是说 Crawlab 对 scrapy 支持不友好,Crawlab 同样可以很好的集成 scrapy,后面会先容。
作为 Crawlab 的作者,不想王婆卖瓜,自卖自夸,作者仅仅希望将最好的技能选型推举给开拓者,让开发者根据自身的需求来决定该利用哪种爬虫管理平台。
爬虫管理平台 Crawlab 先容
简介
Crawlab 是基于 Golang 的分布式爬虫管理平台,支持 Python、NodeJS、Java、Go、PHP 等多种编程措辞以及多种爬虫框架。
Crawlab 自今年三月份上线以来受到爬虫爱好者们和开拓者们的好评,不少利用者还表示会用 Crawlab 搭建公司的爬虫平台。经由近数月的迭代,Crawlab 陆续上线了定时任务、数据剖析、网站信息、可配置爬虫、自动提取字段、下载结果、上传爬虫等功能,将平台变得得更加实用,更加全面,能够真正帮助用户办理爬虫管理困难的问题。如今在 Github 上有近 1k 的 star,干系社区(微信群、微信公众号)也建立起来,四分之一的用户表示已经将 Crawlab 运用于企业爬虫管理。可以看出,Crawlab 是受开拓者们关注和喜好的。
办理问题
Crawlab 紧张办理的是大量爬虫管理困难的问题,例如须要监控上百个网站的参杂 scrapy 和 selenium 的项目不随意马虎做到同时管理,而且命令行管理的本钱非常高,还随意马虎出错。Crawlab 支持任何措辞和任何框架,合营任务调度、任务监控,很随意马虎做到对成规模的爬虫项目进行有效监控管理。
界面及利用
下面是 Crawlab 爬虫列表页面的截图。
用户只须要将爬虫上传到 Crawlab,配置实行命令,点击“运行”按钮,就可以实行爬虫任务了。爬虫任务可以在任何节点上运行。从上图可以看到,Crawlab 有节点管理、爬虫管理、任务管理、定时任务、用户管理等模块。
整体架构
以下是 Crawlab 的整体架构图,由五大部分组成:
主节点(Master Node):负任务务派发、API、支配爬虫等;事情节点(Worker Node):卖力实行爬虫任务;MongoDB 数据库:存储节点、爬虫、任务等日常运行数据;Redis 数据库:储存任务行列步队、节点心跳等信息。前端客户端:Vue 运用,卖力前端交互和向后端要求数据。关于 Crawlab 如何利用和详细事理超出了本篇文章的范围,感兴趣的可以去参考Github 主页或干系文档。
Github地址及Demo
查看演示 DemoGithub: github.com/tikazyq/cra…利用 Docker 支配安装 Crawlab
Docker 镜像
Docker 是支配 Crawlab 最方便和简洁的办法。其他支配办法包括直接支配,不过对付想快速搭建平台的开拓者来说不推举。Crawlab 已在Dockerhub上注册了干系的镜像,开拓者仅须要实行docker pull tikazyq/crawlab命令就可以将 Crawlab 的镜像下载下来。
读者可以去 Dockerhub 上查看 Crawlab 的镜像,只有仅不到 300Mb。地址:hub.docker.com/r/tikazyq/c…
安装 Docker
要利用 Docker 来支配 Crawlab,您首先得担保 Docker 已经安装好。请参考以下文档来安装。
操作系统 文档 Mac docs.docker.com/docker-for-… Windows docs.docker.com/docker-for-… Ubuntu docs.docker.com/install/lin… Debian docs.docker.com/install/lin… CentOS docs.docker.com/install/lin… Fedora docs.docker.com/install/lin… 其他 Linux 发行版 docs.docker.com/install/lin… 安装 Docker Compose
Docker Compose 是大略的运行 Docker 集群的工具,非常轻量级,我们将用到 Docker Compose 来一键支配 Crawlab。
Docker 的官方网站已经有如何安装 Docker Compose 的教程,点击链接查看。这里大略先容一下。
操作系统 安装步骤 Mac Docker Desktop for Mac 或 Docker Toolbox 自带,不用单独安装 Windows Docker Desktop for Windows 或 Docker Toolbox 自带,不用单独安装 Linux 参考表格下面的命令 其他选择 通过pip安装,pip install docker-compose,如果没有virtualenv,须要用sudo Linux 用户请用以下命令安装。
# 下载 docker-composesudo curl -L \公众https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)\公众 -o /usr/local/bin/docker-compose`# 将 docker-compose 变成实行文件sudo chmod +x /usr/local/bin/docker-compose复制代码
拉取镜像
在拉取镜像之前,您须要配置一下镜像源。由于在海内,利用原有的镜像源速率不是很快,须要利用 DockerHub 在海内的加速器。请创建/etc/docker/daemon.json文件,输入如下内容。
{ \"大众registry-mirrors\公众: [\"大众https://registry.docker-cn.com\"大众]}复制代码
然后拉取镜像,就会快很多了。当然,您也可以用其他镜像源,可以网上去搜索一下。实行以下命令将 Crawlab 镜像拉取下来。
docker pull tikazyq/crawlab:latest复制代码
下图为拉取镜像时的命令行界面。
启动 Crawlab
我们将用 Docker Compose 启动 Crawlab 以及其依赖的数据库 MongoDB 和 Redis。首先我们须要修正一下 Docker Compose 的 yaml 配置文件docker-compose.yml。这个配置文件定义了须要启动的容器做事(Container Services)以及网络配置(Network Configuration)。这里我们用 Crawlab 自带的docker-compose.yml。
version: '3.3' # Docker Compose 的版本号(请看后续解释)services: # 做事 master: # 做事名称 image: tikazyq/crawlab:latest # 做事对应的镜像名称 container_name: master # 做事对应的容器名称 environment: # 这里定义传入的环境变量 CRAWLAB_API_ADDRESS: \"大众localhost:8000\"大众 # 前端调用的 API 地址,默认为 localhost:8000 CRAWLAB_SERVER_MASTER: \公众Y\"大众 # 是否为主节点,Y/N CRAWLAB_MONGO_HOST: \"大众mongo\公众 # MongoDB host,由于在 Docker Compose 里,可以引用做事名称 CRAWLAB_REDIS_ADDRESS: \"大众redis\"大众 # Redis host,由于在 Docker Compose 里,可以引用做事名称 ports: # 映射的端口 - \公众8080:8080\"大众 # 前端端口 - \"大众8000:8000\"大众 # 后端端口 depends_on: # 依赖的做事 - mongo # MongoDB - redis # Redis worker: # 事情节点,与主节点配置类似,不重复写了 image: tikazyq/crawlab:latest container_name: worker environment: CRAWLAB_SERVER_MASTER: \"大众N\公众 CRAWLAB_MONGO_HOST: \"大众mongo\"大众 CRAWLAB_REDIS_ADDRESS: \"大众redis\"大众 depends_on: - mongo - redis mongo: # MongoDB 做事名称 image: mongo:latest # MongoDB 镜像名称 restart: always # 重启策略为“总是” ports: # 映射端口 - \公众27017:27017\"大众 redis: # Redis 做事名称 image: redis:latest # Redis 镜像名称 restart: always # 重启策略为“总是” ports: # 映射端口 - \公众6379:6379\公众复制代码
读者可以根据自己的哀求来配置docker-compose.yml。尤其须要把稳CRAWLAB_API_ADDRESS这个环境变量,很多初学利用者都是由于该变量配置禁绝确而导致无法上岸。大多数情形,您不用做任何配置变动。请参考Q&A来处理常见问题,以及详细的环境变量配置文档来帮助根据自身环境配置 Crawlab。
然后,运行下列命令启动 Crawlab。可以加一个-d参数让 Docker Compose 后台运行。
docker-compose up复制代码
运行上述命令后,Docker Compose 会去拉取 MongoDB 和 Redis 的镜像,这可能会花几分钟韶光。拉取完毕后,四个做事会依次启动,您将会在命令行中看到如下内容。
正常情形下,您该当可以看到四个做事都启动成功,并能够顺利打印日志。如果启动不堪利,请微信联系作者(tikazyq1)或在 Github 上提 Issue。
如果您是在本机上启动的 Docker Compose,可以在浏览器中输入http://localhost:8080,然后就能看到上岸界面了;如果您是在其他机器上启动的 Docker Compose,您须要在浏览器中输入http://<your_ip>:8080来看到上岸界面,<your_ip>是其他机器的 IP 地址(请担保 8080 端口在该机器已对外开放)。
初始上岸用户名密码是 admin/admin,您可以利用这个用户名密码来上岸。如果您的环境变量CRAWLAB_API_ADDRESS设置得禁绝确,您可能会看到点击上岸后上岸按钮会一贯转圈而没有任何提示。这时请重新在docker-compose.yml中设置精确的CRAWLAB_API_ADDRESS(将localhost更换为<your_ip>),重新启动docker-compose up。然后在浏览器中输入http://<your_ip>:8080。
上岸之后您将看到 Crawlab 的主页。
本篇文章紧张先容如何搭建爬虫管理平台 Crawlab,因此不会详细先容如何利用 Crawlab(可能会创建另一篇文章来详细先容,有兴趣者可以关注一下)。如果您有困惑,请查看干系文档来理解如何利用。同时,您也可以加作者微信(tikazyq1)并注明 Crawlab,作者将将您拉入谈论群,您可以在那里答疑解惑。
如何将 Scrapy 等爬虫集成到 Crawlab
众所周知,Scrapy 是非常受欢迎的爬虫框架,其灵巧的框架设计、高并发、易用性以及可扩展性让很多开拓者和企业大量采取。市情上的爬虫管理平台险些都支持 Scrapy 爬虫,Crawlab 也不例外,但 Crawlab 可以运行 puppeteer、selenium 等其他爬虫。下面将先容一下在 Crawlab 中如何运行 scrapy 爬虫。
Crawlab 是实行爬虫基本事理
Crawlab 实行爬虫的事理很大略,实在便是一个 shell 命令。用户在爬虫中输入实行爬虫的 shell 命令,例如scrapy crawl some_spider,Crawlab 实行器会读取这个命令,并在 shell 中直接实行。因此,每一次运行爬虫任务,便是实行了一次 shell 命令(当然,实际情形要比这个繁芜很多,感兴趣的可以去参考官方文档)。Crawlab 是支持展示和导出爬虫结果的,不过这须要轻微多做一些事情。
编写 Pipeline
要集成 scrapy 爬虫,无非便是将爬虫抓取的数据存到 Crawlab 的数据库里,然后用任务 ID 关联起来。每次实行爬虫任务,任务 ID 会通过环境变量传到爬虫程序中,因此我们须要做的便是将任务 ID 加上结果存到数据库里(Crawlab 现在只支持 MongoDB,后期会开拓 MySQL、SQL Server、Postgres 等关系型数据库,有需求的用户可以关注一下)。
在 Scrapy 中,我们须要编写储存逻辑。示意代码如下:
# 引入干系的库,pymongo 是标准连接 MongoDB 的库import osfrom pymongo import MongoClient# MongoDB 配置参数MONGO_HOST = '192.168.99.100'MONGO_PORT = 27017MONGO_DB = 'crawlab_test'class JuejinPipeline(object): mongo = MongoClient(host=MONGO_HOST, port=MONGO_PORT) # mongo 连接实例 db = mongo[MONGO_DB] # 数据库实例 col_name = os.environ.get('CRAWLAB_COLLECTION') # 凑集名称,通过环境变量 CRAWLAB_COLLECTION 传过来# 如果 CRAWLAB_COLLECTION 不存在,则默认凑集名称为 test if not col_name: col_name = 'test' col = db[col_name] # 凑集实例# 每一个传入 item 会调用的函数,参数分别为 item 和 spider def process_item(self, item, spider): item['task_id'] = os.environ.get('CRAWLAB_TASK_ID') # 将 task_id 设置为环境变量传过来的任务 ID self.col.save(item) # 保存 item 在数据库中 return item复制代码
同时,您也须要在items.py中加入task_id字段,已担保值能够被赋上(这很主要)。
上传并配置爬虫
在运行爬虫之前,您须要上传爬虫文件到主节点。步骤如下:
将爬虫文件打包成 zip(把稳,要担保在根目录下直接打包);在侧边栏点击“爬虫”导航至爬虫列表,点击“添加爬虫”按钮,选择“自定义爬虫”;点击“上传”按钮,选择刚刚打包好的 zip 文件上传成功后,爬虫列表中会涌现新添加的自定义爬虫,这样就算上传成功了。可以在爬虫详情中点击“文件”标签,选择一个文件,可以在文件中编辑代码。
接下来,您须要在“概览”标签中的“实行命令”一栏输入爬虫的 shell 实行命令。Crawlab 的 Docker 镜像里是内置了 scrapy 的,因此可以直接运行 scrapy 爬虫。命令便是scrapy crawl <some_spider>。点击“保存”按钮保存爬虫配置。运行爬虫任务
然后便是运行爬虫任务了。实在很大略,在“概览”标签中点击“运行”按钮,爬虫任务就开始运行了。如果日志提示找不到 scrapy 命令,可以将scrapy改为绝对路径/usr/local/bin/scrapy,这样就会运行成功。
任务运行情形会在“任务”页面或者爬虫“概览”里展现,会每 5 秒钟更新一次,大家可以在这上面查看。而且在爬虫“结果”标签里,可以预览结果的详情,还可以导出数据成 CSV 文件。
构建持续集成(CI)事情流
对付企业来说,软件开拓一样平常是一个自动化过程。它会经历需求、开拓、支配、测试、上线这几个步骤。而这个流程一样平常是不断迭代(Iterative)的,须要不断更新和发布。
以爬虫为例,您上线了一个爬虫,这个爬虫会定期抓取网站数据。但溘然有一天您创造数据抓不到了,您快速定位缘故原由,创造原来是网站改版了,您须要变动爬虫抓取规则来应对网站的改版。总之,您须要发布一个代码更新。最快的做法是直接在线上变动代码。但这样做非常危险:第一,您无法测试您更新后的代码,只能通过不断调度线上代码来测试是否抓取成功;第二,您无法记录这次变动,后期如果出了问题您很可能会忽略掉这次变动,从而导致 bug。您须要做的,无非是将您的爬虫代码用版本管理工具管理起来。我们有很多版本管理工具,最常用的便是 git、subversion,版本管理平台包括 Gitlab、Bitbucket、自搭 Git 仓库等。
当我们更新了代码,我们须要将更新后的代码发布到线上做事器。这时您须要用自己写支配脚本,或者更方便的,用 Jenkins 作为持续集成(Continuous Integration)管理平台。Jenkins 是一个持续集成平台,可以通过获取版本库来更新支配代码,是非常实用的工具,在很多企业中都有用到。下图是如何将 Crawlab 爬虫运用到持续集成事情流程中的例子。
要在 Crawlab 中创建或更新爬虫有两种办法:
上传打包成后的 zip 文件;通过变动主节点中目录CRAWLAB_SPIDER_PATH中的爬虫文件。我们做持续集成,便是针对第二种办法。步骤如下:
用 Gitlab 或其他平台搭建好代码仓库;在 Jenkins 中创建一个项目,在项目中将代码源指向之前创建的仓库;在 Jenkins 项目中编写事情流,将发布地址指向 Crawlab 的CRAWLAB_SPIDER_PATH,如果是 Docker 把稳将该地址挂载到宿主机文件系统;Jenkins 项目的事情可以直接编写,也可以用 Jenkinsfile,详细可以查干系资料;这样,每一次代码更新提交到代码仓库后,Jenkins 就会将更新后的代码发布到 Crawlab 里,Crawlab 主节点会将爬虫代码同步到事情节点,以待抓取。