用C#实现蜘蛛/爬虫程序的多线程控制

http://tech.ddvip.com   2007年09月12日    社区交流

内容摘要:本文介绍了爬虫程序实现下载速度慢的可能原因和解决办法。

  1.如何控制线程的数量?

  2.如何防止多线程下载同一网页?

  3.如何判断线程结束?

  4.如何控制线程结束?

  下面就这几个问题提出解决方法:

  1.线程数量我们可以通过for循环来实现,就如同当年初学编程的打点程序一样。

  比如已知用户指定了n(它是一个int型变量)个线程吧,可以用如下方法开启五个线程。

Thread[] downloadThread;
//声名下载线程,这是C#的优势,即数组初始化时,不需要指定其长度,可以在使用时才指定。
这个声名应为类级,这样也就为其它方法控件它们提供了可能
ThreadStart startDownload = new ThreadStart( DownLoad );
//线程起始设置:即每个线程都执行DownLoad()
downloadThread = new Thread[ n ];//为线程申请资源,确定线程总数
for( int i = 0; i < n; i++ )//开启指定数量的线程数
{
downloadThread[i] = new Thread( startDownload );//指定线程起始设置
downloadThread[i].Start();//逐个开启线程
}

  好了,实现控制开启线程数是不是很简单啊?

  2.下面出现的一个问题:所有的线程都调用DonwLoad()方法,这样如何避免它们同时下载同一个网页呢?

  这个问题也好解决,只要建立一下Url地址表,表中的每个地址只允许被一个线程申请即可。具体实现:

  可以利用数据库,建立一个表,表中有四列,其中一列专门用于存储Url地址,另外两列分别存放地址对应的线程以及该地址被申请的次数,最后一列存放下载的内容。(当然,对应线程一列不是必要的)。当有线程申请后,将对应线程一列设定为当前线程编号,并将是否申请过一列设置为申请一次,这样,别的线程就无法申请该页。如果下载成功,则将内容存入内容列。如果不成功,内容列仍为空,作为是否再次下载的依据之一,如果反复不成功,则进程将于达到重试次数(对应该地址被申请的次数,用户可设)后,申请下一个Url地址。主要的代码如下(以VFP为例):

来源:Csdn博客    作者:Felomeng    责编:豆豆技术应用

正在加载评论...