本篇文章是一篇关于包服务器的帖子
POST/GET 包是神马货色呢。
首先先绍介一下当我们在浏览器中键入URL后, 浏览器中到底发生了什么吧。
根据来原的知识,我们可以道知,如果计算机和服务器要讯通的话,必须道知服务器确准的IP址地,那我们的URL中一般是不会存在IP址地的,而是域名,类似于facebook.com 当我们键入facebook.com 并回车后,浏览器会先在浏览器缓存中寻觅facebook.com 所对应的IP址地,如果缓存没有,浏览器将请求统系缓存,如果统系缓存中也没有,那么统系起发对ISP服务商的DNS服务器的剖析请求,如果没有,那么将向更层上的域名服务器起发请求。这个程过,叫做域名剖析。当然内国facebook.com可以被确正剖析,但是没法拜访,这归功于巨大的GFW。
面下我们用baidu.com举例吧。
第二行面后就随着baidu.com所对应的服务器的ip址地。
以后,浏览器会向服务器发送一个GET请求,让我们用HTTPanalyzer截拦一个。
Host: www.baidu.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Cookie: ***********************************
可以从字面意思失掉,我们给服务器发送个各种本机的信息,其中括包浏览器内核,可接受的页网格式,缩压格式,语言,语言编码,以及Cookies。
Cookies 是身份证验的要重组件。
而当我们填写页网下面的的表格时,浏览器会向服务器发送POST数据包,较之GET包,除了Request Header , 还有BODY分部,来放存表单的内容,其内容可能被密加或者缩压。
当初,我们来用Python,建创GET包和POST包。
至于有什么处用,大家慢慢领会。
Python 中包含了量大的库,作为一门新兴的语言,Python 对HTTP有充足大强的持支。
当初,我们引入新的库 httplib 以及 urllib
这两个库根据称名,我们可以道知他们是对于HTTP以及URL的操纵。
让我们直入主题,HOW to Build a post or get
首先我们先要与服务器立建连接。(我们以某微博作为例子实现下文的各种功能)
conn = httplib.HTTPConnection("ti50*****com");
只要没有示提错误,我们就能够为认连接已胜利,面下就能够停止数据包发送了。
在上文中我们说过了GET包的构结,只有HEARDER 分部。而在httplib中,heaer 是通过一个字典来保存的。面下我们来定义它:
headers = {"Content-Type": "application/x-www-form-urlencoded",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Referer": "http://ti50.*****com/g/s?sid=*********************",
"Accept-Encoding": "",
"Accept-Language": "zh-CN,zh;q=0.8",
"Accept-Charset": "GBK,utf-8;q=0.7,*;q=0.3",
"Cookie": Cookie }
Accept-Encoding 我们删除了其内容,这对于服务器说来我们客户端不能接受任何缩压的格式,数据包将用原始数据发送来回,这样我们就能够省去解缩压的程过直接分析页网了,但是这样做的果后是流量大,网络时实性差。关于解缩压天然有别的库来专门处置。
然后我们可以直接发送了。
conn.request(method="GET",url='''http://ti50****com/g/s?*********_TK9EH&r=''' + go_num + '''&aid=amsg&bid=******=true&ifh=1&ngpd=false''',headers=headers);
method 段字说明是发送何种类型的数据包。
url 段字以字符串的情势定义址地
header 段字定义包头。
一般说来,一个数据包发送至服务器,服务器会响应的返回一个应答包。而且这个应答包对于我们往往是有效的,我们用面下的令命取获应答包。
response = conn.getresponse();
对于下面这条语句中的括号,其表现读取应答包的前多少个字符。
POST包与GET包的建创程过基本雷同。
只是我们须要新定义BODY,这个分部可以用字符串的式方停止定义。
params = 'msg=***************************'
我们仍然须要先于服务器停止连接。
conn = httplib.HTTPConnection("ti50*****com");
宽容,是一种坦荡,可以无私无畏,无拘无束,无尘无染。宽容,是一种豁达,是比海洋和天空更为博大的胸襟,是宽广和宽厚的叠加,延续和升华。宽容有度,宽容无价,宽以待人,这是人生处世的基本法则。
发送
conn.request(method="POST",url='''/g/s?sid=******************&ngpd=false''',body=params,headers=headers);
可以发明下面的这个公式和发送GET包的格式略有差距。
- method 改变了。
- url 里头没有写域名。
- 多了一个body 段字。
其中第二条可以想到,如果没定义域名,则统系将近来一次与服务器的连接用的域名停止替换。
取获应答包的式方与GET包雷同。
杂乱无章的小应用。
(一) 随机字符串的生成。
当我们用POST做一些很趣有的情事时,常常会到遇服务器证验神马的,有时候我们可以用随机字符串来处置这样的情况。
python 中给了随机数的库…… random。
对于单简的应用非常便利。例如我们生产a与b 之间的一个随机整数。
random.randint(a,b)
道知了这步,我们可以很单简的编写一个随机字符串的程序了,
from random import Random def random_str(randomlength): str = '' chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789' length = len(chars) - 1 random = Random() for i in range(randomlength): str+=chars[random.randint(0, length)] return str
明显当用调此函数时应当给出随机字符串度长。
当然,我们也可以通过改修chars中的字符来定义随机字符串中的字符。
(二) 程序运行时光
我们当初给出一个非常不精确的程序时光计算方法,
from time import clock as now start = now() finish = now() run_time = finish - start print run_time
文章结束给大家分享下程序员的一些笑话语录: 一个程序员对自己的未来很迷茫,于是去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问Lippman,他现在领导的程序员的队伍可能是地球上最大的"
于是他去问Lippman。
Lippman说"程序员的未来就是驾驭程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问Gates,他现在所拥有的财产可能是地球上最多的"
于是他去问Gates。
Gates说"程序员的未来就是榨取程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问侯捷,他写的计算机书的读者可能是地球上最多的"
于是他去问侯捷。
侯捷说"程序员的未来就是诱惑程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝摇摇头"唉,我的孩子,你还是别当程序员了")