镜像山野的网站
davies 发表于 2006 年 10 月 12 日
山野的网站是用MSSQL+ASP做的,放在校外某公司的服务器上,访问起来很慢,维护很不方便。为了提高访问速度,想给它做一个镜像,用程序把网站里面的所有资源爬下来保存为静态页面,并按照原来的结构组织好,做为一个完全静态的网站。
Linux下的wget是镜像网站的好工具,它的-mirror参数就是专门干这个的。能够根据页面的修改时间来选择是否下载页面。而且wget能够用完成URL作为文件名,使得具有不同参数的动态内容保存为不同的静态页面成为可能。但wget有一个致命缺陷,它不支持多线程,本来是因为访问原站点很慢才想要做镜像,用单线程的话会使镜像过程相当漫长,变得不太可能。
网上有不少现成的爬虫工具,用Python实现的就有好几个,试了一下,都有一个通病:保存文件时不带参数,不行。懒得去hack它的程序了,还不如自己用Python写一个,其实也蛮简单的,无非是用多线程去下载页面,这个利用前面已经完成的线程池Worker.py将相当简单。其它就是解析HTML页面,找出其中的链接,而山野的网站有其自身的特点,写一个适用于它而并非通用的解析器也是很简单的。
保存的时候,需要根据URL生成文件路径,将其中的?替换成_,并在最后加一个.html后缀。这样的话,这些镜像后的静态文件的URL跟页面中的内部URL会不一样,一种方法就是改变页面中的链接为静态文件的链接,这是浏览器下载页面通常采用的方法,而另一种更简单的方法是利用HTTP服务器的rewrite功能,用与转换文件名同样的规则来作为rewrite规则。这样对访问者来讲,链接及内容都没有改变,而实际上它已经是一个个的静态HTML页面了。上面给出链接就是镜像后的效果,而原站点在这里:http://219.239.7.49/braveheart/
另外,为了避免循环下载,需要保存一个已经开始下载的URL列表,如果在页面中找到的新的URL已经在这个列表中,则无需下载,否则会死循环。
完整的代码如下,可以在这里下载。
网友留言:
2. 发表于 2006 年 10 月 17 日 4:27 p.m.
本来打算写一篇关于web环境下的多进程多线程开发方面的内容的,估计正好满足你的需要,只是现在没时间...
稍微提一下,可以利用Unix操作系统的文件锁实现进程间的互斥,可以直接用rgutils木块中的GlobalLock,还是跨平台的
1. 发表于 2006 年 10 月 17 日 2:05 p.m.
博主,你好,有个问题向你请教,有一个mod_python和apache整合的web服务器,我们都知道apache服务器是个多进程多线程的处理模式,现在有多个客户端同时想对服务器上的一个xml文件进行写操作(比如两个客户端同时写入相同的内容,但只需记录一条), 如果服务器是单一进程的话,只要用到python 的线程管理就可以防止xml的写冲突。可是如果有多个进程同时处理客户端请求的时候,由于每个进程有独立的内存空间,可以独立的加载dom对象,那么进程之间就会产生写冲突,xml文件中就会记录两条同样的内容。我就想问一下,在多进程的情况下,怎样给文件加锁,防止写冲突呢? 任何指点都感激不尽~~~~~~