【实现一个网络爬虫】二、如何管理所有的站点

先不说爬虫里的基本原理,这里先讨论一下是如何管理站点的。


原理如下:针对每一个网站,以网站的首页为名字,存为一个临时文件,这个文件里保存它里面的子页面,这样,当扫描过一个首页的子页面时,就会向这个文件里记录。当程序需要对比哪些文件扫描过时,只需要看看这个日志文件里面有没有需要扫描的子页面即可。


当然这里还有一个问题,就是网页地址里的所有符号(比如/ : ?)并不能都存在于文件名里,要做一个简单的替换(这样看起来就像专业的临时文件啦!!!!)


有一个问题困惑住了我:程序是要允许用户修改站点和关键字信息的,当程序在扫描的时候,会不断地访问这些文件,得到需要的数据,这是一个独立的线程,而当用户修改这些信息的时候,文件正在被读写,这时候就有问题了。应该怎样解决这个问题呢?


好吧,还是让用户在先添加信息,然后再开始扫,要想修改信息,得先把扫描程序停下来。


这样有两个好处。一个就是之前说的,不用担心访问冲突的问题,另一个是,因为访问站点信息的只有AdminThread,所以站点管理类完全可以把文件打开,然后就任意读写,不需要的话再把文件关闭,避免了大量地开关文件和查找。美哉!

 

昨天偷懒了,没写,今天接着干,争取今天把所有功能实现,加油!!!!

 

下面贴一下为站点类添加的都有哪些方法:

 1     void ResetUrlGeneration(); //重置地址获取函数,下次调用NextIndexUrl时会从第一个网址开始
 2     void CloseUrlGeneration(); //关闭文件,
 3     CString NextIndexUrl(); //获得下一个待扫描的首页地址
 4     CString GetSubsitesFromLog(CString indexUrl); //从指定的Url日志中读取子页面
 5     CString GetKeywrods(); //返回所有的关键字
 6     bool Log(CString indexUrl, CString subsite); //记录当前Url扫描的子页面
 7     bool ResetIndexLog(CString indexUrl); //把当前Url页面下属的日志清空,等待新的扫描
 8     bool AddIndex(CString indexUrl); //向首页库里添加站点
 9     bool DelIndex(CString indexUrl); // 在首页库里删除指定的站点
10     bool AlterKeywords(CString newKeywords);//修改关键字,直接保存

这些是公共的,私有的就不说了,可以根据数据库或者文件来实现这些接口,不影响其他类的调用。

方法的介绍已经在注释里包括了。因为之前是自底向上开发的,所以这些方法的实现也是复制粘贴而已。

 

 

不晓得为啥,程序融合之后,调用ResetUrlGeneration时总是出现问题,看症状貌似是因为文件不存在,或者没法读写,或者是读写冲突。但文件的确存在,也可以读写,而且修改的时候只有一个进程在读写,怎么回事呢?

把这个类拷贝到VC++的环境下,用我自己随便写的一个测试窗口调用,完全没有问题。这回问题出在哪了呢?

posted @ 2012-10-27 21:47  byan  阅读(808)  评论(0)    收藏  举报