我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了“K哥爬虫普法”专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识,知晓如何合法合规利用爬虫技术,警钟长鸣,做一个守法、护法、有原则的技术人员。
案情介绍
深圳市快鸽互联网科技有限公司 2014 年成立,早期做互联网金融,2017 年转型做互联网科技公司,主营业务是“助贷”,也就为按揭贷款购房的客户提供赎楼及债务置换贷款等服务。
公司的业务需要经常性地访问深圳市政府居住证网站,查询房产地址、房屋编码和学区房的使用情况,用于做房产的市场评估和客户风险评估。因为手动查询效率低下,公司产品组经讨论后提出了一个建议——用爬虫技术自动查询。
2017 年 12 月,CTO 安排新入职的程序员负责这个项目,要求他研发一个自动定时抓取的小程序,主要用来查询、下载网上的数据。
2018 年 1 月,项目经理给程序员一个抓取数据的小程序源代码,程序员开始修改。
2018 年 3 月,程序被部署在阿某云服务器上自动运行,其内置的“网络爬虫”对接了深圳市公安局人口管理处的居住证系统,可以在深圳市居住证网站上查询到房产地址、房屋编码等对应的资料,软件对网站访问量能达到每小时数十万次,查询的信息都被下载保存到公司购买的阿某云服务器上。
2018 年 4 月 27 日 10:43-12:00 左右,居住证系统的承建单位发现系统出现宕机现象,追踪到请求应用服务器端口编号,但因日志缺失而无法定位 IP 来源,当时怀疑是人为攻击。
2018 年 5 月 2 日 10:00-12:00 左右,系统再次遭遇攻击,这次管理人员成功地截取了 IP 地址并报案。
2018 年 5 月 17 日晚上 11 点,服务器维护人员接到了阿某云客服的电话。阿某云说他们公司的服务器 IP 被网警锁定了,因有攻击行为,让他们赶紧联系网警。
2018 年 8 月,CTO、程序员被捕。
案发时,深圳市居住证服务平台的注册用户超过 530 万,服务面包括:所有市民的网上自助受理系统、151个派出所、街道办居住证受理点的现场受理系统、后台接口为市网格办、市交警局、市民政局,市交委等多个政府部门提供居住证、居住登记条件查询和审核。
居住证系统受攻击瘫痪期间,软件对深圳市居住证系统查询访问量为每秒 183 次,共计查询信息约 151 万条次,抓取了大量建筑物编码数据,造成政府信息泄漏;所有居住证办理、居住登记申报、信息查询、对外服务功能均无法正常工作,影响面极广,市民无法办理居住证和居住登记,相关生产生活秩序受到严重影响。除了此次攻击,还有一些派出所出具证明证实 5 月期间经常出现系统无法登陆,录入过程频繁出现掉线、系统数据异常等情况。居住证系统无法正常使用、出现异常情况的时间长达一个多月。
供述情况
CTO 的部分供述和辩解:我司查询并下载深圳市居住证网上的数据信息没有进行市场买卖,没有跟其他公司进行资源置换,也没有通过查询信息行为获利。我不清楚这款爬虫软件对深圳市居住证网站及系统造成的影响、深圳市居住证网站及系统的承载能力、爬虫软件的具体的启动和部署情况,但我知道从技术上来讲如果超过服务器承载能力的查询肯定会引起系统卡顿或瘫痪,所以我口头要求注意查询时间、控制查询频率,我司并无任何恶意去主观进行攻击。
程序员的部分供述和辩解:抓取数据的原程序是谁研发的我不知道,当时我接到这个任务时,是公司领导把源代码给我后让我修改的。这个程序查询信息的频率我不清楚,共查询多少条信息我也不清楚,我没有因查询深圳市居住证网站的信息而获利,这是我的工作任务。
判决情况
法院认为,被告人杨杰明、张国栋违反国家规定,对计算机信息系统功能进行干扰,造成为 5 万以上用户提供服务的计算机信息系统不能正常运行累计 1 小时以上,后果特别严重,其行为已构成破坏计算机信息系统罪。
CTO 负责并授权程序员开发涉案爬虫软件,系主犯,判处有期徒刑三年;程序员受指派开发爬虫软件,在共同犯罪中起次要作用,系从犯,判处有期徒刑一年六个月。
反思总结
- 爬虫程序日志记录、监控告警的重要性:本案中,在被捕之前就有过一次目标网站宕机的情况,这时候请求成功率、数据量大小、目标网站服务器的响应情况等肯定会出现异常,正确的做法是有一定的告警策略,连续出现多少次无数据、目标网站访问异常的时候,就应该告警通知到程序员,特别是政府网站,本案中的程序显然没有这些功能,导致程序员未能及时发现问题并进行处理,要知道这次对方运维人员并没有成功定位到 IP,及时处理完全可以避免成为“爬虫牢玩家”,给过一次机会都把握不住,警察上门才知道酿成大祸,到那时候一切都晚了。
-
爬虫代码的健壮性:根据本案中程序员的供述,目标网站更新了验证码登录的功能,但是程序并没有针对这种情况做处理,也没有及时更新,导致程序出现死循环,进而导致短时间内出现了大量请求,这就体现了代码健壮性的重要性,在编写程序时就要综合考虑到可能出现的情况,检测到某个接口异常,无法拿到正确的数据,重试是正常的,但不能任何情况都重试,也不能一直重试出现死循环的情况,应该有合理的规则,合理的重试次数,超过设定的次数就应该告警并停止程序的运行,一部分程序员喜欢直接暴力使用
try except
语句直接捕获所有异常,然后except
里就直接重试,正确的做法是针对不同可能出现的异常做不同处理,取值异常应该怎么处理,连接异常应该怎么处理等等。 - 避免单一真实 IP 采集:本案中的程序使用一个固定 IP 采集了约 151 万条次的数据信息,很显然目标网站没有封 IP 的策略,但这并不意味着我们程序就不用使用代理,当然使用代理,也得建立在合法合规的请求之上,部分代理商也会协助你判断请求是否合规,完善的请求统计也能帮助你判断是否出现异常情况。
- 爬虫频率控制:本案中,造成目标服务器宕机时,程序的并发是每秒 183 次,在普通的爬虫程序中这点儿并发确实不是很大,但要注意的是,目标网站是政府网站,尤其是地方政府的专属职能系统,这些网站在软硬件上都不会投入太多资源,加上该网站为151个派出所、街道办等多个部门提供服务,某个时刻可能会出现多个部门同时大量处理事务的情况,再加上你的爬虫程序,服务器撑不住很正常,案例中程序设置了凌晨1时至2时进行采集是比较正确的做法,政府网站降低频率、错峰采集,一定程度上也能避免爬宕机的情况。
- 对需求的风险评估及把控不足:CTO 自述中表明意识到这么操作会破坏深圳市公安局居住证服务平台,但是为了方便以后的查询,就着急着去做了,没有考虑那么多的后果。也就是在明知道可能存在风险的情况下,还未对该需求进行严格的监管,正因为抱有侥幸心理,为以后埋下了“定时炸弹”。正确的做法应当是做细致严谨的规划,研究该需求的合理性,再考虑要不要下发实施,而程序员也没对下发需求做可行性分析,拿着需求和基础代码就去做了,还未进行监控管理,这提醒我们立项时多问一句“我们这么做有没有风险”没坏处,特别是爬虫工程师们要多对需求进行理性分析,隐患大的需求该拒绝就拒绝,毕竟有些事看起来是“集体”的决策最后往往并不是集体买单,如果公司因此威胁辞退你,那赶紧拿钱跑路,这种公司迟早得出问题!
- 温馨提醒:以上案例提醒我们,在工作中碰到类似情况后,建议在事前咨询公司法务或者专业人士,不要想当然,不要自以为是。谨记一点,公司是老板的,自由是自己的,法律是不容触犯的!
友情提示之公司辞退员工补偿标准:
《劳动合同法》第47条规定:
1、经济补偿按劳动者在本单位工作的年限每满一年支付一个月工资的标准向劳动者支付;
2、六个月以上不满一年的,按一年计算;
3、不满六个月的,向劳动者支付半个月工资的经济补偿,月工资是指劳动者在劳动合同解除或者终止前十二个月的平均工资。
合同未到期,员工无过错情形下,单位提出与员工解除劳动合同的非自行离职的情况下,可索要 N+1 月工资的补偿:N 为在职年限,不足一年但超过半年,则按一年算;1 为辞退员工需要提前一个月通知,否则需要补偿 1 个月工资作为代通知金。