您的位置:首页 > 理论基础 > 计算机网络

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

2012-10-27 21:47 330 查看
先不说爬虫里的基本原理,这里先讨论一下是如何管理站点的。

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

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

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

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

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

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

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

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


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

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

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

把这个类拷贝到VC++的环境下,用我自己随便写的一个测试窗口调用,完全没有问题。这回问题出在哪了呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐