本文将描述一种尽量简单的反爬虫方案,可以在十几分钟内解决部分简单的爬虫问题,缓解恶意攻击或者是系统超负荷运行的状况;至于复杂的爬虫以及更精准的防御,需要另外讨论。

爬虫和反爬虫日益成为每家公司的标配系统。爬虫在情报获取、虚假流量、动态定价、恶意攻击、薅羊毛等方面都能起到很关键的作用,所以每家公司都或多或少的需要开发一些爬虫程序,业界在这方面的成熟的方案也非常多;有矛就有盾,每家公司也相应的需要反爬虫系统来达到数据保护、系统稳定性保障、竞争优势保持的目的。

然而,一方面防守这事ROI不好体现,另一方面反爬虫这种系统,相对简单的爬虫来说难度和复杂度都要高很多,往往需要一整套大数据解决方案才能把事情做好,因此只有少量的公司可以玩转起来。当出现问题的时候,很多公司往往束手无策。

本文将描述一种尽量简单的反爬虫方案,可以在十几分钟内解决部分简单的爬虫问题,缓解恶意攻击或者是系统超负荷运行的状况;至于复杂的爬虫以及更精准的防御,需要另外讨论。

整套方案会尽量简单易懂,不会涉及到专门的程序开发,同时尽量利用现有的组件,避免额外组件的引入。内容上主要分为三大部分:

  1. 访问数据获取。采集用户的访问数据,用来做爬虫分析的数据源
  2. 爬虫封禁。当找到爬虫后,想办法去阻断它后续的访问
  3. 爬虫分析。示例通过简单策略来分析出爬虫

简单的数据获取

数据获取是做好反爬虫系统的关键,常见的几种模式

本篇,采用nginx的日志方式,这种只需要通过对常见的nginx最简单的配置就能从远程获取相应的访问日志

官方nginx配置:

  1. log_format warden '" "$remote_addr" "$remote_port" "$server_addr" "$server_port" "$request_length" "$content_length" "$body_bytes_sent" "$request_uri" "$host" "$http_user_agent" "$status" "$http_cookie" "$request_method" "$http_referer" "$http_x_forwarded_for" "$request_time" "$sent_http_set_cookie" "$content_type" "$upstream_http_content_type" "$request_body"\n';
  2. access_log syslog:server=127.0.0.1:9514 warden ;

tengine配置(编译时带上--with-syslog)

  1. log_format warden '" "$remote_addr" "$remote_port" "$server_addr" "$server_port" "$request_length" "$content_length" "$body_bytes_sent" "$request_uri" "$host" "$http_user_agent" "$status" "$http_cookie" "$request_method" "$http_referer" "$http_x_forwarded_for" "$request_time" "$sent_http_set_cookie" "$content_type" "$upstream_http_content_type" "$request_body"\n';
  2. access_log syslog:user::127.0.0.1:9514 warden ;

这里面需要注意的是:

  • 由于较老的nginx官方版本不支持syslog,所以tengine在这块功能上做了单独的开发(需要通过编译选项来启用),在不确定的情况下,请修改配置 文件后先使用(nginx -t)来测试一下,如果不通过,需要重新在configure时加上syslog选项,并编译。
  • 尽量获取了跟爬虫相关的数据字段,如果有定制的http header,可以自行加上 采用udp方式来发送syslog,可以将访问日志发送给远端分析服务,同时udp的方式保证nginx本身不会受到影响
  • 访问日志拿不到响应的具体内容(nginx有办法搞定,但有代价),无法支持业务相关的防护

简单的爬虫封禁

反爬虫最后的生效,需要靠合理的封禁模式,这里比较几种模式:

本段将介绍基于iptables的方案,虽然适用范围较小;但是依赖少,可以通过简单配置linux就能达到效果。

第一步

  1. 安装ipset。ipset扩充了iptables的基本功能,可以提供更加高效的访问控制
  2. # centos 6.5上面安装非常简单
  3. sudo yum install -y ipset

第二步

在iptables中建立相应的ipset,来进行访问权限的封禁

  1. # 新增用于封禁的ipset
  2. sudo ipset -N --exist warden_blacklist iphash
  3. # 增加相应的iptables规则
  4. sudo iptables -A INPUT -m set --set warden_blacklist src -j DROP
  5. # 保存iptables
  6. sudo service iptables save

第三步

获取当前封禁的ip黑名单,并导入到iptables里面去

  1. sudo ipset --exist destroy warden_blacklist_tmp; sudo ipset -N warden_blacklist_tmp iphash; echo "1.1.1.1,2.2.2.2" | tr , "\n" | xargs -n 1 -I {} sudo ipset -A warden_blacklist_tmp {} ; sudo ipset swap warden_blacklist_tmp warden_blacklist

这里为了尽可能的提升效率,作了以下事情:

  • 建立临时ipset,方便做操作
  • 将当前封禁黑名单中的ip提取出来,加入到此ipset(示例中用了最简单的echo来展示,实际可相应调整)
  • 将ipset通过原子操作与iptables正在使用的ipset作交换,以最小的代价将最新的黑名单生效

简单的爬虫策略

要能精确的分析爬虫,需要强大的数据分析平台和规则引擎,来分析这个IP/设备/用户分别在短时间区间/长时间范围里的行为特征和轨迹,这里涉及到了非常复杂的数据系统开发,本文将通过简单的shell脚本描述比较简单的规则

例子1,封禁最近100000条中访问量超过5000的ip

  1. nc -ul 9514 | head -100000 | awk -F '" "' '{print $2}' | sort | uniq -c | sort -nr | awk '$1>=5000 {print $2}'

这里面:

  1. udp服务监听nginx发过来的syslog消息,并取10000条,找到其中每条访问记录的ip
  2. 通过sort 和uniq来获取每个ip出现的次数,并进行降序排列
  3. 再通过awk找到其中超过阈值的ip,这就得到了我们所需要的结果。

例子2,封禁最近100000条中user agent明显是程序的ip

nc -ul 9514 | head -100000 | awk -F '" "' '$10 ~ /java|feedly|universalfeedparser|apachebench|microsoft url control|python-urllib|httpclient/ {print $2}' | uniq

这里面:

  1. 通过awk的正则来过滤出问题agent,并将相应ip输出
  2. 关于agent的正则表达式列出了部分,可以根据实际情况去调整和积累

当然,这里只是列举了简单的例子,有很多的不足之处

  1. 由于只采用了shell,规则比较简单,可以通过扩展awk或者其他语言的方式来实现更复杂的规则
  2. 统计的窗口是每100000条,这种统计窗口比较粗糙,好的统计方式需要在每条实时数据收到是对过去的一小段时间(例如5分钟)重新做统计计算
  3. 不够实时,无法实时的应对攻击行为;生产环境中,需要毫秒级的响应来应对高级爬虫
  4. .......

拼起来

所有模块组合起来,做一个完整的例子。假设:

  1. 负载均衡192.168.1.1,使用了官方nginx,并配置了syslog发往192.168.1.2
  2. 192.168.1.2启动nc server,每隔一段时间进行分析,找出问题ip,并吐给192.168.1.1
  3. 192.168.1.1通过iptables进行阻拦,数据来源于192.168.1.2的分析机器

除了nginx配置和iptables基本配置,前几段的配置略作改动:

  1. ### nginx conf@192.168.1.1
  2. log_format warden '" "$remote_addr" "$remote_port" "$server_addr" "$server_port" "$request_length" "$content_length" "$body_bytes_sent" "$request_uri" "$host" "$http_user_agent" "$status" "$http_cookie" "$request_method" "$http_referer" "$http_x_forwarded_for" "$request_time" "$sent_http_set_cookie" "$content_type" "$upstream_http_content_type" "$request_body"\n';
  3. access_log syslog:server=192.168.1.2:9514 warden ;
  4. ### 分析@192.168.1.2, 增加了结果会吐,同时每隔60分钟跑一次,把数据返回给192.168.1.1
  5. while true ; do nc -ul 9514 | head -100000 | awk -F '" "' '{print $2}' | sort | uniq -c | sort -nr | awk '$1>=5000 {print $2}' | tr '\n' ',' | awk '{print $0}' | socat - UDP:192.168.1.1:9515  ; sleep 3600 ; done
  6. ### 阻断@192.168.1.1
  7. #基础配置
  8. sudo ipset -N --exist warden_blacklist iphash
  9. sudo iptables -A INPUT -m set --set warden_blacklist src -j DROP
  10. sudo service iptables save
  11. #动态接收并更新iptables
  12. while true ; do sudo ipset --exist destroy warden_blacklist_tmp; sudo ipset -N warden_blacklist_tmp iphash; socat UDP-LISTEN:9515 - | tr , "\n" | xargs -n 1 -I {} sudo ipset -A warden_blacklist_tmp {} ;sudo ipset swap warden_blacklist_tmp warden_blacklist ; sudo ipset list ; done

以上只是简单示例,实际中还是建议换成shell脚本

总结

本文列出一种简单的反爬虫方案,由于过于简单,可以当做概念示例或者是救急方案,如果需要进一步深化,需要在以下方面去加强:

  1. 强化数据源,可以通过流量获得全量数据。目前爬虫等网络攻击逐渐转向业务密切相关的部分,往钱的方向靠近,所以需要更多的业务数据去支撑,而不仅仅是访问日志
  2. 更灵活的阻断,需要有多种阻断手段和略复杂的阻断逻辑
  3. 除却ip,还需要考察用户、设备指纹等多种追踪方式,应对移动环境和ipv6环境下,“IP”这一信息的力不从心
  4. 强化规则引擎和模型,需要考察更多用户行为的特征,仅仅从频率等手段只等应对傻爬虫,同时会造成误杀率更高
  5. 建立数据存储、溯源、统计体系,方便分析人员去分析数据并建立新的模型和规则。反爬虫是一件持续性行为,需要良好的平台来支撑。
  6. 可以根据实际需要去做好反爬虫系统的集成。比如nginx数据-->反爬系统-->nginx阻断;F5数据-->反爬系统-->F5阻断

作者介绍

陆文

岂安科技联合创始人,首席产品技术官,反爬虫专家

曾担任PayPal资深高级工程师,在可信计算,计算机风控等领域有深入的理论研究和成果;并在防欺诈和风险监控行业有多年且深厚的工作经历,擅长分布式系统和实时大数据计算。他参与岂安科技所有产品线的架构和设计,带领团队在数据挖掘、多媒体分析、跨数据中心分布式系统、高性能实时大数据计算、海量数据采集等领域进行前沿研究和产品化,帮助客户更好的解决内部的安全和风控问题。

十分钟解决爬虫问题!超轻量级反爬虫方案相关推荐

  1. 爬虫中的那些反爬虫措施以及解决方法

     在爬虫中遇到反爬虫真的是家常便饭了,这篇博客我想结合我自己的经验将遇到过的那些问题给出来,并给出一些解决方案. 1.UserAgent   UserAgent的设置能使服务器能够识别客户使用的操作系 ...

  2. python爬虫(二)——反爬虫机制

    一.headers反爬虫 1.U-A校验 最简单的反爬虫机制应该是U-A校验了.浏览器在发送请求的时候,会附带一部分浏览器及当前系统环境的参数给服务器,这部分数据放在HTTP请求的header部分. ...

  3. python反爬虫策略_突破反爬虫策略

    ### 1.什么是爬虫和反爬虫 * **爬虫**是使用任何技术手段批量获取网站信息的一种方式,**反爬虫**是使用任何技术手段阻止别人批量获取自己网站信息的一种方式: ### 2.User-Agent ...

  4. python网络爬虫的基本步骤-十分钟教会你用Python写网络爬虫程序

    在互联网时代,爬虫绝对是一项非常有用的技能.借助它,你可以快速获取大量的数据并自动分析,或者帮你完成大量重复.费时的工作,分分钟成为掌控互联网的大师. 注意:欲获取本文所涉及的文案,代码及教学视频的链 ...

  5. linux时间老是跳快6分钟,Linux超省时小技巧,让你原来要十分钟解决的问题现在只用一秒钟...

    您是否在充分利用Linux?对于许多Linux用户而言,有许多有用的功能似乎可以节省时间.有时,这些省时的提示和技巧成为了需要.它们可以帮助您使用相同的命令集提高功能的效率. 这是每个Linux用户都 ...

  6. 【微信支付】十分钟解决内网穿透,实现微信支付本地测试

    在微信小程序上调用微信支付功能.微信支付可以在本地进行测试,但无法拿到支付回调结果.也就是本地拿不到微信返回的订单号等.需要拿到支付结果回调的话,可采用服务器测试或者内网穿透到外网. 接下来分享一种内 ...

  7. 十分钟搞懂Java限流及常见方案

    点击关注公众号:互联网架构师,后台回复 2T获取2TB学习资源! 上一篇:Alibaba开源内网高并发编程手册.pdf 文章目录 限流基本概念 QPS和连接数控制 传输速率 黑白名单 分布式环境 限流 ...

  8. python爬虫脚本ie=utf-8_Python反爬虫伪装浏览器进行爬虫

    对于爬虫中部分网站设置了请求次数过多后会封杀ip,现在模拟浏览器进行爬虫,也就是说让服务器认识到访问他的是真正的浏览器而不是机器操作 简单的直接添加请求头,将浏览器的信息在请求数据时传入: 打开浏览器 ...

  9. python学习笔记分享(四十)网络爬虫(7)反爬虫问题,解决中文乱码,登陆和验证码处理

    网络爬虫深度知识 一.反爬虫问题 (一)反爬虫原因 1.网络爬虫浪费了网站的流量 2.数据是私有资源 3.爬虫协议与原则 (二)反爬虫方式 (三)反反爬虫 1.原理 2.三种方法 二.解决中文乱码 ( ...

最新文章

  1. linux系统中find怎么用,linux系统中‘find’的详细用法
  2. [vue] vue生命周期总共有几个阶段?
  3. 1.极限——ε-δ例子_7
  4. php中header用法
  5. linux 网络io 监控,Linux教程:Linux性能监控-NetworkIO
  6. clr20r3 程序终止的几种解决方案_IT外包桌面解决方案——不慌,蓝屏而已
  7. 共享库方案解决WAS中JAR包冲突
  8. 开源alisql压测批处理性能
  9. vscode 字体太小的问题,安装新字体
  10. Cisco Packet Tracer 思科交换机模拟器常见命令
  11. 高速计数器转RS485Modbus RTU模块IBF150
  12. PAT 1007(简单粗暴)
  13. 相似度的几种常见计算方法
  14. SSD固态硬盘优化方案,让新买的SSD速度不再慢
  15. 2018总结以及2019展望
  16. android无法启动守护进程,Android Studio无法启动守护进程异常怎么解决?
  17. 微信公众号之刷卡支付
  18. Charles--分析网络封包的工具
  19. 解决hive查询parquet表报错NullPointerException异常问题(ProjectionPusher.java:118)
  20. jquery访问ashx文件示例

热门文章

  1. sugar orm使用介绍
  2. Boosting Adversarial Attacks with Momentum (翻译,侵删)
  3. 【每日一题】公式计算
  4. 火雷噬嗑:去其糟粕;山火贲:取其精华
  5. Android动态传感器的介绍及其应用
  6. gitlab改成中文版(汉化)
  7. 怎么使苹果手机键盘换行变搜索
  8. 备战省赛第一场 问题 B: 黑暗意志
  9. JavaScript作业3
  10. 前端技术栈:将微信小程序代码自动转换成 Vue 代码