目前设计spider demo的思路:
1以Queue建立工作队列,保存正在爬行的url地址
2以Hashtable建立全局对象,保存已经爬行过的url地址
3创建工作线程类,进行网页抓取和分析工作,在分析中发现新的url,检测没爬行过后,直接向工作队列投递
4 主线程中直接建立固定多的并行线程,可避免线程的管理工作(如果实际商业化应用,还是采用ThreadPool进行线程管理,才能在减少线程开销的情况下,提高)
5 整体工作流程为:
由主线程启动所有并发线程进行爬取
每条线程爬取任务通过接口函数向主线程的Queue取的任务url并移除Queue里的任务url,保持先进先出,每次取第一个元素.
同时在任务过程中爬取到新的url,也向主线程Queue投递,其过程中必须lock
Queue,防止不同线程同时对Queue访问造成错误.
取得任务并完成后向Hashtable写入url,其过程也必须lock
1以Queue建立工作队列,保存正在爬行的url地址
2以Hashtable建立全局对象,保存已经爬行过的url地址
3创建工作线程类,进行网页抓取和分析工作,在分析中发现新的url,检测没爬行过后,直接向工作队列投递
4 主线程中直接建立固定多的并行线程,可避免线程的管理工作(如果实际商业化应用,还是采用ThreadPool进行线程管理,才能在减少线程开销的情况下,提高)
5 整体工作流程为:
由主线程启动所有并发线程进行爬取
每条线程爬取任务通过接口函数向主线程的Queue取的任务url并移除Queue里的任务url,保持先进先出,每次取第一个元素.
同时在任务过程中爬取到新的url,也向主线程Queue投递,其过程中必须lock
Queue,防止不同线程同时对Queue访问造成错误.
取得任务并完成后向Hashtable写入url,其过程也必须lock
每次抓区的页面以url的MD5码为文件名进行保存
经过测试这个程序能在共享 ADSL 4M带宽讯弛1.8G 1G DDR 4500转硬盘下开200线程每秒抓取400-430K数据,8-10个页面
由于只是为了实现多线程的spider demo没考虑太多功能,可以改进的地方还很多,例如直接开若干线程开销比较大,其实由于带宽原因,很多线程部分空闲.可以采用ThreadPool进行管理降低线程开销,降低CPU占用.用其他简单算法代替MD5,有独立线程负责抓取页面,另外线程专门分析和保存,工作分开等多种改进.
以上为原始版本,新版本主要使用了ThreadPool来自动管理线程 而非单纯的开辟固定数目线程 从而减少了实际的线程使用数 大量降低CPU占用 同时为了提高效率将MD5算法替换为CRC32 作为URL指纹运算 节约大量的工作时间提高效率 其它方面暂无调整
代码下载地址:http://www.coogo.net/bbs/UploadFile/2006-11/200611214285244201.rar
(因采用.net 2.0部分新类,无法直接在.net 1.1下编译通过,如有需要请个人自行修改)