【实现一个网络爬虫】二、如何管理所有的站点
2012-10-27 21:47
330 查看
先不说爬虫里的基本原理,这里先讨论一下是如何管理站点的。
原理如下:针对每一个网站,以网站的首页为名字,存为一个临时文件,这个文件里保存它里面的子页面,这样,当扫描过一个首页的子页面时,就会向这个文件里记录。当程序需要对比哪些文件扫描过时,只需要看看这个日志文件里面有没有需要扫描的子页面即可。
当然这里还有一个问题,就是网页地址里的所有符号(比如/ : ?)并不能都存在于文件名里,要做一个简单的替换(这样看起来就像专业的临时文件啦!!!!)
有一个问题困惑住了我:程序是要允许用户修改站点和关键字信息的,当程序在扫描的时候,会不断地访问这些文件,得到需要的数据,这是一个独立的线程,而当用户修改这些信息的时候,文件正在被读写,这时候就有问题了。应该怎样解决这个问题呢?
好吧,还是让用户在先添加信息,然后再开始扫,要想修改信息,得先把扫描程序停下来。
这样有两个好处。一个就是之前说的,不用担心访问冲突的问题,另一个是,因为访问站点信息的只有AdminThread,所以站点管理类完全可以把文件打开,然后就任意读写,不需要的话再把文件关闭,避免了大量地开关文件和查找。美哉!
昨天偷懒了,没写,今天接着干,争取今天把所有功能实现,加油!!!!
下面贴一下为站点类添加的都有哪些方法:
这些是公共的,私有的就不说了,可以根据数据库或者文件来实现这些接口,不影响其他类的调用。
方法的介绍已经在注释里包括了。因为之前是自底向上开发的,所以这些方法的实现也是复制粘贴而已。
不晓得为啥,程序融合之后,调用ResetUrlGeneration时总是出现问题,看症状貌似是因为文件不存在,或者没法读写,或者是读写冲突。但文件的确存在,也可以读写,而且修改的时候只有一个进程在读写,怎么回事呢?
把这个类拷贝到VC++的环境下,用我自己随便写的一个测试窗口调用,完全没有问题。这回问题出在哪了呢?
原理如下:针对每一个网站,以网站的首页为名字,存为一个临时文件,这个文件里保存它里面的子页面,这样,当扫描过一个首页的子页面时,就会向这个文件里记录。当程序需要对比哪些文件扫描过时,只需要看看这个日志文件里面有没有需要扫描的子页面即可。
当然这里还有一个问题,就是网页地址里的所有符号(比如/ : ?)并不能都存在于文件名里,要做一个简单的替换(这样看起来就像专业的临时文件啦!!!!)
有一个问题困惑住了我:程序是要允许用户修改站点和关键字信息的,当程序在扫描的时候,会不断地访问这些文件,得到需要的数据,这是一个独立的线程,而当用户修改这些信息的时候,文件正在被读写,这时候就有问题了。应该怎样解决这个问题呢?
好吧,还是让用户在先添加信息,然后再开始扫,要想修改信息,得先把扫描程序停下来。
这样有两个好处。一个就是之前说的,不用担心访问冲突的问题,另一个是,因为访问站点信息的只有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++的环境下,用我自己随便写的一个测试窗口调用,完全没有问题。这回问题出在哪了呢?
相关文章推荐
- Python 网络爬虫 004 (编程) 如何编写一个网络爬虫,来下载(或叫:爬取)一个站点里的所有网页
- Python 网络爬虫 004 (编程) 如何编写一个网络爬虫,来下载(或叫:爬取)一个站点里的所有网页
- java中如何在eclipse里查看一个接口的所有实现类
- drupal6 站点上如何实现一个标签(tags)菜单导航区块(block)
- java中如何在eclipse里查看一个接口的所有实现类?
- 一个站点存在多个web.config时如何管理?
- 如何管理一个页面中多个虚拟窗口,实现点击任意一个将其提升到最前(用户完全可见,不会被遮挡)
- 如何用asp.net2.0的WSAT(网站管理工具)制作一个管理所有用户的网页
- 如何生成一个集成库并且实现对库的管理
- 【实现一个网络爬虫】三、爬虫是如何工作的
- 如何用编程方式实现创建一个页面并替换掉站点首页
- 关于如何获取一个进程占用的所有网络端口的实现设想
- 有一个二叉树, 节点全部为整数,如何找到一个子树,它所有节点的和最大?要求编程序实现。
- ARX的方法如何实现删除一个选择集中所有实体
- java中如何在eclipse里查看一个接口的所有实现类或一个类的子父级关系?
- 如何用命令打包一个站点,包括其所有目录文件
- 如果让你来制作一个访问量很高的大型网站,你会如何来管理所有CSS文件、JS与图片?
- 一个通用的单元测试框架的思考和设计06-实现篇-自动管理测试数据-如何临时关闭数据外键约束
- java中如何在eclipse里查看一个接口的所有实现类或一个类的子父级关系?
- 一个通用的单元测试框架的思考和设计06-实现篇-自动管理测试数据-如何临时关闭数据外键约束