由于工作的需求,需要用python做一个类似网络爬虫的采集器。虽然Python的urllib模块提供更加方便简洁操作,但是涉及到一些底层的需求,如手动设定User-Agent,Referer等,所以选择了直接用socket进行设计。当然,这样的话,需要对HTTP协议比较熟悉,HTTP协议这里就不做讲解了。整个python的代码如下:
#!/usr/bin env python
import socket
host="www.baidu.com"
se=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
se.connect((host,80))
se.send("GET / HTTP/1.1\n")
se.send("Accept:text/html,application/xhtml+xml,*/*;q=0.8\n")
#se.send("Accept-Encoding:gzip,deflate,sdch\n")
se.send("Accept-Language:zh-CN,zh;q=0.8,en;q=0.6\n")
se.send("Cache-Control:max-age=0\n")
se.send("Connection:keep-alive\n")
se.send("Host:"+host+"\r\n")
se.send("Referer:http://www.baidu.com/\n")
se.send("user-agent: Googlebot\n\n")
print se.recv(1024)
…阅读更多>>
今天在写一个linux下自动备份指定目录下的所有目录的脚本时,遇到了一个问题,由于我是需要备份目录,所以,需要判断扫描的文件是否为目录,当我用os.path.isdir()来判断的时候,发现所有文件均返回false,刚开始以为是系统兼容性问题,进一步测试,发现用os.path.isfile(),这些文件还是返回false,这肯定就是程序写的有问题了,代码如下:
#!/usr/bin/env python
# a python script to auto backup a directory's file by Hito
import os
Directory=raw_input("Please enter directory you want to backup:")
dirs=os.listdir(Directory)
for filename in dirs:
if os.path.isdir(filename):
os.system("tar czvf "+filename+".tar.gz "+filename)
…阅读更多>>
观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。—-维基百科
概念的东西本身就不好理解,我试图通过现实中的例子来说清楚这个观察者模式。我们知道,世界上最伟大的爱,莫过于母爱,母亲关心你的一切,你吃饱了吗,穿暖了吗,找到女朋友了吗…如果把天下的母亲归为一类,儿女归为一类,我们知道母亲是时刻关注着儿女的变化的,从观察者模式的角度来讲,母亲是观察者,观察着儿女们的一举一动,一切需求,儿女就是被观察者,他们的一切需求母亲都可以获知。那么,我们来做这样一个例子:
…阅读更多>>
前一段时间在编写一个JS代码时遇到了这样的问题,在同一个父元素下有很多相同的li元素,我需要遍历这些元素,并给每个li元素都添加一个click时间,以显示当前li元素所在父元素的顺序。代码是这样的:
<ul>
<li>0</li>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
<script>
var list=document.getElementsByTagName("li");
for (var i=0;i<list.length;i++){
list[i].onclick=function(){alert(i)};
}
</script>
执行结果比较有意思,当我点击不同的li的时候,每次弹窗出来都是6!
这里就有两个问题,第一个问题是为什么最终的效果不是点击哪个,弹出相应的数字?第二个问题是,弹出的数字为什么是6,而不是5或者其它的数字呢?
...阅读更多>>
在一些图片搜索网站,像Google,我们经常可以看到这样的效果,当我们搜索并查看一个图片时,可能这个图片看起来是非常模糊的,那么等一会之后呢,发现这个图片变清楚了,那么这个究竟是怎么实现的呢?首先,我想到的是在服务器传送图片的时候,能不能使用类似在线播放视频那种流媒体技术,先把图片的模糊信息传过来,然后再传送剩余的信息。实际上,这个想法是非常可笑的,第一:浏览器在加载图片的时候,就是慢慢的接受服务器传送的数据的,这点在浏览器加载比较大的图片的时候看的很明显,图片就是从上到下慢慢加载完成的,这本来就是流媒体的技术。第二,即使服务器能够做到先传一部分模糊数据过来,那么浏览器这时候已经把模糊数据加载好了,清晰的数据过来了,怎么去把原来的覆盖掉呢?显然,这是不行的。这个想法虽然不行,但是却给了我们一些提示,我们能不能把模糊的数据和清晰的数据分开呢?刚开始请求模糊的数据,过一段时间之后再请求清晰的数据?也就是说,干脆弄两中图片,一张模糊的,一张清晰的,浏览器默认是加载模糊的,等模糊的加载好之后,再去加载清晰的。
…阅读更多>>
什么是单例模式?先来看一下维基百科的解释:单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。
概念理解起来可能比较困难,用最简单的话来概括单例模式就是,在创建一个类的时候,通过某种方法,来保证这个类只能产生一个实例。这么做有什么好处呢?我们知道,当我们编写好一个类之后,要产生这个类的实例是非常简单的,直接用new关键字就可以,那么,在一些大型的项目当中,同一个页面可能不是一个人开发,例如有一个Mysql的类,第一个开发人员实例化一个mysql对象,第二人去开发的时候,可能又去实例化了一个db对象,这两个对象其实都是一样的,每次实例化一个对象的时候,可能都需要去连接一次数据库,这样是非常浪费系统资源的。单例模式的出现就是为了避免对一个类的重复实例化问题的产生,从而节省资源。
…阅读更多>>