火车采集器软件交流官方论坛

 找回密码
 加入会员
搜索
火车采集器V9版免费下载火车浏览器 - 可视采集,万能群发,全自动脚本工具
楼主: faunus

采集原理(不要跟贴,谢谢。)

[复制链接]
 楼主| 发表于 2008-11-1 21:59:22 | 显示全部楼层

反采集原理

集程序的主要步骤如下:

一、获取被采集的页面的内容
二、从获取代码中提取所有用的数据
这种办法,比较流行的采集器就是火车头的2.1版本,今天我也测试了一下这个版本,用着还是不错;它的例程上面讲的是采集落伍的贴子,我发现落伍对此还是非常大方的,虽然discuz程序针对采集也采取了反采集的策略,但落伍对此并没有限制,大家可以很方便的采集,这我不得不佩服鱼的经营策略!当然,就算有人把落伍再复制一份,也不可能产生第二个落伍的。

我参照火车采集器的例程,也试了一下采集落伍的几个贴子,做试验用;发现也没费多少周折,就成功了;看来,这采集器的功能确实非常厉害,这样来做垃圾站的话,确实很快就可以把内容填充得丰富多彩的!但在试用的过程中也发现,霏凡的和赢政的,有些问题,主要问题还是在有些步骤,限制了cookie验证,造成不能使真正的页面显出来,以致于无法读出全部正文,如果没有正文,当然就没有办法来筛选内容了;霏凡用的是phpwind,赢政用的是discuz,我想,不管是网站方面还是程序方面,应该是做了限制的。有空再多琢磨一下,这两个网站的休闲版块,内容还是很不错的,呵!

介绍完采集器的祥细原理后,就开始说一下防采集的策略。

目前防采集的方法有很多种,先介绍一下常见防采集策略方法和它的弊端及采集对策:

一、判断一个IP在一定时间内对本站页面的访问次数,如果明显超过了正常人浏览速度,就拒绝此IP访问
弊端:
1、此方法只适用于动态页面,如:asp\jsp\php等...静态页面无法判断某个IP一定时间访问本站页面的次数
2、此方法会严重影响搜索引擎蜘蛛对其收录,因为搜索引擎蜘蛛收录时,浏览速度都会比较快而且是多线程。此方法也会拒绝搜索引擎蜘蛛收录站内文件
采集对策:只能放慢采集速度,或者不采
建议:做个搜索引擎蜘蛛的IP库,只允许搜索引擎蜘蛛快速浏览站内内容。搜索引擎蜘蛛的IP库的收集,也不太容易,一个搜索引擎蜘蛛,也不一定只有一个固定的IP地址。
评论:此方法对防采集比较有效,但却会影响搜索引擎对其收录。

二、用javascript加密内容页面

弊端:此方法适用于静态页面,但会严重影响搜索引擎对其收录情况,搜索引擎收到到的内容,也都是加密后的内容
采集对策:建议不采,如非要采,就把解密码的JS脚本也采下来。
建议:目前没有好的改良建议
评论:建议指望搜索引擎带流量的站长不要使用此方法。

三、把内容页面里的特定标记替换为”特定标记+隐藏版权文字“

弊端:此方法弊端不大,仅仅会增加一点点的页面文件大小,但容易反采集
采集对策:把采集来的含有隐藏版权文字内容的版权文字替掉,或替换成自己的版权。
建议:目前没有好的改良建议
评论:自己感觉实用价值不大,就算是加上随机的隐藏文字,也等于画蛇添足。


四、只允许用户登陆后才可以浏览
弊端:此方法会严重影响搜索引擎蜘蛛对其收录
采集对策:目前落伍已经有人发了对策文章 ,具体对策就看这个吧《ASP小偷程序如何利用XMLHTTP实现表单的提交以及cookies或session的发送》
建议:目前没有好的改良建议
评论:建议指望搜索引擎带流量的站长不要使用此方法。不过此方法防一般的采集程序,还是有点效果的。

五、用javascript、vbscript脚本做分页
弊端:影响搜索引擎对其收录
采集对策:分析javascript、vbscript脚本,找出其分页规则,自己做个对应此站的分页集合页即可。
建议:目前没有好的改良建议
评论:感觉懂点脚本语言的人都能找出其分页规则

六、只允许通过本站页面连接查看,如:Request.ServerVariables("HTTP_REFERER")
弊端:影响搜索引擎对其收录
采集对策:不知道能不能模拟网页来源。。。。目前我没有对应此方法的采集对策
建议:目前没有好的改良建议
评论:建议指望搜索引擎带流量的站长不要使用此方法。不过此方法防一般的采集程序,还是有点效果的。

从以上可以看出,目前常用的防采集方法,要么会对搜索引擎收录有较大影响,要么防采集效果不好,起不到防采集的效果。那么,还有没有一种有效防采集,而又不影响搜索引擎收录的方法呢?那就请继续往下看吧,精彩的地方马上呈献给大家。

下面就是我的防采集策略,防采集而又不防搜索引擎

从前面的我讲的采集原理大家可以看出,绝大多数采集程序都是靠分析规则来进行采集的,如分析分页文件名规则、分析页面代码规则。

一、分页文件名规则防采集对策

大部分采集器都是靠分析分页文件名规则,进行批量、多页采集的。如果别人找不出你的分页文件的文件名规则,那么别人就无法对你的网站进行批量多页采集。
实现方法:
我认为用MD5加密分页文件名是一个比较好的方法,说到这里,有人会说,你用MD5加密分页文件名,别人根据此规则也可以模拟你的加密规则得到你的分页文件名。

我要指出的是我们加密分页文件名时,不要只加密文件名变化的部分
如果I代表分页的页码,那么我们不要这样加密
page_name=Md5(I,16)&".htm"

最好给要加密的页码上再跟进一个或多个字符,如:page_name=Md5(I&"任意一个或几个字母",16)&".htm"

因为MD5是无法反解密的,别人看到的会页字母是MD5加密后的结果,所以加人也无法知道你在 I 后面跟进的字母是什么,除非他用暴力****MD5,不过不太现实。

二、页面代码规则防采集对策

如果说我们的内容页面无代码规则,那么别人就无法从你的代码中提取他们所需要的一条条内容。
所以我们要的这一步做到防采集,就要使代码无规则。
实现方法:
使对方需要提取的标记随机化
1、定制多个网页模板,每个网页模板里的重要HTML标记不同,呈现页面内容时,随机选取网页模板,有的页面用CSS+DIV布局,有的页面用table布局,此方法是麻烦了点,一个内容页面,要多做几个模板页面,不过防采集本身就是一件很烦琐的事情,多做一个模板,能起到防采集的作用,对很多人来说,都是值得的。
2、如果嫌上面的方法太麻烦,把网页里的重要HTML标记随机化,也可以。

做的网页模板越多,html代码越是随机化,对方分析起内容代码时,就越麻烦,对方针对你的网站专门写采集策略时,难度就更大,在这个时候,绝大部分人,都会知难而退,因为这此人就是因为懒,才会采集别人网站数据嘛~~~再说一下,目前大部分人都是拿别人开发的采集程序去采集数据,自己开发采集程序去采集数据的人毕竟是少数。

还有些简单的思路提供给大家:
1、把对数据采集者重要,而对搜索引擎不重要的内容用客户端脚本显示
2、把一页数据,分为N个页面显示,也是加大采集难度的方法
3、用更深层的连接,因为目前大部分采集程序只能采集到网站内容的前3层,如果内容所在的连接层更深,也可以避免被采集。不过这样可能会给客户造成浏览上的不便。
如:
大多网站都是 首页----内容索引分页----内容页
如果改成:
首页----内容索引分页----内容页入口----内容页
注:内容页入口最好能加上自动转入内容页的代码

<meta http-equiv="refresh" content="6;url=内容页(http://www.jz123.cn)">
其实,只要做好防采集的第一步(加密分页文件名规则),防采集的效果就已经不错了,还是建议两条反采集方法同时使用,给采集者增加采集难度,使得他们知难页退。
 楼主| 发表于 2008-11-2 20:55:15 | 显示全部楼层

转一个验证码识别的思路

雖然不是所有驗證碼都能識別(如QQ的變形漢字驗證碼是不太可能用軟體識別的,個人覺得),但還是有很多驗證碼可以用軟體來識別的。

下面以天涯博客裡的評論驗證碼為例,說明驗證碼識別的基本思路和方法:

                  (網頁截圖)

第一步、獲取驗證碼圖片
C#可以用HttpWebRequest類GET驗證碼的網址,得到返回的資料流,再將資料流值賦給Bitmap變量。在Winform裡放一個PictureBox控件,將它的Image屬性指定為Bitmap變量,就可以顯示出驗證碼圖片了。
也可以使用Bitmap的Save方法將圖片保存成Bmp檔案。
    Stream resStream = response.GetResponseStream();//得到驗證碼資料流
    Bitmap sourcebm = new Bitmap(resStream);//初始化Bitmap圖片
在Photoshop中將驗證碼圖片放大1600%,如下:


第二步、將驗證碼圖片去色(將彩色轉換為灰度)
去色是為了進一步做成黑白雙色圖片。
    Color c = sourcebm.GetPixel(x、y);
    int luma = (int)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11);//轉換灰度的算法
    sourcebm.SetPixel(x、y、Color.FromArgb(luma、luma、luma));


第三步、去雜色,轉換為黑白圖片
從灰度圖片中可以看出,數字的顏色比較深,而雜色都是比較淺,所以可以設定一個臨界顏色值,顏色高於或等於這個值的設置為白色,低於這個值的設置為黑色。
    Color c = sourcebm.GetPixel(x、y);
    if (c.R >= critical_value)
        sourcebm.SetPixel(x、y、Color.FromArgb(255、255、255));
    else
        sourcebm.SetPixel(x、y、Color.FromArgb(0、0、0));


第四步、動態得到每個數字的邊界


for (int x = 0; x < sourcebm.Width; x++)
{
    myColumn = true;
    for (int y = 0; y < sourcebm.Height; y++)
    {
        Color c = sourcebm.GetPixel(x、y);
        if (c.R == 0 && charStart == false)//第一次出現黑點
        {
            widthStartX[charNum] = x;
            charStart = true;
            break;
        }
        if (c.R == 0 && charStart == true)//後續出現黑點
        {
            myColumn = false;
            break;
        }
    }
    if (myColumn == true && charStart == true && widthStartX[charNum] < x)//如果當列沒有黑點並且前面出現過黑點還沒結束
    {
        widthEndX[charNum] = x - 1;
        charStart = false;
        charNum++;
    }
    if (charStart == true && myColumn == false && x == (bmp.Width - 1))//如果開始出現黑點了,並且最後一列也有黑點
    {
        widthEndX[charNum] = x;
        charStart = false;
        charNum++;
    }
}

五、得到每個字符的特徵碼
在每個字符的邊界內,檢測每個像素,如果象素為白色則為「0」,如果象素為黑色則為「1」,將「0」「1」連起來就是該數字或字符的特徵碼。
    Color c = sourcebm.GetPixel(x、y);
    if (c.R == 0)
        str = str + "1";
    else
        str = str + "0";

六、完成驗證碼圖片的識別
將獲取的特徵碼和對應的數字或字符保存起來,下次再將新獲取的特徵碼跟保存的特徵碼對比,如果相同則提取對應的數字或字符,完成驗證碼的識別。
 楼主| 发表于 2008-11-3 19:45:22 | 显示全部楼层

分析HTML

.NET 框架类库本身没有提供工具分析HTML

常用的做法是:
1、用正则表达式
2、浏览器控件
3、MSHTML组件
4、SgmlReader。SgmlReader可以将HTML转化成XML,然后你就可以使用System.Xml命名空间下的类对文件进行查询。

推荐一个
5、Html Agility Pack
CodePlex上的项目,是原生的.NET项目,不依赖MSHTML或者ActiveX/COM 对象。其中的HtmlDocument可以加载任何HTML文件(即使该文件是不well-formed的HTML),然后允许你使用类似于System.Xml的对象模型对文件进行查询。
 楼主| 发表于 2008-11-3 21:38:42 | 显示全部楼层

获取CookieContainer

通过COM的方法来实现的

1using System;
2using System.Runtime.InteropServices;
3using System.Text;
4using System.Net;
5
6namespace NExplus.NSiter
7{
8    /**////
<summary>
9    /// 获取Cookie的方法类。
10    ///
</summary>

11
public
class CookieManger
12    {
13        /**////
<summary>
14        /// 通过COM来获取Cookie数据。
15        ///
</summary>
16        ///
<param name="url">当前网址。</param>
17        ///
<param name="cookieName">CookieName.</param>
18        ///
<param name="cookieData">用于保存Cookie Data的<see cref="StringBuilder"/>实例。</param>
19        ///
<param name="size">Cookie大小。</param>
20        ///
<returns>如果成功则返回<c>true</c>,否则返回<c>false</c></returns>

21        [DllImport("wininet.dll", SetLastError =
true)]
22        public
static
extern
bool InternetGetCookie(
23          string url, string cookieName,
24          StringBuilder cookieData, ref
int size);
25        /**////
<summary>
26        /// 获取当前<see cref="Uri"/><see cref="CookieContainer"/>实例。
27        ///
</summary>
28        ///
<param name="uri">当前<see cref="Uri"/>地址。</param>
29        ///
<returns>当前<see cref="Uri"/><see cref="CookieContainer"/>实例。</returns>

30
public
static CookieContainer GetUriCookieContainer(Uri uri) {
31            CookieContainer cookies =
null;
32
33            // 定义Cookie数据的大小。
34
int datasize =
256;
35            StringBuilder cookieData =
new StringBuilder(datasize);
36
37            if (!InternetGetCookie(uri.ToString(), null, cookieData,
38              ref datasize)) {
39                if (datasize <
0)
40                    return
null;
41
42                // 确信有足够大的空间来容纳Cookie数据。
43                cookieData =
new StringBuilder(datasize);
44                if (!InternetGetCookie(uri.ToString(), null, cookieData,
45                  ref datasize))
46                    return
null;
47            }
48
49
50            if (cookieData.Length >
0) {
51                cookies =
new CookieContainer();
52                cookies.SetCookies(uri, cookieData.ToString().Replace(';', ','));
53            }
54            return cookies;
55        }
56
57    }
58}
 楼主| 发表于 2008-11-6 23:23:53 | 显示全部楼层
An Elementary HTML Parser
    http://www.codeproject.com/csharp/htmlparser.asp

    WebWagon – an HTML Container Class
    http://www.vsj.co.uk/dotnet/display.asp?id=389

    Regex
    http://www.regexlib.com/Search.aspx

    Parsing html markup text using MSHTML
    http://www.eggheadcafe.com/articles/parsinghtml.asp

    Weather Screen Scraping with C#
    http://www.csharphelp.com/archives2/archive435.html

    Searcharoo Too : Populating the Search Catalog with a C# Spider
    http://www.users.bigpond.com/con ... earch/SearcharooV2/

    SearchEngine-A .NET crawler, indexer and search engine software from Active Data Online
    http://www.activedataonline.com.au/searchengine.html

    .NET Html Agility Pack: How to use malformed HTML just like it was well-formed XML...
    http://blogs.msdn.com/smourier/archive/2003/06/04/8265.aspx

    Identifying, Structuring and Searching HTML Objects
    http://www.nada.kth.se/utbildnin ... reus_ivar_05043.pdf

    Working with text files in Microsoft .NET
    http://www.automatedqa.com/techpapers/textfiles_net.asp

    Parsing HTML in Microsoft C#
    http://www.developer.com/net/csharp/article.php/10918_2230091_2

    C#/VB - Automated WebSpider / WebRobot
    http://www.codeproject.com/csharp/DavWebSpider.asp
 楼主| 发表于 2008-11-8 16:51:11 | 显示全部楼层

CharacterSet源码

public string CharacterSet
{
get
{
this.CheckDisposed();
string text1 = this.m_HttpResponseHeaders.ContentType;
if ((this.m_CharacterSet == null) && !ValidationHelper.IsBlankString(text1))
{
this.m_CharacterSet = string.Empty;
string text2 = text1.ToLower(CultureInfo.InvariantCulture);
if (text2.Trim().StartsWith("text/"))
{
this.m_CharacterSet = "ISO-8859-1";
}
int num1 = text2.IndexOf(";");
if (num1 > 0)
{
while ((num1 = text2.IndexOf("charset", num1)) >= 0)
{
num1 += 7;
if ((text2[num1 - 8] == ';') || (text2[num1 - 8] == ' '))
{
while ((num1 < text2.Length) && (text2[num1] == ' '))
{
num1++;
}
if ((num1 < (text2.Length - 1)) && (text2[num1] == '='))
{
num1++;
int num2 = text2.IndexOf(';', num1);
if (num2 > num1)
{
this.m_CharacterSet = text1.Substring(num1, num2).Trim();
break;
}
this.m_CharacterSet = text1.Substring(num1).Trim();
break;
}
}
}
}
}
return this.m_CharacterSet;
}
 楼主| 发表于 2008-11-8 17:15:35 | 显示全部楼层

DotLucene

DotLucene官方网站:http://www.dotlucene.net

Lucene 本身不支持中文的索引,
但它良好的架构设计,
使得只需根据语言词法分析接口,
增加一个中文解析器即可实现中文的索引。
这一工作是由车东(http://www.chedong.com/)完成的:
WebLucene 中提供了 CJKTokenizer,可以分析东亚文字

目前基于Lucene.Net/DotLucene的项目有:
Lookout - Outlook插件,可以搜索邮件,联系人,计划任务,会议和文件夹。该公司已经被微软收购。[免费]
.Text - 著名的博客引擎[开源]。
Beagle – Mono基于DotLucene开发的桌面搜索引擎[开源]。
Ascirum - Windows SharePoint Services文档库的搜索解决方案 [商业]。
Cuyahoga - .NET 网站架构[开源]。
Tustena CRM - 客户关系管理服务器 [开源]。
Pali Text Reader - Pali 文本阅读程序软件是读取和为经典佛教pali 文本的学习工具[开源]。
SlopeTalk - 一个布鲁克林 (美国纽约市西南部的一区)斜坡公园的路线向导。
 楼主| 发表于 2008-11-8 18:53:09 | 显示全部楼层

分词

要想写支持dotlucene的中文分词程序一定要看的是这个Lucene.Net.Analysis.Cn,它是dotlucene1.3版时处理中文的分词组件。只要继承Analyzer,TokenFilter,Tokenizer这三个类即可,最低要求是Analyzer和Tokenizer这两个类,因为TokenFilter是用来处理噪声词的(就是单个的“的”“啊”“是”之类的词),暂时可以不管它。
   
        Analyzer的继承是最简单的,只有3,4行代码,只需覆盖一个非常简单的方法TokenStream,参考我写的ShootAnalyzer即可,Tokenizer的继承稍微复杂一点点,因为这个是处理分词过程的类,不过实际上要是你的分词部分已经写好了的话也就几行代码万事!要覆盖的方法除了构造方法就是Next()方法,它的用意是返回一个词(Token),有点像数据库的游标一样,要是返回null就表示没有词了。Token的构造方法也很简单,返回一个字符串,和前后位置即可。大家如果有耐心的话可以仔细读一下Lucene.Net.Analysis.Cn的代码,Next()一次就是返回一个字而已。稍微把Segment.cs改造一下就可以很好地处理这个问题了,目前我的方法是增加了一个Ends属性,它存储的是一个int组,内容就是每个词的结束符地址。具体代码请大家参考一下我的ShootTokenizer吧,也就10来行代码,注释基本清晰。

        最后要说一下,java的lucene下面有很多支持中文的分词程序,如果有需要的话可以尝试移植一下.所有代码请到http://www.shootsoft.net下载如果访问比较慢的话可以到这里下载:http://code.google.com/p/shootsearch/


DotLucene源码浅读笔记(1)补遗:编写简单中文分词器ChineseAnalyzer
http://www.cnblogs.com/kwklover/archive/2006/10/24/537813.html

DotLucene源码浅读笔记(1) : Lucene.Net.Analysis
http://www.cnblogs.com/kwklover/archive/2006/06/25/435421.html

分词主要类(概念)的简单说明:



类名
功能说明
Analyzer
分析器基类,词法过滤和分析的类,即把文本分解成TokenStream,即Token的序列。Analyzer只是做包装,主要还是Tokenizer在起作用
StopAnalyzer
Analyzer扩展类之一,SimpleAnalyzer功能基础上加上过滤词功能
StandardAnalyzer
Analyzer扩展类之一,也是最常用的分析器,支持中文,日文等,单字切分。
SimpleAnalyzer
Analyzer扩展类之一,将除去字符之外的符号全部过滤掉,并且将所有的字符小写(大写)化
Token
DotLucene最基本的单位,以单字切分则每个单字为一个Token,如果以中文分词来切分则每个词为一个Token
TokenStream
Token的序列
Tokenizer
继承于TokenStream,用于分词。一般扩展的自定义的分词都应该继承这个类


StandardTokenizer
Tokenizer扩展类之一,也是最常用的,支持中文,基于单字切分
TokenFilter
继承于TokenStream的子类,用于过滤。一般拓展的自定义的过滤类都应该继承该类
StandardFilter
TokenFilter拓展类之一,过滤英文字符的复数和dot(.)号.
LowerCaseFilter
对所有英文小写化
StopFilter
过滤掉指定的过滤词


[ 本帖最后由 faunus 于 2008-11-8 18:57 编辑 ]
 楼主| 发表于 2008-11-11 13:11:56 | 显示全部楼层

XML

占位
信息保存
信息转义
 楼主| 发表于 2008-11-13 13:23:19 | 显示全部楼层

乱七八糟

asp.net生成高清晰缩略图http://blog.csdn.net/wangjun8868/archive/2008/11/12/3283493.aspx

.NET下的动态代码编译探索http://blog.csdn.net/21aspnet/archive/2008/11/12/3280512.aspx

C#如何编程方式获取计算机主板序列号http://blog.csdn.net/netcoder/archive/2008/11/11/3279001.aspx
您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

QQ|手机版|Archiver|火车采集器官方站 ( 皖ICP备06000549 )

GMT+8, 2024-11-24 18:30

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表