当前位置:首页 > 建站技术 > 正文

网站防采集,在这个采集横行的时代如何做到防采集

发布时间:2016-11-16作者:张安林阅读:2783
在这个采集横行的时代,很多网站都苦于被别的网站采集内容,而搜索引擎的原创保护也还不能好好保护这些原创。往往可以看到一些采集站的权重都是8,对辛辛苦苦的原创者来说,真是极大的不公平。我结合一些零星的技术知识,做了个防采集的本地测试网站,结果显示防采集成功,于是把一些思路分享出来,愿有精力的同学可以继续研究下去。
由于防采集的配套很复杂,所以我只是做了本地测试,并没有线上实践,并且不保证其稳定性,只是思想分享而已。有兴趣的同学继续往下看。

说说原理:
因为现在的采集工具,一般都是通过分析源代码,拿出源代码里面的文字内容(此种居多),或者拿到里面特定的文件。但是如果是通过访问网页,则是拿出网页里面所有的内容,所以我们可以通过这种差异性来做到防采集。
1、判断ip
因为最后要封禁采集者,那最直接的办法就是封禁其IP地址。但是为了不影响蜘蛛,所以这里需要先做ip判断,遇到蜘蛛ip,不做限制,其他ip,进入防采集规则。需要注意的是,这里不能通过ua去识别,必须通过ip去识别。百度有识别方法,360有ip列表,至于其他,根据ip断加一些吧,我没有深入研究。
2、统计页面上文件数量
主要是页面上有多少个图片,有多少个css和js文件。把他们的数量统计出来,然后通过某些途径传递到另外的地方,并附带上当前访问的网页url。
3、统计用户访问
当用户访问页面后,对访问的网页数量、图片数量、css和js文件数量进行统计(类似于日志那种统计)。
由于你可能未必能拿到网站日志,这种情况的话,图片、css和js都可以走后端语言(如php),通过后端语言把访问数量传递到另外的地方,并附上当前访问的网页url
4、在每个网页前面加上限制的代码
这个是为后面限制ip而用的,相当于一个开关
5、对网页和文件访问传过来的数据进行统计分析
只要确定不是蜘蛛,那么原则上网页和文件的访问,应该符合当初页面统计的数量比。但为了防止部分文件传输失败,或者查看源代码等情况造成的数量比不对等,所以在判断的时候,我们可以加个百分比。在次之前,我们可以在页面里加个访问次数统计,如果数量少于一定的数量,我们不做防采集的限制,这样就可以防止数量太少造成的比例失衡的情况。然后我们还要加个最大次数,因为正常人访问一个网站的数量肯定是有上限的,所以我们就需要先设定个访问次数区间数量,在区间内做防采集规则。超过区间则自动禁止ip。也因此,这个最大值一定要大一些。
6、限定ip
第五步已经可以判断是否为正常访问了,对非正常的访问可以自动禁止其ip。
7、其他限定
比如要求访问必须要有UA等,这类的都是基础的,对于高级的人来说,没多大用处的。
8、对方换ip
换不换ip对次方法是无效的。因为我们给了可以采集的数量,所以每个新的ip都可以获得一定量的内容,只有超过一定量的时候才触发防采集规则。但对于采集者来说,每个ip获得的那点内容——太少了。所以除非他有用不完的ip,否则是拿不到网站所有内容的。
9、网页禁止
可以用css、js给网站加上禁止选择文字、禁止右键功能的代码

防采集,这个没有绝对的保证,只有不断加大难度之说。世上的攻防基本如此。我通过上面的方法,已经成功本地测试,当采集者采集我20篇内容后会自动禁止ip。换ip后同样如此。我们测试用的是火车头。
此套方法是成功的,就是配置比较麻烦,所以商业上暂时没法很好地运用。但在如今采集之风盛行的时代,相信这必定是未来趋势。

最后说下作者做此实验增加的东西(作者使用php):
1、图片php文件,用来处理所有的图片请求和统计
2、css的php文件,用来处理所有的css文件请求和统计
3、js的php文件,用来处理所有的js文件请求和统计
4、网页统计php文件,用来分析网页里面文件的数量
5、禁止ip的php文件,用来判断是否采集和生效禁止ip的功能(分析6的log文件)
6、生成的log文件,用于存储前面1/2/3/4传递过来的数据
以上都不是太难,唯独就是计算部分,需要保证一些意外情况的正常访问(容错),其他都比较简单。如果访问量大的网站,数据存入数据库比写入log更好些吧。
以下是实验代码,因为不需要高级功能,并且是实验,所以很粗糙。

网页文件(index.php):
<html>
<head>
<meta charset="utf-8">
<title><?php echo $_GET['id'];?></title>
<style>
body{-moz-user-select: none;-webkit-user-select: none;-ms-user-select: none;-khtml-user-select: none;user-select: none;}
img{display:block}
</style>
</head>
<body oncontextmenu=self.event.returnValue=false onselectstart="return false">

<?php
include 'fobFetch.php';
$web='';
if(isset($_GET['id']) && $_GET['id']){
$id=$_GET['id'];
$web.= '<div>hi同学,这是第'.$id.'页,请你不要随便乱采集</div>';
$web.= '<img src="info/'.$id.'.jpg"><br />'."\n";
$web.= '<img src="info/'.($id+1).'.jpg"><br />'."\n";
$web.= '<link rel="stylesheet" type="text/css" href="info/'.$id.'.css" />'."\n";
$web.= '<script type="text/javascript" src="info/'.$id.'.js"></script>'."\n";
}
else{
$web.= '<div>这是首页</div></body></html>';
}

preg_match_all("/<img[^>]+\.jpg[^>]*>/is",$web,$t1);
preg_match_all("/<link[^>]+\.css[^>]*>/is",$web,$t2);
preg_match_all("/<script[^>]+\.js[^>]*>/is",$web,$t3);

$img_num=count($t1[0]);
$css_num=count($t2[0]);
$js_num=count($t3[0]);

echo mb_convert_encoding($web, 'HTML-ENTITIES', 'UTF-8');
include 'fetch.php';
?>
</body>
</html>
统计信息文件(fetch.php):
<?php
$ip=$_SERVER['SERVER_ADDR'];//IP 后面禁止就是ip
$method=$_SERVER['REQUEST_METHOD'];//请求方式,可以限定部分访问方式
$time=$_SERVER['REQUEST_TIME'];//请求时间,用来统计一段时间的访问数量
$ua=@$_SERVER['HTTP_USER_AGENT'];//浏览器UA
$uri=$_SERVER['REQUEST_URI'];//请求的uri,不同文件的不同

$txt=$ip.'->'.$referer.'->'.$method.'->'.date("YmdHi",$time).'->'.$ua.'->'.$uri;
if(isset($img_num)){
$txt.='->fileCount->img:'.$img_num.'|css:'.$css_num.'|js:'.$js_num;
}
$txt.=PHP_EOL;
$root=str_replace('\\','/',dirname(__FILE__));
$fp=fopen($root.'/log.txt','a');
fwrite($fp,$txt);
fclose($fp);
?>
封禁ip和判断文件(fobFetch.php):
<?php
$ip=$_SERVER['SERVER_ADDR'];

$count_img=0;
$count_css=0;
$count_js=0;
$count_page_img=0;
$count_page_css=0;
$count_page_js=0;


$log=file_get_contents('log.txt');
$arr=explode("\n",trim($log));
foreach($arr as $v){
$v=trim($v);
if(preg_match("/^$ip.*?\.jpg$/i",$v)){$count_img+=1;}
if(preg_match("/^$ip.*?\.css$/i",$v)){$count_css+=1;}
if(preg_match("/^$ip.*?\.js$/i",$v)){$count_js+=1;}
if(preg_match("/^$ip.*?fileCount->([^\n]+)$/i",$v,$tt)){
$brr=explode('|',$tt[1]);
foreach($brr as $val){
$crr=explode(':',$val);//print_r($crr);
if($crr[0]=='img'){$count_page_img+=$crr[1];}
if($crr[0]=='css'){$count_page_css+=$crr[1];}
if($crr[0]=='js'){$count_page_js+=$crr[1];}
}
}
}


if($count_page_img && $count_page_css && $count_page_js){
if($count_page_img>10 && $count_page_css>5 && $count_page_js>5){
if($count_img && $count_css && $count_js){
$img_bi=$count_page_img/$count_img;
$css_bi=$count_page_css/$count_css;
$js_bi=$count_page_js/$count_js;

if($img_bi>3){echo '<div>采集?</div></body></html>';exit;}
if($css_bi>3){echo '<div>采集?</div></body></html>';exit;}
if($js_bi>3){echo '<div>采集?</div></body></html>';exit;}
}
else{
echo '<div>采集?</div></body></html>';exit;
}
}
else{}
}
?>

图片统计文件(img.php):
<?php
header("Content-type: image/jpg");
readfile($img_id.".jpg");
include '../fetch.php';
?>

css统计文件(css.php):
<?php
echo file_get_contents('1.css');
include '../fetch.php';
?>

 js统计文件(js.php):
<?php
echo file_get_contents('1.js');
include '../fetch.php';
?>
log.txt是自动生成出来的,大概看下内容样子(log.txt):
 
 
最后,祝愿各位防采集成功!
本文为张安林原创,转载请注明出处 http://www.zhanganlin.com/jishu/11
SEO网站优化
建站技术
网站运营