写在前面:本文内容丰富,涉及面广。读完大约需要20分钟。请耐心阅读。现在大多数企业都离不开爬虫,爬虫是一种获取数据的有效方式。但是,对爬虫有大规模需求的公司或个人,需要同时应对不同类型的爬虫,这会凭空增加很多额外的管理成本。同时,爬虫管理员还需要处理网站内容变更、持续增量爬取、任务失败等问题。因此,一个成熟的爬虫管理流程应该包括一个能够有效处理上述问题的管理系统。爬虫有多重要?对于搜索引擎来说,爬虫是必不可少的;对于舆情公司来说,爬虫是基础;对于NLP,爬虫可以获得语料库;对于初创公司,爬虫可以获得初始内容。但是爬虫技术是复杂的,不同类型的爬虫场景会用到不同的技术。比如一个简单的静态页面,可以直接用HTTP请求+HTML解析器处理;动态页面需要使用自动化测试工具,如Puppeteer或Selenium;有反爬虫的网站需要使用代理、编码等技术;等等。那么这个时候就需要一个成熟的爬虫管理平台来帮助企业或者个人应对海量的爬虫类目。了解什么是爬虫管理平台定义爬虫管理平台是集爬虫部署、任务调度、任务监控、结果展示等模块于一体的一站式管理系统,通常配备可视化UI界面,可访问通过网页交互的UI界面有效管理爬虫。爬虫管理平台一般支持分布式,可以多机协同运行。当然,上面的定义是狭义的,通常是针对技术人员或者开发人员或者技术管理人员。企业一般会开发自己的内部爬虫管理系统,以应对复杂的爬虫管理需求。这样的系统就是上面定义的狭义的爬虫管理平台。广义爬虫管理平台什么是广义爬虫管理平台?你可能听说过Archer(后来变身后羿收藏家)和Octopus。前者基于云服务,可以在线编写、运行和监控爬虫,最接近广义爬虫平台中狭义的爬虫管理平台;后者是一款流行的商业爬虫爬虫,允许新手用户拖拽编写,运行爬虫,导出数据。大家可能也见过各种API聚合服务商,比如聚合数据,就是一个可以直接调用网站接口获取数据的平台。这其实是爬虫平台的一个变种,只是帮助你完成爬虫的编写。过程。其间,有一家名为Kimonolab的国外公司,开发了一款名为Kimono的Chrome插件,可以让用户直观地点击页面上的元素并生成抓取规则,并显示在其网站上。生成一个爬虫程序,用户提交任务,后台可以自动抓取网站数据。Kimono是一款很棒的爬虫应用,可惜Kimonolab已经被大数据公司Plantir收购,目前无法体验。本文主要关注狭义的爬虫管理平台,所以后面提到的爬虫管理平台都是指狭义的定义。爬虫管理平台模块以下是一个典型的爬虫管理平台涉及的模块。爬虫管理平台架构一个典型的爬虫管理平台的模块主要包括以下内容:任务管理:如何执行和调度爬虫抓取任务,以及如何监控任务,包括日志监控等;爬虫管理:包括爬虫部署,即将开发的爬虫部署(打包或复制)到相应节点,以及爬虫配置和版本管理;节点管理:包括节点(服务器/机器)的注册和监控、节点间的通信、如何监控节点性能等;前端应用程序:由用户可以与之交互以与后台应用程序通信的可视化UI界面组成。当然,有些爬虫管理平台可能不止这些模块,还可能包括其他更实用的功能,比如可配置的爬虫规则、可视化配置的爬虫规则、代理池、cookie池、异常监控等等。为什么需要爬虫管理平台有了爬虫管理平台,开发者,尤其是爬虫工程师,可以方便的添加爬虫,执行任务,查看结果,无需在命令行之间来回切换,非常容易出错。一个常见的场景是爬虫工程师最初使用scrapy和crontab来管理爬虫任务。他要仔细选择定时任务的时间间隔,以免服务器CPU或内存被占满;比较棘手的问题是,他还需要将scrapy产生的日志保存在一个文件中。爬虫一旦出错,就得用shell命令一条一条查看日志,定位错误原因。严重的需要一整天;还有一个比较严重的问题,一个爬虫工程师可能会发现公司的业务量越来越大,他需要写几百个爬虫来满足公司的业务需求,而用scrapy和crontab来管理简直就是一场噩梦。可怜的爬虫工程师其实可以选择一个合适的爬虫管理平台来解决他的问题。如何选择合适的爬虫管理平台当你愿意解决上面提到的爬虫工程师遇到的棘手问题,并且想转而选择合适的爬虫管理平台时。你应该回答的第一个问题是:我们需要从头开始(Startfromscratch)开发一个系统吗?要回答这个问题,首先要回答以下问题:我们的需求是否复杂到需要完全定制开发一个新系统(比如需要复杂的权限管理)?我们的团队是否有足够的技术实力来开发这个系统(比如经验丰富的前后端开发工程师)?我们的时间资源是否足够我们开发这个系统(比如项目规划周期是一年)?如果以上三个问题中的任何一个的答案是“否”,您应该考虑使用市面上现有的开源爬虫管理平台来满足您的需求。以下是市面上现有的开源爬虫管理平台:总的来说,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自今年3月上线以来,受到了爬虫爱好者和开发者的一致好评。也有不少用户表示会使用Crawlab搭建公司的爬虫平台。经过几个月的迭代,Crawlab陆续上线了定时任务、数据分析、网站信息、可配置爬虫、自动字段提取、下载结果、上传爬虫等功能,让平台更加实用全面,真正能够帮助解决用户爬虫管理难的问题。现在Github上有近1kstar,相关社区也已经建立。四分之一的用户表示他们已经将Crawlab应用于企业爬虫管理。可见Crawlab受到开发者的关注和喜欢。解决问题Crawlab主要解决爬虫数量多管理难的问题。比如需要同时监控上百个网站的scrapy和selenium混合项目,管理起来并不容易,而且命令行管理的成本非常高,而且容易出错。Crawlab支持任何语言和任何框架。配合任务调度和任务监控,轻松有效监控和管理大型爬虫项目。界面及使用下面是Crawlab的爬虫列表页面截图。Crawlab爬虫列表用户只需将爬虫上传到Crawlab,配置执行命令,点击“运行”按钮即可执行爬虫任务。爬虫任务可以在任何节点上运行。从上图可以看出,Crawlab有节点管理、爬虫管理、任务管理、定时任务、用户管理等模块。整体架构下面是Crawlab的整体架构图,由五部分组成:MasterNode:负责任务分发、API、爬虫的部署等;WorkerNode:负责执行爬虫任务;MongoDB数据库:存储节点、爬虫、任务等日常运行数据;Redis数据库:存储任务消息队列、节点心跳等信息。前端客户端:Vue应用,负责前端交互,向后端请求数据。Crawlab架构Crawlab的使用方法和详细原理不在本文讨论范围之内。有兴趣的可以参考Github主页或相关文档。Github地址和Demo查看DemoDemoGithub:https://github.com/tikazyq/cr...使用Docker部署安装CrawlabDocker镜像Docker是部署Crawlab最方便简洁的方式。其他部署方式包括直接部署,但不推荐希望快速搭建平台的开发者使用。Crawlab已经在Dockerhub上注册了相关镜像。开发者只需要执行dockerpulltikazyq/crawlab命令即可下载Crawlab的镜像。读者可以去Dockerhub查看Crawlab的镜像,只有不到300Mb。地址:https://hub.docker.com/r/tika...Dockerhub页面安装Docker要使用Docker部署Crawlab,首先要确保已经安装了Docker。请参考以下文档进行安装。安装Docker组合。DockerCompose是一个用于运行Docker集群的简单工具。它非常轻巧。我们将使用DockerCompose一键部署Crawlab。Docker官网已经有DockerCompose安装教程,点击链接查看。这里简单介绍一下。Linux用户请使用以下命令安装。下载docker-composesudocurl-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变成可执行文件sudochmod+x/usr/local/bin/docker-composepullimage拉取镜像前,需要配置镜像源。因为在国内,使用原始镜像源的速度不是很快,需要DockerHub的国产加速器。请创建/etc/docker/daemon.json文件并输入以下内容。{"registry-mirrors":["https://registry.docker-cn.com"]}然后拉取镜像,会快很多。当然你也可以使用其他的镜像源,你可以上网搜索。执行以下命令拉取Crawlab镜像。dockerpulltikazyq/crawlab:latest下图是拉取镜像时的命令行界面。dockerpull启动Crawlab我们将使用DockerCompose启动Crawlab及其依赖的数据库MongoDB和Redis。首先,我们需要修改DockerCompose的yaml配置文件docker-compose.yml。这个配置文件定义了需要启动的容器服务(ContainerServices)和网络配置(NetworkConfiguration)。这里我们使用Crawlab自带的docker-compose.yml。version:'3.3'#DockerCompose的版本号(请看后续说明)services:#servicemaster:#服务名称image:tikazyq/crawlab:latest#服务对应的镜像名称container_name:master#服务环境对应的容器名称:#定义传入的环境变量CRAWLAB_API_ADDRESS:"localhost:8000"#前端调用的API地址,默认为localhost:8000CRAWLAB_SERVER_MASTER:"Y"#是否为主节点,Y/NCRAWLAB_MONGO_HOST:"mongo"#MongoDB主机,因为在DockerCompose中,可以参考服务名CRAWLAB_REDIS_ADDRESS:"redis"#Redis主机,因为在DockerCompose中,可以参考服务名ports:#映射端口-"8080:8080"#前端端口-"8000:8000"#后端端口depends_on:#依赖服务-mongo#MongoDB-redis#Redisworker:#Worker节点,类似master节点配置,不重复image:tikazyq/crawlab:latestcontainer_name:工人nvironment:CRAWLAB_SERVER_MASTER:"N"CRAWLAB_MONGO_HOST:"mongo"CRAWLAB_REDIS_ADDRESS:"redis"depends_on:-mongo-redismongo:#MongoDB服务名image:mongo:latest#MongoDB镜像名restart:always#重启策略是"always"ports:#映射端口-"27017:27017"redis:#Redis服务名image:redis:latest#Redis镜像名restart:always#重启策略为"always"ports:#映射端口-"6379:6379"读者可以根据自己的需求配置docker-compose.yml。特别要注意环境变量CRAWLAB_API_ADDRESS,很多新手用户就是因为这个变量配置不正确导致无法登录大部分情况下,你不需要做任何配置改动,常见问题请参考Q&A,详细的环境变量配置文档帮助你根据自己的环境配置Crawlab,然后运行如下命令启动Crawlab,可以加一个-d参数,让DockerCompose在后台运行。完成后,四个服务会依次启动,运行命令可以看到一行中有如下内容,正常docker-compose下,应该可以看到四个服务都启动了e成功启动,可以顺利打印日志。如果在本机启动DockerCompose,在浏览器中输入http://localhost:8080,即可看到登录界面;如果在另一台机器上启动DockerCompose,需要在浏览器中输入http://
