多线程蜘蛛程序的实现

多线程蜘蛛程序是一个很有用的组件, 我在自己开发的Spider Studio中也提供了一个. 在设计上我尽量遵循使用简 单的原则, 大量使用dynamic对象的特性, 使得代码非常精简灵活, 通过17行就能实现一个功能比较齐全的蜘蛛程序. 现 在和大家分享一下:

public void Run()
{
    dynamic link = new ExpandoObject();
    link.Url = "http://news.163.com";
    Spider.AddLink(link);
    Spider.Downloaded += new DownloadedEventHandler((object sender, DownloadedEventArgs e) => {
        Logger.Log(e.Page.Link.Url);
        foreach(var l in e.Page.SubLinks)
        {
            if(l.Depth <= 2) Spider.AddLink(l); //只采集Depth在2以内的网页
        }
    });
    Spider.ErrorOccurred += new ErrorOccurredEventHandler((object sender, ErrorOccurredEventArgs e) => 

{ Logger.Log(e.Error.Message); });
    Spider.Start(10); //启动10个线程运行
    Spider.Wait(); //等待所有线程完成
    Spider.Stop();
}

Spider会用到如下几个对象, 大部分是dynamic的 (这里用JSON来示例):

Link - { Url:"string", Title:"string", Depth:1 }

DownloadedEventArgs - { Page: { Link: { Url:"string", Title:"string", Depth:1 }, Html: "string", SubLinks: [{ Url:"string", Title:"string", Depth:1 }]} }

ErrorOccurredEventArgs - { Error: ExceptionType }

简单来说, 就是:

Link有三个属性: Url (字符串), Title (字符串) 和Depth (整形);

DownloadedEventArgs有一个属性: Page, Page又有三个属性: Page.Link (Link类型), Html (字符串) 和 SubLinks (Link数组);

ErrorOccurredEventArgs有一个属性: Error (Exception类型)

运行情况:

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/extra/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, 多线程
, link
, spider
, page
, 程序link
, 字符串link
一个
多线程有几种实现方法、java多线程实现方式、实现多线程的两种方法、java实现多线程、多线程实现方式,以便于您获取更多的相关知识。

时间: 2025-01-17 21:37:39

多线程蜘蛛程序的实现的相关文章

爬虫/蜘蛛程序的制作(C#语言)

程序 问题是对某一网站或所有网站进行抓取,即下载所有网页.怎么实现呢? 先将问题最小化(转化的思想,转化为小规模,可以解决的问题):如果只有一个网页,怎么下载?问题变地很简单,只要用WebClient/WebRequest(甚至OpenFileDialog都可以)打开Url地址,将数据流存入本地存储器的文件(以相应的扩展名作为扩展名)即可.示例代码如下: string BoardStream;//下载内容存入此变量 Uri url = new Uri( "http://www.163.com&q

构造C#语言的爬虫蜘蛛程序

C#特别适合于构造蜘蛛程序,这是因为它已经内置了HTTP访问和多线程的能力,而这两种能力对于蜘蛛程序来说都是非常关键的.下面是构造一个蜘蛛程序要解决的关键问题: ⑴ HTML分析:需要某种HTML解析器来分析蜘蛛程序遇到的每一个页面. ⑵ 页面处理:需要处理每一个下载得到的页面.下载得到的内容可能要保存到磁盘,或者进一步分析处理. ⑶ 多线程:只有拥有多线程能力,蜘蛛程序才能真正做到高效. ⑷ 确定何时完成:不要小看这个问题,确定任务是否已经完成并不简单,尤其是在多线程环境下. 一.HTML解析

使用C#实现蜘蛛程序

"蜘蛛"(Spider)是Internet上一种很有用的程序,搜索引擎利用蜘蛛程序将Web页面收集到数据库,企业利用蜘蛛程序监视竞争对手的网站并跟踪变动,个人用户用蜘蛛程序下载Web页面以便脱机使用,开发者利用蜘蛛程序扫描自己的Web检查无效的链接--对于不同的用户,蜘蛛程序有不同的用途.那么,蜘蛛程序到底是怎样工作的呢? 蜘蛛是一种半自动的程序,就象现实当中的蜘蛛在它的Web(蜘蛛网)上旅行一样,蜘蛛程序也按照类似的方式在Web链接织成的网上旅行.蜘蛛程序之所以是半自动的,是因为它总

在C#中编写多线程应用程序,简单!

程序|多线程 (欢迎访问www.kunwsoft.com) 以前在使用VB来实现多线程的时候,发现有一定的难度.虽然也有这样那样的方法,但都不尽人意,但在C#中,要编写多线程应用程序却相当的简单.这篇文章将作简要的介绍,以起到抛砖引玉的作用! .NET将关于多线程的功能定义在System.Threading名字空间中.因此,要使用多线程,必须先声明引用此名字空间(using System.Threading;). 即使你没有编写多线程应用程序的经验,也可能听说过"启动线程""

使用Control.Invoke处理多线程应用程序界面

程序|多线程 使用Control.Invoke处理多线程应用程序界面 使用单一线程,在进行大计算量或耗时的操作时,会使界面失去响应.Control.Invoke 提供了一个在工作线程中更新见面的简单办法.该函数会把作为参数的回调函数提交给应用程序的界面进程(一般是主线程)的队列中,等待处理.这样,对界面的操作便无须担心同步.互锁等问题. 以下例子摘自一个局域网资源搜索程序        可以看到,线程池中的工作线程通过调用TreeView的Invoke方法,并提供一个回调函数,来实现对TreeV

用Java实现多线程服务器程序

---- 摘要:在Java出现之前,编写多线程程序是一件烦琐且伴随许多不安全因素的事情.利用Java,编写安全高效的多线程程序变得简单,而且利用多线程和Java的网络包我们可以方便的实现多线程服务器程序. ---- Java是伴随Internet的大潮产生的,对网络及多线程具有内在的支持,具有网络时代编程语言的一切特点.从Java的当前应用看,Java主要用于在Internet或局域网上的网络编程,而且将Java作为主流的网络编程语言的趋势愈来愈明显.实际工作中,我们除了使用商品化的服务器软件外

java 线程池 程序顺序-java多线程时程序运行完成为什么不会自动关闭退出?(木有钱了,求指教)

问题描述 java多线程时程序运行完成为什么不会自动关闭退出?(木有钱了,求指教) 粘贴的大致代码如下: public static void main(String[] args) { int thread=0; ExecutorService pool = Executors.newFixedThreadPool(15);// 创建一个线程池 for (int i =666; i <= 888; i++) { for (int j = 0; j < 19; j++) { MyClass t

java-为什么我写的android多线程下载程序刚开始速度很快,之后越来越慢?

问题描述 为什么我写的android多线程下载程序刚开始速度很快,之后越来越慢? 我写的多线程下载程序,用了8个线程,一次读10240byte个字节. 刚开始前几s下载速度显示可以到600多k/s 但是马上就降到个位数或十几k/s 不是网络问题,因为我用别的东西下载速度都会很快. 如果我暂停后恢复又是前几s会很快,之后速度又掉下来了. 这是为什么呢??? 如何保持java下载速度,谢谢! 还有我该如何平衡线程数与一次下载字节间的关系? 解决方案 我感觉是你开启的线程 不够多的原因 供不应求

c# 多线程-用c#写了个多线程小程序,占用内存不断的增大,虚心求教

问题描述 用c#写了个多线程小程序,占用内存不断的增大,虚心求教 cleanDataTimer.Elapsed += new ElapsedEventHandler(CleanData); cleanDataTimer.Interval = 0.000000000006; cleanDataTimer.Enabled = true; Thread addRCSMemoryData = new Thread(new ThreadStart(AddRCSMemoryDeviceData)); add