TSE是Tiny Search Engine(“微型搜索引擎”)的简称,由北京大学网络实验室出品
这个实验室推出过当年教育网搜索颇有名气的 “北大天网搜索”
天网培养了中文互联网早期的一批的搜索技术专家
bd的技术路线和TSE很像
TSE包括网页抓取、分词、倒排索引生成等模块,可以视为天网的袖珍版。
代码用C++开发,短小精干,运行效率很高
我感觉实际效果比开源的一些Spider要好,修改起来也很方便
- TSE网页抓取
开始是main函数,在main.cpp
如果控制台参数是1个,就进行搜索:
CSearch iSearch;
iSearch.DoSearch();
如果控制台参数是2个,就运行网络爬虫:
CCrawl iCrawl(argv[2], "visited.all");
iCrawl.DoCrawl();
其中 argv[2]是inputfile visited.all是outputfile.
在DoCrawl函数里,初始化是把已经访问过的url加入到一个集合中去,
即调用函数GetVisitedUrlMD5(),这个函数里,主要是读取一个文件:
while( getline(ifsMD5,strMD5) ){
setVisitedUrlMD5.insert(strMD5);
}
setVisitedUrlMD5就是一个已经访问过的url集合
同理于 GetVisitedPageMD5();GetIpBlock();
GetUnreachHostMD5();
分别读取文件内容到setVisitedPageMD5,mapIpBlock,setUnreachHostMD5
set<string> setVisitedUrlMD5;
set<string> setVisitedPageMD5;
map<unsigned long,unsigned long> mapIpBlock;
其中 setUnreachHostMD5 是从文件读出不能到达的url,然后对这个url取了一个MD5值,存进内存中这个集合的.
这些前期工作做完以后,就开始读取种子文件,也就是开始爬取采用的起始url.
先是打开所有的输出流文件,函数是OpenFilesForOutput().也就是将来爬取得结果存放的文件.这里面包括索引文件(专门的类来打开),visited.url,link4SE.url,link4History.url(这个可能存放的是一篇HTML中的图像链接),unreach host file,visited url md5 file,visited page md5 file.
for(unsigned int i=0; i< NUM_WORKERS; i++){
if( pthread_create( &tids[i], NULL, start, this))
cerr << "create threads error" << endl;
}
启动10个线程,每个线程执行的函数是start,参数是this指针
在启动线程的同时,读取种子文件的url
while( getline(ifsSeed, strUrl) ){
//对读到的url进行一些处理后,调用AddUrl(strUrl)函数
AddUrl(strUrl.c_str());
}
也同时读取未访问的url
while( getline(ifsUnvisitedUrl, strUrl) ){