网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览互联网的网络机器人。根据实际情况,爬虫本身也有窄义和范义的解释,从小范围来说,爬虫只是为了自动化获取网络上的数据,从广泛意义来说,爬虫也是自动化的一部分,自动化操作页面元素,不仅可以获取数据,还可以执行一些业务,所以单论爬虫来说,是个有技术含量的事情,并不想大家想象中那么Low。
爬虫可以实现的能力并不少,大致如下:
搜索引擎:网络搜索引擎等站点通过爬虫软件更新自身的网站内容或其对其他网站的索引。网络爬虫可以将自己所访问的页面保存下来,以便搜索引擎事后生成索引供用户搜索。
数据采集:通过获取页面内数据,并结构化存储,可以应用到多种行业或者具体业务中。泛用度之高,可能超过一些人的想象,比如大学生论文分析所需要的数据可以用爬虫获取公开网站数据、一个管理很多个自媒体号的大V可以通过爬虫快速获取自己的数据,也可以监测其他对手的数据、互联网舆情公司大范围采集数据、广告营销公司监测和分析广告传播等等。
自动化页面操作:通过web driver可以操作网页里的元素,可以执行很多事情,比如抢单、刷帖、薅羊毛、抢票等等。也可以通过页面操作方式实现很多RPA系统的功能,让工作流程更加自动化。
但是,以上都只是爬虫系统,尤其是偏采集部分得情况,实际上一个完整的爬虫系统涵盖了多个子系统,这样才能形成一个完整的架构体系,缺少任何一个部分,也许系统可用,但是完整度和延展性都会降低很多。
上图是网上很常见的Scrapy的架构,它实现了一个通用型爬虫的基本架构,是初中级爬虫选手常用的开源代码,高级选手一般会深入改造,或者优化某些流程以更符合公司业务流,又或者整体延展,使之成为一个更泛用且更接地气的爬虫架构。
接下来我从各部分阐述一个通用型爬虫架构的疑难点。
1,数据源
目前基于互联网的数据源可分为
网页(HTML、XML、WAP、H5等)
API接口(Json等)
手机APP
文件
也按内容类型细分为新闻网站、商业网站、政府网站、教育网站、微信公众号、微博号、电子报、自媒体、电商网站、问答网站、百科网站、论坛、下载资源站、社交APP、新闻APP、短视频、视频网站、境外媒体等等。
从本质上来说采集就是获取上面的数据,但是不同数据源可获取的数据字段、类型、价值都不一样,所以采集的过程中,就不可避免地要清洗数据并且结构化,这也是为什么我总说爬虫不是单一系统的原因。
2,通用型爬虫整体架构
为了实现对上述数据源的通用采集,就需要考虑到各种情况以及应对方式,所以架构中要包含多个模块并联动起来。一般需要包含以下模块:
硬件资源管理和调度模块,包括监测CPU负载、内存占用、带宽占用等,并最大化利用系统资源;
采集节点资源的统一管理模块,采集节点手动/自动扩充,节点自动配置,节点自动释放等动态管理方法,除了算法配置以外,也需要提供运营、运维人员可以快速配置的页面;
采集数据源整体管理模块,一般采集源会分为入口、列表页、详情页、接口、唯一ID、名称和别名、采集权重、标签等。一般技术人员接触不到太多种类的采集需求,开发系统架构的时候在这里就不会做太多工作,但是考虑到产品化以及后期运营管理的角度,需要考虑到尽可能多的维度,例如网站的名称可能重复并且可能是多个、网站可能是多个根域名甚至是多个二级、三级域名,采集APP的时候可能是用包名作为唯一ID,采集接口的时候调用方法也和采集HTML页面完全不一样,调度以及配置的时候都需要区分。此外,还有网站首页、频道首页、特定区域、头条区域等等需要在管理系统中作区分的部分;
智能调度模块,实际采集工作中我们会遇到很多种情况,比如某条链路就是无法良好访问某个数据源、有的数据源不需要登录,可以很快,有的却需要模拟登陆或者调用无头浏览器渲染页面等、有的页面更新很慢,没必要高频采集、有的页面临时会因为某个事件快速发文,此时采集权重就必须动态调整,需要做多种策略应对,但是本质并不变,一是通过AI技术预测发文频率(积累到一定水平,可以精确到秒级,因为编辑的发文是有规律的,可以训练模型预测),二是通过算法回归验证并调整;
IP和链路管理模块:由于大部分网站都有一定的反爬虫应对策略,所以IP代理池是基础,一般都会免费+付费结合,用打分机制来评判代理IP的可用性,并允许制定轮询、轮播策略来最大化利用低价值的可弃用IP以及高价值的固定IP资源。链路管理主要是应对国内、国外、南北或局部地区区域化网络连接慢或者不通导致的访问困难,不同采集源主机所在地域也不同,所以尽可能用最快速的链路访问;
模拟登陆模块:模拟登陆方式有很多种,除了必须要技术人员分析和配置的方法以外,还可以通过浏览器载入时的JS调用策略,采用局部渲染或传参等方法实现目标数的获取,而不用全局渲染或整个页面渲染,这样会降低资源消耗;
验证码管理模块:由于验证码的复杂度已经越来越高了,一般需要多种策略并行解决这个问题。首先验证码有文字、数字、滑动、翻转、图像含义等多种,而且干扰方式越来越随机化,导致训练一个验证码识别模型越来越费劲了,所以根据不同的验证方法,要么接入网络上的打码平台,要么自己安排兼职人员处理弹出的验证码识别界面;
Cookies管理模块:通过自动+人工判断和分析,自动适配网站的cookies池并管理,分析cookies失效策略,最大化利用并降低目标站点反爬机制触发可能性;
采集源自动解析模块:自动解析包括识别列表页、详情页等,自动分析网站整体结构并通过算法标注频道标签、文章类型等等。如果是API,其实在技术人员初步配置以后,也可以自动解析并分析参数和返回结果的情况来识别列表URL和详情URL,无法完全替代人工但是可以大幅度降低人工;
采集页面自动配置模块:这部分是很多高端数据采集公司和低端公司的分水岭,我这里卖个关子,不说太多。大体来说就是不要从单一维度来进行模型训练,自动解析并不是单一算法,而是综合解决的,字符串距离、xml节点位置、机器视觉特征、文本语义特征等等都可以;
数据清洗模块:首先HTML标签清洗是基础的,此外还有图片、组图的格式化,视频的格式化,如果有必要还要支持对象存储的上传和替换链接。此外,广告内容的清洗以及客户不感兴趣的数据的过滤,都需要考虑在内,除了自动化清洗以外,还要支持黑白名单,并且允许设置到具体客户或应用;
清洗后的存储部分就不做阐述了,冷热数据以及ES的搭配组合根据数据量级的不同,会有很大变化。
至此,一个通用型爬虫架构才算较为完整,里面会用到多种分布式技术以及深度学习技术、NLP语义分析技术。多年数据采集和大数据领域工作深耕,才让我这个产品出身的人才能逐渐理解爬虫技术之美,与君共勉。
2019年最后一天,祝各位元旦快乐!2020年万事如意!NO DEBUG!
个人网站:http://www.bizworld.com.cn/