【实现一个网络爬虫】二、如何管理所有的站点
先不说爬虫里的基本原理,这里先讨论一下是如何管理站点的。
原理如下:针对每一个网站,以网站的首页为名字,存为一个临时文件,这个文件里保存它里面的子页面,这样,当扫描过一个首页的子页面时,就会向这个文件里记录。当程序需要对比哪些文件扫描过时,只需要看看这个日志文件里面有没有需要扫描的子页面即可。
当然这里还有一个问题,就是网页地址里的所有符号(比如/ : ?)并不能都存在于文件名里,要做一个简单的替换(这样看起来就像专业的临时文件啦!!!!)
有一个问题困惑住了我:程序是要允许用户修改站点和关键字信息的,当程序在扫描的时候,会不断地访问这些文件,得到需要的数据,这是一个独立的线程,而当用户修改这些信息的时候,文件正在被读写,这时候就有问题了。应该怎样解决这个问题呢?
好吧,还是让用户在先添加信息,然后再开始扫,要想修改信息,得先把扫描程序停下来。
这样有两个好处。一个就是之前说的,不用担心访问冲突的问题,另一个是,因为访问站点信息的只有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++的环境下,用我自己随便写的一个测试窗口调用,完全没有问题。这回问题出在哪了呢?

浙公网安备 33010602011771号