作者归档:admin

研发管理之基于代码的研发效能度量

在研发管理中,如何准确评估研发人员的效能一直以来都是一个挑战。传统的评估方式大多依赖于观察软性技能的表现,如问题的跟进实时性、反馈的有效性、推动事情的能力,以及解决技术问题的能力。然而,对于研发人员而言,他们的代码质量和效率往往是最直接、最硬性的评价标准。而代码很多时候是看不到的,特别是当团队规模到达一定数量的时候。

代码的质量和开发效率是研发同学工作的核心。好的代码不仅要能完成预设的任务,也要易于理解、修改和测试,以便其他开发者在未来能够维护和改进。代码的质量和开发效率可以直接反映开发人员的技术能力和专业知识。因此对于一个研发管理者来说,要想掌控一个团队的情况,从代码出发,从代码量和代码质量来度量是一个不可或缺的角度。

为何要度量代码?

代码是软件产品的基础,深入理解代码可以帮助我们更好地了解产品的健康状况、性能状况和维护情况。更重要的是,通过深入分析代码,我们可以发现代码中可能存在的问题和改进点,以便提前发现并解决问题,降低项目风险。基于代码的研发效能度量为我们提供了一个量化、可度量的评估标准,从而使我们能够更科学、更有效地管理和优化研发过程和研发分工。

基于代码的度量是什么?

基于代码的研发效能度量是一种通过对代码及代码提交进行深入分析和理解,从中洞察出可能存在的问题和改进点,以提高研发效率和产品质量的方法。这涉及到代码质量分析、代码性能分析、代码测试分析、代码维护性分析以及技术债务分析等多个方面。

从实际落地来说,基于代码的研发效能度量通常涉及到以下几个方面:

  1. 代码质量:这是衡量代码健康状况的重要指标。

    • 代码复杂度:例如,使用圈复杂度(Cyclomatic Complexity)或 Halstead 复杂度(Halstead Complexity)度量代码的逻辑复杂度。
    • 代码规范性:如代码是否遵循了 PEP 8(Python编程规范)或其他语言的编程规范。
    • 代码重复率:如通过工具(如 SonarQube 或 PMD )检测代码的重复部分,计算代码重复率。
    • 用例覆盖率:如使用工具(如 JUnit 和 Cobertura )运行单元测试和集成测试,计算用例覆盖率。
    • 注释覆盖率:SonarQube 等工具可以分析出代码覆盖度
  2. 开发活动:这是了解开发团队工作模式的重要度量。

    • 提交频率:如通过 Github 或其他版本控制系统统计每个开发人员的提交频率。
    • 代码修改频率:如统计某段代码或某个文件被修改的频率,以理解代码的稳定性。
  3. 问题和缺陷:这是评估代码质量问题和风险的关键度量。

    • 缺陷密度:例如,通过错误跟踪系统(如Jira或Bugzilla)统计缺陷数量,然后除以代码行数,计算缺陷密度。
    • 问题解决时间:例如,统计从发现问题到解决问题的平均时间,了解团队的响应效率。

以上就是基于代码的研发效能洞察的主要组成部分。这些度量有助于我们理解代码的健康状况、开发过程的效率,以及代码质量的问题和风险。需要注意的是,这些度量并不能全面反映研发效能,还需要结合具体的项目情况和团队情况进行分析。

基于代码的研发效能度量如何实施

将以上的这些组成部分、时间、人、项目、团队这些结合起来就是一个基本完整的基于代码的研发效能分析系统。

做基于代码的研发效能洞察无非是回答如下的 2 类问题:

  1. 做了什么,做了多少
    • 你的团队做了什么,做了多少
    • 你的团队成员做了什么,做了多少
    • 每个成员在团队中的水平处于什么样的水平,有没有特别突出的(多或少)
  2. 做得怎么样
    • 你的团队的代码质量如何
    • 有没有比较突出(好或坏)的成员
    • 有没有共性的质量问题

要想回答这些问题,基于代码层面,通过代码度量研发的研发效能,影响力产出,代码质量等,拿到客观的数据度量到人、团队、项目。

我们做代码的洞察实施简化后可以有 4 步:

1.引入工具或系统:将代码这个盒子打开,看到度量后的数据。这里当然会有一个问题分析、行业方案对比的过程。

  1. 机制化跟进:需要有一个组织来承接事项,无组织即无成果。结合管理人员的机制化跟进,根据度量的数据和系统的指标,以某个时间间隔来做洞察,发现问题。
  2. 整体洞察:从下往上,形成整体效能的洞察,根据发现的问题,明确代码产出的问题点和能衡量状态的指标。
  3. 复盘:以 3 个月以一个区间来盘点指标和问题,清晰团队/项目的变化。

基于代码的研发效能度量的优势与挑战

当我们引入某些工具或系统来做了基于代码的度量或洞察后,可以得到如下的一些东西:

  1. 全面的代码质量管理:通常能够全面地对代码质量进行管理,包括代码质量分析、代码审查等。
  2. 技术债务管理:通常提供了一种有效的方式来管理技术债务。
  3. 提高团队效率:通过对代码的持续分析和审查,可以帮助团队提高效率,减少错误和问题。
  4. 提供具有洞察力的数据和报告:通常能够提供具有洞察力的数据和报告,帮助团队更好地理解代码质量和研发效能。

以上是一些好的方面,但是也有一些不好的点:

  1. 需要一定的学习和适应:对于新的系统和工具,团队成员可能需要一段时间来学习和适应。
  2. 可能存在一定的成本:这类系统通常需要付费使用,这可能会增加公司的开支。
  3. 可能与现有的流程和工具不兼容:如果团队已经有了自己的流程和工具,那么使用新的系统可能会导致一些兼容性问题。
  4. 安全或隐私问题:如果系统是基于云的服务,这意味着代码需要上传到外部服务器进行分析。这可能会引发一些安全和隐私问题。一般我们选择通过私有化部署来解决,但是成本会更高一些。

最后,随着时间的推移,可能会出现「面向指标编程」的情况。这通常发生在过度重视某些度量标准并以此作为主要驱动开发的团队或组织中。这些度量标准可能包括代码行数、问题数、提交频率、测试覆盖率等。

这样可能会带来一些问题:

  1. 优化错误的指标: 有时,开发同学可能会在不影响或甚至损害总体产品质量的情况下优化这些指标。比如,如果过度关注代码行数,开发者可能会写出冗长和复杂的代码来增加代码行数。
  2. 忽视质量和实用性: 过度关注指标可能会导致开发者忽视代码质量、可读性、可维护性和实用性。例如,开发者可能编写无实际价值的测试,只是为了提高测试覆盖率。
  3. 鼓励短视行为: 如果某些指标被用作评估性能或提升的基准,开发者可能会采取短期行为来满足这些指标,而忽视了长期的技术健康状况。

为避免「面向指标编程」,作为团队的管理者应该谨慎选择和使用度量标准。应该选择那些能反映出代码质量、可维护性和实用性的指标,并且要注意平衡多个指标,避免过度优化某一个指标。同时,要培养一个开放的团队文化,鼓励开发同学关注长期的技术健康状况,而不仅仅是满足短期的指标。

研发管理之生产环境的变更管理

2017 年,Amazon S3 服务在美国东部区域发生了大规模的故障,影响了许多依赖于 S3 的服务和应用。这次故障的根本原因是维护人员在执行一个操作时,错误地将更多的服务器脱机,这超过了系统设计的冗余容量,导致了该区域S3的部分子系统开始备份,进一步扩大了故障的影响。

2018 年 10 月 31 日 GitHub 通过官方博客发布了 2018 年 10 月 21 日「挂掉」的事件分析。GitHub 指出此次事件发生的原因是在 10 月 21 日 22:52UTC 进行日常维护——更换发生故障的 100G 光学设备时导致美国东海岸网络中心与美国东海岸数据中心之间的连接断开。更具体地 GitHub 分析,虽然两地的连接在 43 秒内恢复,但这次短暂的中断引发了一系列事件,这才导致了长达 24 小时 11 分钟的服务降级。

2020 年 7 月,Cloudflare 的 DNS 服务遭受了大规模的中断,影响了许多依赖其服务的网站。该故障的原因是 Cloudflare 的路由器中的一个错误配置。

以上是在网上搜索各大平台的故障描述,可以看到这些故障都是由于生产环境的变更导致的,有些是网络设备变更,有些是配置变更,有些是维护人员在线上执行了某个操作…… 如此种种。

这些问题最终都是开发人员通过系统化的建设,一个坑一个坑的填完了,但是当我们带着一个团队急速前进时,可能来不及做这些系统化的建设,此时通过流程对生产环境的变更进行管理,快速解决或规避一些问题以控制线上故障的出现。流程能保证的是我们做事的下限

在做生产环境变更管理流程之前一定要明晰生产环境的概念和范围,在团队内达成共识,然后再去做流程,以规避因为对生产环境的概念和范围不一致,导致的误解和乌龙。

1 生产环境的概念

生产环境,也称为「产品环境」或「线上环境」,是指实际运行并对外提供服务的环境。这个环境中的软件版本、配置和数据都应该是最新的、经过充分测试的,以保证系统的稳定性和性能。线上环境需要提供24小时不间断的服务。

一个应用或环境是否属于线上环境,主要取决于它是否直接对外提供服务。例如,如果一个应用接收并处理来自最终用户的请求,那么它就是线上环境的一部分。同样,如果一个环境中的数据被用于生产服务,那么这个环境也应该被视为线上环境。

通常,生产环境包括以下 4 个部分:

  • 硬件资源:例如服务器、网络设备、云服务中的硬件部分等;
  • 软件资源:包括操作系统、数据库、中间件、云服务中的软件部分等;
  • 应用程序:实际运行的业务代码和与之相关联的部分,如 CI/CD 工具;
  • 数据:实际的用户数据和业务数据。

定义了生产环境,从生产环境衍生出生产环境的变更。

2 生产环境变更的概念和分类

生产环境的变更是指在生产环境中对任何一部分进行的修改,包括应用程序的更新、配置的修改、硬件设施的更换等。而线上故障大多来源于生产环境的变更,对生产环境的变更进行管理和控制,在较大程度上可以减少对系统稳定性产生影响。

生产环境的变更从其组成出发,再加上外部流量,可以分为 5 类:

2.1 硬件资源变更

硬件资源变更主要包含所有与物理硬件和云服务硬件配置相关的更换、升级或维护。

  • 硬件规格调整:例如,升级处理器(CPU)、扩充内存(RAM)、更换硬盘等。
  • 网络设备更新:包括替换路由器、交换机或进行固件更新等。
  • 存储设备变动:磁盘扩容、存储设备更换等场景会包含在内。
  • 云服务硬件调整:如云计算服务中服务器规格的调整、增减虚拟机实例、增减 POD 数、网络设备变更等。

2.2 软件配置变更

软件配置变更涵盖了所有与操作系统、数据库、中间件以及云服务软件设置的修改。

  • 操作系统参数调整:比如,优化操作系统性能通过调整系统参数等。
  • 数据库设置变动:例如,数据库参数调整或修改索引,导致数据库负载提升甚至锁表导致的无法读写等线上事故。
  • 中间件配置更新:如修改消息队列的设置,调整缓存策略导致缓存穿越或者缓存雪崩等线上问题时有发生。
  • 云服务软件配置调整:包括了云服务的安全规则更新、网络配置变动等。

2.3 应用程序变更

应用程序变更主要包含了所有与业务代码和将业务代码发布到生产环境的 DevOps 工具的更改。

  • 代码变更:代码变更是我们最最常见的变更类型,主要是通过修改代码改变应用程序并通过发布系统发布到生产环境。这也是我们变更管理中风险最大的地方,因为变更的人,变更的位置和逻辑等都是不确定的。除了正常的发布变更,应用的回滚也是应用变更的回滚,因为其改动了线上的应用。实际中,代码变更在逻辑上包括了修复 bug、优化性能、增加新功能等,都需要对应用程序代码进行更新。
  • 配置变更:指应用系统的配置变更,一般是通过配置系统来变更,触发线上应用的热更新或滚动,配置如果是写死在代码中,会变为代码变更。
  • 依赖库更新:实际业务中需要对应用程序所依赖的库或框架进行更新,有些更新可能需要改代码,或者代码本身已经是这么个逻辑,在构建的时候就会带出去。
  • DevOps 工具变更:例如,升级工具版本,或者对某些功能进行调整。
  • DevOps 工具配置变更:如发布脚本中对于 dev 或 prod 环境的配置修改等等,都是高风险操作,线上有着血淋淋的故障。

2.4 数据变更

数据变更很少被人当作变更处理,因为很多时候就是正常的业务操作,如管理后台的批量操作这些,但是这些批量操作如果发生在高峰时期,可能会对线上业务带来较大的影响,轻则速度变慢,重则线上事故。数据变更可以分为线上数据的清理、迁移、更新等操作。

  • 数据清理:如定期删除过期数据,清理无效数据节省成本等等,基于不同的目的,将数据清除,除了可能会影响性能,如果清理错了,将会导致用户丢失,以至用户资产的损坏,这将会是很大的线上事故。
  • 数据迁移:如将数据从一个数据库迁移到另一个数据库,或者因为业务升级,数据需要从一种逻辑迁移到另一种逻辑,除了负载压力,更多的可能是数据错乱或者数据丢失,这两种情况都会引发用户投诉。
  • 数据更新:如前面说的管理后台批量更新,或者上线新模块在已有的数据库上初始化数据等等,这种最多的情况是其引发的 DB/ES 等存储类中间件的高负载导致服务的异常或引发线上事故。

2.5 流量变更

流量变更和上面四个类别不同,其是从外部来看的,主要包含了流量变化的情况。这里不考虑攻击类的流量。流量一般是带来高负载,或者由高负载引发的链路异常或雪崩,从而导致整体服务异常或线上事故。

  • 负载调整:如对调整负载均衡策略,更改流量路由等由于考虑不周引发某些节点过热或流量过大,引发级联反应,从而出现异常或事故。
  • 后台投放或大型促销活动:如没有提前通知的后台投放或大型促销活动、特殊事件导致的流量激增,可能需要进行负载调整或资源扩容等,如果某些链路存在容量上限,或者达到扩容的上限,就会引起线上异常或事故。

以上 5 种类型画成简单的脑图,如下:

图片

3 变更管理

变更管理是指以可控的方式对线上的服务、配置或基础设施进行变更,从而减少变更对业务和服务质量的影响,快速处理变更可能带来的问题,提升系统的稳定性。

变更管理,咱们从组织和流程机制两个方面来看。

3.1 组织

一个事情要想有力的执行下去,一定是有一个组织来保障事情的整体节奏和推进。

从组织的角度,整个变更管理的组织成员角色可以分为以下几种:

  • 变更管理主导者:一般来说,这个角色通常由技术团队的高级管理者来担任,并且这个事情它本身是一个从上向下的事情,需要更上层的负责人来推进事项,一般是 CTO 或 VP,或质量的负责人。他们需要确保变更管理策略和流程的成功实施,对整个变更管理过程负责,并需要对所有的变更决策拥有最后的决定权。

  • 变更管理委员会:这是一个跨部门的团队,包括来自业务、开发、运维、质量保证等部门的代表。他们的任务是评审即将进行的变更,评估其对业务的影响,以及是否符合公司的战略目标。他们还负责改进变更管理流程,并对变更管理的效果进行监督和评估。在实际的实施过程中可能没有正式的名称叫委员会,可能叫 XXX 质量小组,或者就是某个研发中心的管理团队兼任。

  • 变更经理:这个角色负责确保变更管理流程的日常运行,是实际的变更控制推进者,他们需要协调变更的执行,确保所有的变更都通过了必要的评审,已经准备好了回滚计划,并且变更后的效果已经得到了验证。在实际的实施过程中,变更经理大概率是某个 Leader 或者质量的负责人,或者 PM。

  • 变更执行人:这个角色负责协调变更的具体实施,例如安排变更的时间,通知相关人员,收集反馈,等等,一般这种变更由一线的开发,SRE 来做,也有大一些的公司有专门的职位。

3.2 流程机制

变更管理有一个理想状态的标准流程,其大概如下:

  1. 变更申请:在我们的流程中可能是创建发布记录,或者申请紧急发布
  2. 变更评审:变更评审主要是检查变更过程是否完备,以降低变更的风险,其包括如下内容:
    1. 就绪分析:材料是否完备,人员、设备、软件、网络是否就绪,测试是否达到上线要求等。
    2. 风险分析:架构、性能、业务、合规等方面的风险评估,变更内容是否属于需求范围,变更是否可控。
    3. 重要程度:变更属于一般、重要、紧急、标准哪一种。
    4. 变更审查:内容是否满足业务需求,内容是否通过测试,测试是否全面、有效。
    5. 应急管理:变更步骤、应急方案、回滚方案、应急预案是否完备。
    6. 变更实施:变更计划时间如何安排,发布及回退操作步骤是否完备,自动化步骤情况。
    7. 变更验证:变更涉及的业务、技术验证方法与时间安排。
  3. 变更审批:相关负责人对于变更评审的结果进行确认,并审批通过。
  4. 变更执行
    1. 根据发布计划执行发布操作,一般应该有一个灰度的过程;
    2. 验证线上功能并回归主流程;
    3. 持续灰度,观察用户直到灰度完成。
  5. 变更验收
    1. 对发布的功能进行验收,对于影响范围内的功能进行验收,对业务主流程进行回归验收;
    2. 留守,并观察日志、监控服务负载等,这个操作是为了及时发现验收检查漏掉的问题,或者及时处理隐藏的问题,以减少变更后产生的问题对线上业务的影响。

我们做这个流程是形式上的安慰,还是僵化的惯性,还是能真正地解决问题,是我们在做这个流程以及执行这个流程中需要着重思考的问题。

在变更前,即我们变更线上环境前需要自己做 Code Review,以及交叉的检查,以尽量减少问题流转到后面的操作中,节省问题的处理成本。

在标准流程之外,另外还有两个特别重要的点,一个是周知,一个是盘点。

周知在形式上可以是邮件、群通知、群消息,通过这些方式,将研发自己做的前面所定义的线上变更周知给相关方:「我们做了 XXX 操作,可能会影响 XXX ,你们看下对你们自己有没有影响,如果有相关告警可以找我。」

变更虽然有流程,但是流程保证的是过程,对于过程中的问题通过变更盘点的方式,阶段性回顾问题和成果,在变更委员会中达成共识并继续迭代。在每次迭代的时候我们可以问自己如下的一些问题:

  • 与上次回顾相比,变更对线上的影响有更严重吗?有影响到稳定性吗?
  • 变更流程是否有什么问题,是否需要专项来解决?是否应该解决?
  • 上次回顾安排的事项落实了吗,对应的情况如何,是否有更新到流程或系统中?

以上的回顾操作我们建议以某个管理系统来承载,并且这个管理系统是带有通知等功能,以更好的将变更相关的信息周知出去。当然,也可能直接共享文档+群通知来搞。

4 小结

上面的变更管理只是流程方面的,对于实际中变更管理最好是能在类似于 DevOps 系统中的落地,最少也是在项目管理或流程系统中落地。

生产环境的变更管理是一项复杂而重要的任务。通过对生产环境的良好理解,结合有效的组织、流程和系统工具,我们可以实现对生产环境变更的有效管理,保证业务的稳定运行,提升用户的使用体验,同时也提升了我们自身的运维效率和质量。这也是我们做研发管理必须要完成的任务之一。

关于爬虫

作为一个互联网的技术开发,爬虫不管是自己写的还是所负责的网站被爬,都是挺常见的。

但是一个很常见的东西,却一直没有系统梳理过,今天我们从发展历史,价值,问题和应对恶意爬虫的策略来聊一聊爬虫。

1 爬虫发展历史

爬虫的发展历史伴随着搜索引擎的发展和大的搜索引擎公司的崛起,按时间线,大概分为三个阶段:

1.1 90 年代的早期爬虫

早期的爬虫主要用于收集网页链接、测量互联网规模或提供搜索服务。它们的目标相对简单明确。它们基于文本的抓取和索引,大多数是单线程和顺序抓取,有着简单的去重策略和有限的抓取规模,且当时对爬虫行为的限制较少。以下为一些早期爬虫:

  • World Wide Web Wanderer(1993年):由麻省理工学院的 Matthew Gray 开发,World Wide Web Wanderer 是最早的网络爬虫之一。其是用 Perl 语言实现,最初的目的是测量互联网的规模,但随后它也开始收集网页的 URL,并将这些 URL 存储在名为 Wandex 的数据库中。
  • JumpStation(1993年):Jonathon Fletcher 开发的 JumpStation 是一个早期的搜索引擎,被认为是世界上第一个网络搜索引擎,它使用一个基于爬虫的方法来收集链接并生成索引。JumpStation 利用简单的文本匹配技术来检索网页,并提供了一个基本的搜索界面。
  • RBSE (Rice-Based Search Engine) :全名为 Rice-Based Search Engine,是由 Rice University 的 Ramin Zabih 和 Justin Boyan 开发的。RBSE 是一个基于网络爬虫的搜索引擎,它使用了一种名为 “backward link crawling” 的方法进行网络抓取。该方法首先找到某个已知的相关网页,然后通过跟踪这个网页的反向链接(即指向该网页的其他网页)来查找更多的相关内容。
  • WebCrawler(1994年):WebCrawler 是由 Brian Pinkerton 开发的,它是第一个全文搜索引擎。WebCrawler 使用爬虫抓取网页,并将收集到的数据存储在索引服务器上。用户可以通过搜索关键词找到相关网页。
  • Lycos(1994年):Lycos 是另一个使用爬虫技术的搜索引擎,由卡内基梅隆大学的 Michael Mauldin 开发。Lycos 成为了当时最大的搜索引擎之一,提供了更先进的搜索功能和更大的索引。

1.2 搜索引擎时代的爬虫(90 年代末至 2000 年代初)

与早期爬虫相比,搜索引擎时代的爬虫已经支持了分布式抓取,支持多种文件类型和媒体格式,需要采用更复杂的网页解析技术,并且要遵守网站抓取规则,另外,在去重,索引和隐私保护等方面有了长足的长进。此时的爬虫,共同致力于提供更快速、更准确、更全面的搜索结果,满足用户不断增长的信息需求。以下为一些示例:

  • Scooter(1995 年):Scooter 是用于 AltaVista 公共搜索引擎的网络爬虫,AltaVista 曾声称Scooter 是「当今最快的网络爬虫」。它负责抓取和索引网页以构建 AltaVista 的搜索结果。
  • Yandex Bot(1997年):Yandex Bot 是俄罗斯搜索引擎 Yandex 的网络爬虫。它通过抓取和索引网页来构建 Yandex 的搜索结果。Yandex 使用了一种称为 MatrixNet 的机器学习算法来评估网页的质量和相关性。
  • Googlebot(1998年):Googlebot 与 Google 搜索引擎一起诞生。Google 的创始人拉里·佩奇(Larry Page)和谢尔盖·布林(Sergey Brin)于 1996 年开始研究他们的搜索引擎项目,最终在 1998 年正式推出 Google 搜索引擎。Googlebot 是 Google 搜索引擎的网络爬虫。它按照一定的算法和策略抓取互联网上的网页,用于构建 Google 的搜索索引。Googlebot 使用了一种称为 PageRank 的链接分析算法来评估网页的相关性和重要性。
  • Bingbot(2006年):Bingbot 是微软旗下搜索引擎 Bing 的网络爬虫。它通过抓取和索引网页来构建 Bing 的搜索结果。Bingbot 采用了一种称为 TrustRank 的算法来评估网页的质量和可信度。
  • Baiduspider(2000年):Baiduspider 是中国搜索引擎百度的网络爬虫。它负责抓取和索引互联网上的中文网页,用于构建百度的搜索结果。百度爬虫使用了一种称为 LinkRank 的链接分析算法。
  • DuckDuckBot(2008年):DuckDuckBot 是以隐私保护著称的搜索引擎 DuckDuckGo 的网络爬虫。虽然 DuckDuckGo 在很大程度上依赖于其他搜索引擎的结果,但它也使用自己的爬虫来抓取和索引网页。

1.3 现代爬虫

随着互联网的快速发展,爬虫技术也在不断进步。一方面,搜索引擎公司继续改进爬虫技术,以提高搜索结果的质量和速度。另一方面,爬虫技术已经成为数据挖掘、竞争情报和市场研究等领域的重要工具。

随着编程语言和开源项目的发展,现在有许多成熟的爬虫框架和库,如 Scrapy、Beautiful Soup、Puppeteer 和 Selenium 等。这些工具使得开发人员可以更容易地创建爬虫程序,以满足各种数据抓取需求。

在爬虫的发展历史中有一个不是规范的规范是一定要讲一下的,那就是 robots.txt 规范。

robots.txt 并不是一个实际的规范,而只是约定俗成的,其并不能真正保证网站的隐私,有点防君子不防小人的味道。

它的由来可以追溯到 1994 年,当时互联网上的 Web 页面数量急剧增加,导致许多搜索引擎和网络爬虫竞相抓取这些内容。然而,不是每个网站都希望被这些网络爬虫抓取和索引。并且,网络爬虫可能消耗大量的服务器资源,影响网站的性能和用户体验。为了解决这个问题,一个荷兰计算机科学家 Martijn Koster 提出了一种简单的解决方案:在网站的根目录下放置一个名为 robots.txt 的文本文件,用来告诉网络爬虫哪些页面可以抓取,哪些不可以。robots.txt 的提出得到了搜索引擎和网络爬虫开发者的广泛支持,逐渐成为了事实上的行业标准。

大多数网络爬虫在访问一个网站之前都会检查 robots.txt 文件,以确定哪些内容可以抓取,哪些需要避免。需要注意的是,robots.txt 文件并没有法律约束力,恶意爬虫可能会忽略它的规则。

2 爬虫的价值和问题

2.1 爬虫的价值

爬虫,作为一种自动遍历、抓取和分析网页内容的技术,为互联网中的信息获取、数据分析和知识发现提供了重要支持。其价值可以分为以下 4 类:

  1. 信息获取与索引

    • 搜索引擎索引:网络爬虫是搜索引擎构建其索引的关键组件。通过抓取和分析网页的内容、结构和链接信息,爬虫帮助搜索引擎构建一个全面、实时的网页数据库,从而为用户提供准确、相关的搜索结果。
  2. 数据分析与挖掘

    • 数据挖掘和分析:爬虫可以用于从互联网上收集大量数据,如新闻、论坛、博客、评论等。这些数据可以用于进一步的数据挖掘和分析,以发现潜在的趋势、模式和关联,为市场研究、竞争分析、舆情监控等应用提供有价值的洞察。
    • 内容监测:爬虫可以用于定期监测网站的内容变化,如新闻发布、产品更新、政策变动等。这有助于及时获取最新信息,为用户和企业提供实时的情报和提醒。
    • 学术研究:网络爬虫在学术研究中具有重要价值。研究人员可以使用爬虫抓取特定主题或领域的数据,进行进一步的分析和挖掘,以揭示潜在的知识和洞见。
  3. 数据整合与应用

    • 数据抓取和整合:爬虫可以用于抓取和整合来自不同来源的数据,如价格、产品规格、库存、评价等。这些数据可用于搭建价格比较网站、产品推荐系统、库存管理系统等,帮助用户和企业做出更明智的决策。
    • 知识图谱构建:通过抓取和分析大量的结构化和非结构化数据,爬虫可以帮助构建知识图谱,捕捉实体之间的关系和属性。知识图谱可用于支持语义搜索、问答系统、推荐系统等智能应用。
  4. 备份与存档

    • 存档和数据备份:网络爬虫可以用于抓取和备份网站的内容,为网页存档项目(如互联网档案馆)提供数据。这可以帮助保留历史信息,供未来的研究和回顾。

2.2 爬虫的问题

在有价值的同时,爬虫也会产生一些问题,这些问题分为两方,一个是对于爬虫发起方,另一个是对于爬虫接受方。

2.2.1 发起方的问题

对于发起方而言,可能有如下的问题:

  1. 技术挑战

    • 动态页面抓取:现代网站普遍采用 JavaScript、AJAX、SPA 等技术,传统的基于静态 HTML 的爬虫难以获取这些数据。例如,网站上的评论区可能是通过 AJAX 动态加载的,传统的爬虫无法直接抓取这些评论内容。
    • 反爬虫措施:许多网站采用各种反爬虫措施,如验证码、IP 限制、Cookie 跟踪等,使得爬虫难以访问和抓取目标数据。例如,购物网站可能会要求用户输入验证码才能查看商品价格,这对爬虫构成了挑战。
    • 网页结构变化:网站经常更新布局和设计,导致爬虫需要不断地适应这些变化。例如,一个新闻网站可能会在某次更新后改变文章标题的 HTML 标签,使得原来的爬虫无法正确抓取标题信息。
  2. 道德与法律问题

    • 隐私侵犯:在抓取用户信息、社交媒体动态等数据时,可能会涉及到用户隐私。例如,一个爬虫可能会抓取用户在社交媒体上的地理位置信息,进而侵犯用户的隐私权。
    • 知识产权侵权:爬虫在抓取内容时可能会触犯知识产权,如未经授权转载的文章、图片、音频等。例如,一个爬虫可能会抓取并转载一篇受版权保护的新闻报道,导致版权纠纷。
    • 法律法规遵守:爬虫在抓取数据时要遵守相关法律法规,如不得抓取违法信息、遵循 robots.txt 协议等。例如,一个爬虫可能会抓取到违反法规的虚假广告,导致法律问题。
  3. 数据质量问题

    • 数据准确性:爬虫抓取的数据可能存在错误、失真、过时等问题。例如,一个爬虫可能因为网站结构变化而抓取到错误的商品价格信息,导致后续分析和应用出现问题。
    • 数据完整性:爬虫抓取的数据可能不完整,无法涵盖所有相关信息。例如,一个用于舆情监控的爬虫可能仅抓取了部分新闻网站的报道,导致分析结果偏颇。
  4. 资源问题

    • 存储和计算资源:爬虫需要消耗大量的存储和计算资源来处理抓取到的数据。例如,一个爬虫可能需要存储数 TB 的网页内容,并对其进行文本分析、图像识别等计算密集型任务,这可能导致存储和计算资源不足。

以上是对爬虫发起方的挑战或问题,对于爬虫接受方面来说,这里可能的问题又分为两个方面,一个是正常的爬虫,如搜索引擎的爬虫,另一个是恶意爬虫。

2.2.2 正常爬虫对网站产生的问题

正常爬虫指的是遵循道德和法律规定,尊重网站权益的爬虫。尽管正常爬虫的目的通常是合理、合法的,但它们仍然可能给被爬网站带来一定的问题:

  • 有限的服务器压力与带宽消耗:正常爬虫在抓取数据时也会占用服务器资源和带宽,尽管通常不会对网站造成严重影响。合理的爬虫应遵循网站的 robots.txt 文件设置,限制抓取速度,以减轻对服务器的压力。
  • 误抓取敏感信息:正常爬虫在抓取数据时可能会误抓取到一些敏感信息,如用户个人信息、电子邮件地址等。为了保护用户隐私,爬虫开发者应尽量避免抓取这类数据,或者在数据处理过程中对敏感信息进行脱敏处理。
  • 数据准确性与完整性:正常爬虫抓取的数据可能存在错误、失真、过时等问题。例如,网站结构变化可能导致爬虫抓取到错误的数据。为了确保数据质量,爬虫开发者需要不断更新和优化爬虫策略。
  • 无意识的知识产权侵权:正常爬虫在抓取网站内容时可能会无意识地触及知识产权问题。为了避免侵权,爬虫开发者应尽量获取授权,或者仅抓取公开可用、非受版权保护的数据。

2.2.3 恶意爬虫对网站产生的问题

恶意爬虫指的是未经授权或者违反网站规定,采用不道德、非法手段抓取数据的爬虫。恶意爬虫可能给被爬网站带来以下问题:

  • 服务器压力与带宽消耗:恶意爬虫可能在短时间内对网站发起大量请求,导致服务器负载过高,甚至引发服务器崩溃,导致正常客户不可用。此外,大量请求会消耗网站的带宽资源,影响其他用户的访问速度。带宽的增加会带来目标网站技术成本的急剧增加
  • 数据隐私与安全:恶意爬虫可能窃取网站的敏感数据,如用户个人信息、登录凭证等。这种行为会侵犯用户隐私,甚至可能导致数据泄露、身份盗用等安全问题。
  • 知识产权侵权:恶意爬虫可能未经授权抓取并转载受版权保护的内容,如文章、图片、音频等。这种行为侵犯了网站及作者的知识产权,可能导致法律纠纷。
  • 网站安全漏洞利用:恶意爬虫可能会利用网站的安全漏洞进行攻击,如 SQL 注入、跨站脚本攻击等。这种行为会影响网站的数据安全和用户隐私。
  • 不良竞争:商业竞争对手可能使用恶意爬虫来抓取网站的数据,如产品信息、价格、促销活动等。这种行为可能导致不公平竞争,影响被爬网站的市场地位和利润。
  • 无效内容或账号滥用:爬虫可能会在网站上发布大量无意义的内容,以达到其目的,如影响内容搜索或排名,并且这些内容需要不同的假账号进行操作,这会对网站的账号体系产生较多的垃圾数据。

3 应对爬虫的问题

可以看到正常的爬虫的问题还能接受,但是针对恶意爬虫我们要打起十二分的精神,以防止其对我们网站的破坏。通过以下的一些手段我们可以缓解或者在一定程度上解决恶意爬虫的问题。

3.1 应对正常爬虫

为了 SEO 的效果我们有时还需要给爬虫提供一些帮忙,以下为一些常见的措施:

  • 设置robots.txt文件:通过设置robots.txt文件,可以指导合规爬虫遵循规则,限制其访问特定目录或页面。这有助于减轻服务器负担,同时允许搜索引擎等合规爬虫正常抓取数据。

  • 限制爬虫抓取速度或增加服务器:在robots.txt文件中设置 Crawl-delay 参数,来控制爬虫抓取速度。这有助于降低服务器压力,确保网站正常运行。当然,我们也可以不限制其速度,通过增加服务器等措施提供更好的爬取体现。

  • 为爬虫提供 Sitemap:提供 Sitemap 文件,列出网站的所有页面 URL,帮助爬虫更高效、准确地抓取网站内容。这有助于提高网站在搜索引擎中的排名。

  • 优化网站结构:确保网站的链接结构清晰、合理,有助于爬虫更容易地抓取到所有页面。同时,遵循良好的 SEO 实践,提高网站在搜索引擎中的表现。

  • 监控服务器日志:定期检查服务器日志,分析爬虫的抓取行为,确保它们遵循 robots.txt 规则。如果发现不遵循规则的爬虫,可以采取相应的措施限制其访问。

  • 与爬虫开发者和维护者沟通:如果发现爬虫存在问题或给网站带来压力,可以尝试与爬虫开发者和维护者进行沟通,寻求合作解决问题。如网站提供的数据有较大需求,可以考虑为爬虫提供 API 接口。这有助于减轻服务器压力,同时提供更为规范、易于维护的数据访问方式。

  • 使用CDN服务:采用内容分发网络(CDN)服务,可以有效分散流量,降低单个服务器的压力。提升爬虫的爬取体验。

3.2 应对恶意爬虫

恶意爬虫的出发点是利用非法手段获取利益或损害他人利益。主要源于网络攻击者、竞争对手等方面的需求,以获取敏感信息、窃取知识产权或增加目标网站的运营压力等等。

为应对恶意爬虫,我们有如下一些常见的策略或方法来应对。

  • 限制请求频率:监控来自单个 IP 地址的请求频率。如果请求频率过高,可能是恶意爬虫。可以限制该 IP 地址的访问速度,或者暂时封锁它,以防止恶意抓取。频率限制中可以是分钟限,时限或日限。

  • 检查 User-Agent:检查请求的 User-Agent 字段,以识别恶意爬虫。某些恶意爬虫可能会使用非标准或可疑的 User-Agent。可以设置规则,要求访问者使用合法的浏览器 User-Agent。这块很常见,最开始的对抗中用这种方案比较容易见效,但是很快就可能破解。

  • 使用 Cookie 和 Session:通过使用 Cookie 和 Session 机制,可以跟踪访问者的行为。恶意爬虫可能在短时间内访问大量页面,而正常用户的访问模式通常不同。可以通过分析访问模式来识别并阻止恶意爬虫。其本质上的逻辑是区分正常用户和爬虫以及增加爬虫抓取数据的难度。通常情况下,正常用户访问网站时,服务端会为其生成一个唯一的 Session,并将 Session ID 存储在用户浏览器的 Cookie 中。当用户再次访问网站时,浏览器会将 Cookie 中的 Session ID 发送给服务端,以便服务端识别用户。而爬虫程序通常不会像浏览器那样自动处理 Cookie,因此通过检查请求中是否包含有效的 Cookie 和 Session ID,可以在一定程度上区分正常用户和爬虫。当然,对于恶意爬虫来说,可以绕过 Cookie 和 Session 的检测,此时就需要模拟浏览器的行为,包括处理 Cookie、维护 Session 等,这就大大增加了爬虫编写和运行的复杂性。此外,服务端还可以对 Cookie 和 Session 进行加密、设置过期时间等,做一些策略或措施,进一步提高爬虫绕过检测的难度。

  • 启用验证码:对于敏感操作或疑似恶意爬虫的访问,可以要求用户输入验证码(如 Google 的 reCAPTCHA)。这有助于阻止自动化的爬虫访问,但可能会对正常用户造成一定的不便。在检测到访问频率异常、异常访问行为、IP黑名单或者一些敏感操作、写操作时,可以启用验证码,此时我们需要权衡安全性和用户体验之间的平衡,网站应根据实际情况选择合适的启用验证码的时机,以尽量减少对用户的打扰。另外,在实施验证码方案时,考虑用户友好性。例如,确保验证码易于阅读和理解,同时提供无障碍访问选项(如语音验证码或替代验证方法),以满足不同用户的需求。

  • 动态加载内容:使用前端技术动态加载页面内容,使得恶意爬虫更难抓取数据。这种方法可能会影响网站的可访问性和 SEO,因此需要权衡后决策。

  • 保护 API:如果网站提供 API,可以对其添加额外的安全措施,如使用 API 密钥、限制请求速率和使用 OAuth 等身份验证机制。

  • 监控日志和异常行为:定期检查服务器日志,以发现异常访问模式,这有助于及时识别并应对恶意爬虫。最好有成体系的机制来保证,或者基于这些日志做一些监控告警,以系统化的方式更快的发现问题。

  • 采用 Web 应用防火墙(WAF):当前面的一些简单策略不行,此时如果你正在使用云服务,可以使用 Web 应用防火墙(WAF)帮助识别和阻止恶意流量。Web 应用防火墙(Web Application Firewall,简称 WAF)是一种保护 Web 应用程序免受恶意攻击和其他安全威胁的解决方案。WAF 位于 Web 应用程序和互联网之间,它监视、过滤或阻止传入 Web 应用程序的 HTTP 流量。WAF 的核心功能是识别并阻止来自外部攻击者的恶意请求,从而保护 Web 应用程序的安全。WAF 可以提供如下一些方法,以帮助识别和阻止恶意爬虫,从而保护 Web 应用程序和数据。

    • IP 地址筛选:WAF 可以通过识别和阻止来自已知恶意 IP 地址的请求来应对恶意爬虫。咱们可以维护一个恶意 IP 地址的黑名单,并将其添加到 WAF 的访问控制列表中,以阻止这些 IP 地址的请求。

    • 请求速率限制:WAF 可以限制特定 IP 地址或客户端在给定时间段内发出的请求数量,从而防止爬虫对您的 Web 应用程序发起过多的请求。通过设置合理的速率限制,可以在不影响正常用户访问的情况下,抵御恶意爬虫的攻击。

    • 请求头分析:WAF 可以分析 HTTP 请求头中的信息(如 User-Agent、Referer 等),以识别和阻止恶意爬虫。恶意爬虫通常使用特定的 User-Agent 字符串或发送不包含 Referer 的请求。您可以根据这些特征创建 WAF 规则,以阻止这些请求。

    • 请求异常检测:WAF 可以检测到异常请求,如请求频率异常、请求路径异常或请求参数异常等。一旦检测到异常请求,WAF 可以采取相应的措施,如阻止请求、要求输入验证码或增加请求延迟等。

    • 自定义 WAF 规则:咱们可以根据 Web 应用程序和业务需求创建自定义 WAF 规则,以更有效地识别和阻止恶意爬虫。例如,咱们可以创建规则来检测特定的攻击模式、请求路径或查询参数等。

    • 机器学习和行为分析:一些高级的 WAF 解决方案采用了机器学习和行为分析技术,以更准确地识别恶意爬虫。通过分析大量的请求数据,机器学习模型可以自动识别异常行为并更新 WAF 规则,从而更有效地阻止恶意爬虫。

    • 集成第三方服务:WAF 可以与其他安全服务和解决方案集成,以提高对恶意爬虫的防护能力。例如,您可以集成 IP 信誉数据库、威胁情报平台或验证码服务等,以提高 WAF 的效果。

WAF 的策略和我们前面讲的策略区别不大,只不过依赖于其背后的研发能力、资源和大样本量,能够发现更多的异常情况,有更多的策略和方法来识别,并且只需要投入少量的研发人力做自定义规则配置。

4 更有挑战的爬虫

爬虫也是在不断演化和发展的,现在的爬虫技术面临的问题或研究的方向可能有如下的一些:

  • 智能爬虫:随着网页结构和内容的日益复杂,智能爬虫技术成为一个研究热点。智能爬虫可以自动识别网页内容,理解结构化和非结构化数据,以更高效和准确地获取有价值的信息。这里是否可以结合最近的大模型来做一些工作?

  • 反爬虫策略和反反爬虫技术:许多网站采用反爬虫策略防止数据被抓取。研究者关注如何在尊重网站隐私和合规的前提下,开发更有效的反反爬虫技术,实现对网页内容的友好抓取。

  • 增量爬取和实时抓取:随着互联网信息的快速更新,增量爬取和实时抓取成为爬虫研究的重要方向。研究者试图通过优化爬取策略、调度算法、抓取频率等,实现更高效的增量爬取和实时抓取。

  • 分布式爬虫和大规模数据抓取:为应对大规模数据抓取的挑战,研究者关注分布式爬虫技术的优化和发展。分布式爬虫可以在多台计算机上并行运行,提高抓取速度和效率,降低单点故障的风险。

  • 深度网络爬虫:深度网络爬虫是指能够抓取隐藏在表单、登录、动态内容等复杂场景下的数据。研究者关注如何使用机器学习、自然语言处理等技术,提高深度网络爬虫的抓取能力和准确性。

  • 语义爬虫:语义爬虫关注如何从网页中自动抽取结构化数据和语义信息。通过使用知识图谱、本体建模等技术,语义爬虫可以更好地理解和表示网页内容,为语义搜索、智能问答等应用提供支持。

  • 针对特定领域的爬虫研究:不同领域的网站具有特定的结构和内容特征。研究者关注如何针对特定领域(如电子商务、社交媒体、学术研究等)设计和优化爬虫技术,以更好地满足不同场景下的数据抓取需求。

对于现在的搜索引擎来说,这些应该都是在一定程度上解决了的问题,或者正在解决和优化的问题,为了其业务的发展,他们致力于发展更高效、智能、可扩展的爬虫技术,以应对互联网信息获取和分析的日益复杂需求。