日期:2014-05-17  浏览次数:21118 次

lucene.Net--学习笔记(3)---C#'网络爬虫' 源码详解

我们知道,要想对数据进行检索,最基本也是最重要的东西就是数据本身了。

本章介绍如何获取大量的网页信息。

相信大家都听说过‘网络爬虫’,我们正是通过这种方式搜集网页的。

 

一、下面首先简单的介绍一下网络爬虫的基本结构:

 

简单的讲就是:

1、从一个url开始搜索,将这个页面上的所有链接保存,放入一个queue中。

2、接着从这个queue中取出一个url,重复第1步

 

这个过程类似于BFS(广度优先搜索)。(为了防止url被重复使用,这里可以用两个集合分别存放已下载与未下载的url)。

由于下载网页的速度与网速有关,cpu的时间大部分时间都消耗到了等待上面,因此,这里的网络爬虫采用的是多线程的方式。

 

二、分析网络爬虫的源码:

首先对程序各个类进行简要的讲解:

Cyh_HttpServer类:

 

该类中只有一个方法public string GetResponse(string url)功能是对指定的url获取该页面的html,实现该功能必须解决以下几个问题:

1.如何获取指定urlhtml

其实实现该功能很简单,在C#中通过HttpWebResponse类的调用就能实现,具体方法是:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Stream reader = response.GetResponseStream();

 

然后从reader流中读取内容就行了

 

2.编码问题,网页通常使用utf-8gb2312进行编码,如果程序在读取流时使用了错误的编码会导致中文字符的错误

 

3.对于有些页面的html可能会非常大所以我们要限制大小,在程序中最在读取不会超过100k。

 

代码如下:

 

/// <summary>
    /// <para>HTTP服务类</para>
    /// 由于在程序外该类是不可见的,所以声明时用了internal.
    /// </summary>
    internal class Cyh_HttpServer
    {