月亮代表我的心

个人博客,跟月亮无关,跟代表无关,无关谁的心

网站防采集防不慎防,采集技巧分享

各位站长都不希望自己从网络上辛苦整理回来的或者原创的一些资源被采集,于是便想方设法地对网站做了一些防采集的工作,但有些时候还是防不慎防,下面分享一下我的采集技巧。

我们来看一个简单的页面:http://www.5566.net/gov-gd.htm,这是中国精彩网址站其中的一个页面。从表面上看,要采集这个页面不是件难事,这仅是超链接的采集,即HTML源代码中的:网站名称,但查看该页面HTML源代码发现网站地址并不是明文显示,以下是源代码的一小片段。

1
2
3
4
<td width=25%><a href=# onclick="n8(412);return false;" target=_self>广东省人民政府</a></td>
<td width=25%><a href=# onclick="n8(652);return false;" target=_self>人大</a></td>
<td width=25%><a href=# onclick="f0(616);return false;" target=_self>政协</a></td>
<td width=25%><a href=# onclick="v0(312);return false;" target=_self>共青团</a></td>

通过分析可以发现,超链接href属性均为#,并且都加上了onclick事件,事件处理的函数如n8(412)、n8(652)、f0(616)、v0(312),这些函数名称是不规则的,很明显,网站地址将在这些函数中生成。

现在分析一下这些函数,只需要简单了解即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
z0=new Array("0","www.gdcic.net/","www.gdaudit.gov.cn/","省略部分代码");
//z0,数组,不规则地保存了页面里所有的网站链接地址
//函数分析,除红色代码部分,其余代码无需细看。
//绿色代码部分是解密算法,解密出来的值是链接名称所对应的链接地址在z0数组中的下标
//蓝色代码部分是条件判断语句,访问正常则执行红色代码部分
//红色代码部分是获取网站地址,然后通过window.open函数从新窗口访问这个网站
function f0(p8) {
    <span style="color: #99cc00;"> s7='6688.5566';
    g3=''+document.URL;
    c8="=''+document.URL;";
    t5='4411.5566';
    i7=''+document.domain;
    m2="=''+document.domain;";
    a4=i7.lastIndexOf('.');
    h3=0+t5.charAt(2);
    q4=0+t5.charAt(0);
    g8=0+c8.charCodeAt(6);
    s8=0+i7.charAt(a4-1);
    x5=0+i7.charAt(a4-3);
    q3=0+m2.charCodeAt(5);
    t0='gov-gd';</span>
    <span style="color: #0000ff;">if(g3.indexOf('5566')>=0&&g3.indexOf('gov-gd')>=0) {</span>
    <span style="color: #ff0000;">window.open('http://'+z0[(p8-s8-q4-h3-q3-g8-90)/x5],'');</span>
    <span style="color: #0000ff;">}</span>
}

类似这种形式的防采集网站,可以通过改写window.open函数以获取链接地址,然后再进行后续的采集工作,以下是我在winform中实现的代码片段,文章最后附完整工程下载。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var item = '';//超链接对象
window.open = function(url) {
    //给超链接href属性赋值,这个值从函数window.open中的参数获得,
    //这样,window.open方法变成赋值操作了,而不是从新窗口访问这个链接。
    item.href = url;
}
function setUrls() {
    var as = document.getElementsByTagName('a');
    for(var i=0, k=as.length; i<k; i++) {
        item = as[i];
        if(item.onclick && item.innerHTML) item.onclick();
    }
}
setUrls();

将上述代码在采集页面中执行一次,这样,即可为链接的属性href赋予相应的值,进行采集的时候,结果将不再是#,而是真实的链接地址。

完整的测试代码下载(构建于Microsoft Visual Studio 2008 + .Net Framework 3.5,需添加引用Microsoft.mshtml)

点赞
  1. 高飞说道:

    学习了
    只是不知道是否对SEO不利呢
    搜索引擎抓取链接恐怕不利吧

  2. 无尘说道:

    学习了,不错。

  3. 收藏了。。。。

  4. itopdog说道:

    真是学无止境!

  5. yutoshindo说道:

    采集无非是提高访问量呗,
    某些深谙seo之道的猥琐人士不靠采集,甚至没有什么有价值的内容,而只是单凭seo普通的网页赚了不少钱……

  6. 傻逼博客说道:

    拿走~` 哈哈`

  7. 9fun说道:

    没什么采集不到的。。大不了网页另存为,然后手动复制

    1. miracle说道:

      这可不一定,像http://www.5566.net/gov-gd.htm这个页面,即使另存为,也需要做大量的修改,才可以在本地打开,跟别说采集入库了。

  8. win-google blogs说道:

    不懂这方面的知识,不过还是来学习下

  9. LETCG说道:

    哈哈 这篇真讲究 学了~

  10. 小滔说道:

    貌似不需要采集哈!

  11. 九成说道:

    学习了

发表评论

电子邮件地址不会被公开。 必填项已用*标注