对于我们这种数据量很大的网站,面临的一个麻烦是总有人来采集,以前多使用过人工检查、屏蔽的办法,这种办法有效果但太费精力,前段时间也找了插件来自动限制最大连接数,但存在误屏蔽搜索引擎的问题,最近老夫下决定亲自操刀写程序,把这些采集者都斩草除根,虽然编程麻烦但效果好。
思路是在Drupal的模板文件中嵌入PHP程序代码,读取$_SERVER参数并记录到数据库中,通过对参数及访问频率的判断来决定是否要访问者提交验证码,如果验证码错误或者不填写的次数过多则屏蔽,可以通过host反向dns查找来判别常见搜索引擎。
这个程序还稍微有点复杂,以前修改开源PHP程序都是直接上手,这个程序还编写了流程图,数据库表结构也是自己规划的,为了避免拉慢速度,MySQL中采用了Memory引擎,对于多是临时访问记录已经够用了。程序写得很烂,就不放在博客中了。
这个程序anti-scraping.php上周调试了几天,本周刚刚投入试用,已经可以从日志中看到效果,还需要不断改进,例如增加黑名单、白名单、尝试改用Drupal标准第三方模块的方式等。因为完成采用自己编程实现,所以可以对判别标准、屏蔽方式做各种修改尝试,应对各种采集者。
版本历史:
- 2013-7-05 17:16 开始编写本程序,作为一个单独程序,数据表采用memory类型
- 2013-7-16 16:10 增加黑白名单、500次验证码以上标记为采集者、给验证码的同时延时5秒
- 2013-8-05 16:00 改函数、判别t函数是否存在、考虑proxy情况、bad表添加时间字段、bad超过10天的记录删除
- 2013-11-14 17:19 获取逗号前第一个IP,避免php函数报错
- 2013-12-8 23:50 XX次/X分钟改XXX次/XX分钟,验证码回答对一次后累计清零,添加白名单IP,bad表添加3个字段,每日发邮件报告发现的采集IP
- 2013-12-26 15:00 定时运行报告anti-scraping-report.php,服务器名称查询,发送到专门的邮箱
- 2014-4-9 设立专门的反采集库anti_scraping,在log/limit/bad三个表中都增加一个字段request_time1用于存放正常格式时间数据,添加新服务器到白名单,增加对数据库连接失败的判断;anti-scraping-report.php修改数据库名称、增加连接不上数据库的判断处理、remote_host的value替换半角句号为全角句号避免邮件被当作垃圾邮件;新增anti-scraping-delay.php 反采集程序之延时版本,将验证码改为延时,用于file cache的情况,避免验证码内容被缓存到页面文件中,可用于MediaWiki的FileCache和Drupal的Boost缓存
- 2014-8-8 对googlebot等搜索引擎爬虫进行host反查可能临时出错,所以对于反查是IP的全部放行;添加360Spider和Sogou;更新国外服务器IP
To Do List:
- 更详细的定期统计报告(三个表的记录数、统计分析)
- 精确调整延时及优化程序来减少对已经知道的搜索引擎和正常访问者的影响
- Bad中一个IP出现多次的问题
评论2
James, 这个程序还有更新吗?最近也遇到这个问题
James, 这个程序还有更新吗?最近也遇到这个问题,可以把这个程序放出来吗?谢谢。Rex, 你好!这个程序我自己还在用,但基于各种考虑
Rex, 你好!这个程序我自己还在用,但基于各种考虑,还不适合放出来,抱歉。其实我自己的水平还算不上程序员,也是根据别人的提示瞎编写的,上面写了思路,只要有一定水平,花些时间可以自己做出来更适合自己的。