在爬虫/蜘蛛制作(C#语言)文中已经介绍了爬虫实现基本思路方法可以说已经实现了爬虫功能只是它存在个效率问题下载速度可能很慢这是两方面原因造成:   
1.分析和下载不能同步进行在爬虫/蜘蛛制作
(C#语言)中已经介绍了爬虫两个步骤:分析和下载在单线程中两者是无法同时进行也就是说分析时会造成网络空闲分析时间越长下载效率越低反的也是样下载时无法同时进行分析只有停下下载后才能进行下步分析问题浮出水面我想大家都会想到:把分析和下载用区别线程进行问题不就解决了吗?
2.只是单线程下载相信大家都有用过网际快车等下载资源经历它里面是可以设置线程数(近年版本默认是10曾经默认是5)它会将文件分成和线程数相同部分然后每个线程下载自己那部分这样下载效率就有可能提高相信大家都有加多线程数提升下载效率经历但细心用户会发现在带宽定情况下并不是线程越多速度越快而是在某
点达到峰值爬虫作为特殊下载工具不具备多线程能力何以有效率可谈?爬虫在信息时代目难道不是快速获取信息吗?所以爬虫需要有多线程(可控数量)同时下载网页
好了认识、分析完问题就是解决问题了:
多线程在C#中并不难实现它有个命名空间:.Threading提供了多线程支持
要开启个新线程需要以下化:
ThreadStart startDownload = ThreadStart( DownLoad );
//线程起始设置:即每个线程都执行DownLoad注意:DownLoad必须为不带有参数思路方法
Thread downloadThread = Thread( startDownload ); //例子化要开启新类
downloadThread.Start;//开启线程  由于线程起始时启动思路方法不能带有参数这就为多线程共享资源添加
了麻烦不过我们可以用类级变量(当然也可以使用其它思路方法笔者认为此思路方法最简单易用)来解决这个问题
知道开启多线程下载思路方法后大家可能会产生几个疑问:
1.如何控制线程数量?
2.如何防止多线程下载同网页?
3.如何判断线程结束?
4.如何控制线程结束?
下面就这几个问题提出解决思路方法:
1.线程数量我们可以通过for循环来实现就如同当年初学编程打点样
比如已知用户指定了n(它是个型变量)个线程吧可以用如下思路方法开启 5个线程
Thread downloadThread;
//声名下载线程这是C#优势即化时不需要指定其长度可以在使用时才指定
这个声名应为类级这样也就为其它思路方法Control控件它们提供了可能
ThreadStart startDownload = ThreadStart( DownLoad );
//线程起始设置:即每个线程都执行DownLoad
downloadThread = Thread[ n ];//为线程申请资源确定线程总数
for( i = 0; i < n; i )//开启指定数量线程数
{
downloadThread[i] = Thread( startDownload );//指定线程起始设置
downloadThread[i].Start;//逐个开启线程
}  好了实现控制开启线程数是不是很简单啊?
2.下面出现个问题:所有线程都DonwLoad思路方法这样如何避免它们同时下载同个网页呢?
这个问题也好解决只要建立下Url地址表表中每个地址只允许被个线程申请即可具体实现:
可以利用数据库建立个表表中有 4列其中列专门用于存储Url地址另外两列分别存放地址对应线程以及该地
址被申请次数最后列存放下载内容(当然对应线程列不是必要)当有线程申请后将对应线程列设定为当前线程编号
并将是否申请过列设置为申请次这样别线程就无法申请该页如果下载成功则将内容存入内容列如果不成功内容
列仍为空作为是否再次下载依据的如果反复不成功则进程将于达到重试次数(对应该地址被申请次数用户可设)后
申请下个Url地址主要代码如下(以VFP为例):
<建立表>
CREATE TABLE (ctablename) ( curl M , ctext M , ldowned I , threadNum I )
&&建立个表ctablename.dbf含有地址、文本内容、已经尝试下载次数、
线程标志(初值为-1线程标志是从0开始整数) 4个字段
<提取Url地址>
cfullname = (ctablename) + '.dbf'&&为表添加扩展名
USE (cfullname) 
GO TOP
LOCATE FOR (EMPTY( ALLTRIM( ctext ) ) AND ldowned < 2 AND
( threadNum = thisNum OR threadNum = - 1) ) 
&&查找尚未下载成功且应下载属于本线程权限Url地址thisNum是当前线程编号
可以通过参数传递得到
gotUrl = curl
recNum = RECNO
IF recNum <= RECCOUNT THEN &&如果在列表中找到这样Url地址
UPDATE (cfullname) SET ldowned = ( ldowned + 1 ) , threadNum =
thisNum WHERE RECNO = recNum &&更新表将此记录更新为已申请即下载次数加1
线程标志列设为本线程编号
<下载内容>
cfulltablename = (ctablename) + '.dbf'
USE (cfulltablename)
SET EXACT _disibledevent= 0; i < n; i )//关闭指定数量n线程数
{
downloadThread[i].Abort;//逐个关闭线程
}  好了个蜘蛛就这样完成了在C#面前它实现原来如此简单
这里笔者还想提醒读者:笔者只是提供了个思路及个可以实现解决方案但它并不是最佳即使这个方案本身也
有好多可以改进地方留给读者研究
最后介绍说明下我所使用环境:
winXP sp2 Pro
VFP 9.0
Visual Studio 2003 .net中文企业版

本文转自 qianshao 51CTO博客,原文链接:http://blog.51cto.com/qianshao/203215,如需转载请自行联系原作者

.NET多线程编程(14)——用C#实现蜘蛛/爬虫程序的多线程控制相关推荐

  1. 蜘蛛程序php,php模仿百度spider蜘蛛爬虫程序例子

    下面来看一个php模仿百度spider蜘蛛爬虫程序例子,这个代码写得比较高级了我就不分析了,大家有需要的可以进入参考一下吧. 自己用PHP写了个爬虫,基本功能已经实现,有兴趣的可以试试 脚本缺点:1. ...

  2. 火车头采集器 采集https网站 以及网站cookie 避免 蜘蛛 爬虫 程序等

    火车头采集器 采集https网站 并不是想象中的困难,有时https网站只是用了这个加密协议,但是事实上的数据并没有加密,所以仍然可以采集. 如果确实有困难的可以通过,http分析软件来确认地址,如H ...

  3. Python多线程爬虫,小米应用商城app信息爬虫程序,多线程和多进程两种实现思路

    目录 小米应用商城app信息爬虫程序 1.需求分析 2.url分析 3.程序设计思路 4.程序代码 5.程序优化与升级 小米应用商城app信息爬虫程序 1.需求分析 看到小米应用的首页:http:// ...

  4. Java多线程编程:Callable、Future和FutureTask浅析(多线程编程之四)

    java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一) java多线程同步以及线程间通信详解&消费者生产者模式&死锁 ...

  5. linux多线程编程和linux 2.6下的nptl,Linux多线程编程和Linux 2.6下的NPTL

    这几天由于工作需要,琢磨了一下Linux下的多线程的相关资料.Linux下最常用的多线程支持库为Pthread库,它是glibc库的组成部分.但是关于Pthread的说明文档非常缺乏,特别是对POSI ...

  6. 多线程编程(14) - 多线程同步之 WaitableTimer (等待定时器对象)

    function CreateWaitableTimer(lpTimerAttributes: PSecurityAttributes; {安全}bManualReset: BOOL; {True: ...

  7. LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口

    目录 1114. 按序打印 解法 1115. 交替打印FooBar 解法 1116. 打印零与奇偶数 解法 1117. H2O 生成 解法 1118. 设计有限阻塞队列 解法 1195. 交替打印字符 ...

  8. java多线程基础视频_【No996】2020年最新 Java多线程编程核心基础视频课程

    01.课程介绍.mp4 02.多线程编程基础-进程与线程.mp4 03.多线程编程基础-使用多线程-继承Thread类.mp4 04.多线程编程基础-使用多线程-实现Runnable接口.mp4 05 ...

  9. 20180829-Java多线程编程

    Java 多线程编程 Java给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分. 程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径. 多线程是多任务的一种特 ...

  10. java多线程编程01---------基本概念

    一. java多线程编程基本概念--------基本概念 java多线程可以说是java基础中相对较难的部分,尤其是对于小白,次一系列文章的将会对多线程编程及其原理进行介绍,希望对正在多线程中碰壁的小 ...

最新文章

  1. 人工智能对医疗行业影响的专题研究:基本结论
  2. HTML+CSS+JS实现React简单的计算器实例
  3. rabbitmq实战指南_太香了这份架构解密:从分布式到微服务(第二版),神仙进阶指南...
  4. 《Python编程从入门到实践》学习笔记7(第8章:函数)
  5. 人机交互式编程_并发编程从操作系统底层工作整体认识开始
  6. ==和Equal()
  7. sca60c使用程序_使用PHP的SDO和SCA扩展
  8. 360校招笔试题总结2
  9. MapReduce任务的推测执行
  10. matlab中三维数组,维数转换
  11. Pycharm远程服务器无法显示图片
  12. c语言switch顺序,switch-case的执行顺序,该怎么处理
  13. oracle创建存储过程,hibernate调用
  14. python隐藏手机号码程序_Python网站手机号码解密的一种方法
  15. 爬取猫眼电影top100
  16. 大学计算机基础ppt操作题目,键盘操作大学计算机基础.ppt
  17. 万法简史(肯威尔伯)
  18. 2017年vb计算机考试,2017年计算机二级VB考试训练题及答案
  19. python+气象 | 在地图背景下绘制全国站点气温分布图
  20. 5.关于laravel框架中Contorller

热门文章

  1. 模板---函数模板,类模板等
  2. Visio是一个很好的UML建模软件和一个很好的制图软件
  3. [Luogu] 树状数组
  4. Sublime下MarkDown插件实现编辑和实时预览并转换成HTML格式
  5. java 多态利弊 及 父子类转换条件
  6. java操作Excel之POI(1)
  7. [hdu1532]最大流
  8. PB 程序发布相关
  9. 项目管理工具——TargetProcess(2)
  10. 前端基础:call,apply,bind的的理解