您的位置:首页 > 理论基础 > 计算机网络

他妈的 Python(1):怎么发起一个同步的 HTTP 请求

2016-01-27 13:58 465 查看

他妈的 Python(1):怎么发起一个同步的 HTTP 请求

作者:大锐哥
地址:http://blog.csdn.net/prevention
参与项目:http://www.clubapp.com.cn
转载注明来自:http://blog.csdn.net/prevention

向来是个粗俗的人,现在参与了一个高大上的项目开发。不知道以后博客里还让不让说「他妈的」了。要是他妈的不让说了,我这博客还真不想写。
为什么这么写他妈的博客的,都一个个装的人模狗样的,博客不就一笔记么?我就当个笔记用,谁爱看谁看,有问题问我,我也不一定回答。倒不是懒得理你,而是一般你问的问题,我他妈的也不会啊。
人家写入门博客都是从 hello world 开始,print 一下。我觉得没意思,项目里用到一次小小的 spider,用我不太熟悉的 python 实现了一下。你问为神马用他妈的 python?卧槽,不都说 python 效率高、屌的一逼吗?试试呗。脚本语言,就 perl 和 python 牛逼(bash 有时候必须得用,这个咱先不提),perl 处理个文本啊、写个自动代码生成器啊,比较牛逼。但是 python 可以很牛逼地写业务啊、写逻辑啊,好像效率很高的样子。

先发个同步请求再说

咱言归正个传,这个 python 里头也有 import 的概念(类似于 java、objective-c 的 import,或者 c、c++ 的 include 酱)。今儿咱们要 import 的库叫「urllib2」,我他妈也不知道这个 2 是啥意思,估计之前有个老版本,这个 2 就是新版本呗。但这他妈的也不重要吧,你先会写再说。
看段代码(我真他妈的啰嗦啊,才上代码,可能年龄大了,变话唠了):
url = "http://www.clubapp.com.cn"
req = urllib2.Request(url)
resp = urllib2.urlopen(req)

这就搞定了,发个同步 HTTP 请求,再 response 一下。「So easy!妈妈再也不用担心我的编程!」从这么一小段代码你他妈的就能看出来,这鸡巴 python 是个动态语言啊,我勒个擦擦,实例化的时候连他妈的类型都不用指定啊,这对于一个不常写动态语言的大锐哥来说,真心看着不舒服。
另外你还会发现这鸡巴函数怎么有两种:

大写开头的
Request

小写开头的
urlopen


我没查,以下都是瞎说:
Request(...)
这货像构造函数(constructor)啊,构造出一个 request,所以是大写开头。另外那个
urlopen
就是纯纯的呆萌的小函数而已,大写你个龟孙啊。

咋改 HTTP 请求头啊?

这个得会,要不咋伪装啊?不伪装小爬虫都不好写啊:
hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'Accept-Encoding': 'none',
'Accept-Language': 'en-US,en;q=0.8',
'Connection': 'keep-alive'}

pageReq = urllib2.Request(pageUrl, headers=hdr)

嘿!有意思吧,你看这个
Request
函数第二个参数,形参名字直接写在里面,再表示等于实参就搞定了。这不错,由此猜测是不是参数顺序也不重要?只要带上形参名字?不知道啊,先留着,待会儿查查。这样的好处有点类似于 objective-c,就是你要带着形参名字,就很容易知道参数意思,否则 coding 的时候老要点到函数的定义里面去看(比如写 java、c、c++ 的时候)。

怎么从 response 里得到返回码啊

HTTP 返回 404、200 还是什么鬼,这个得知道吧?
rescode = resp.getcode()

就是你上面得到那个,调用下
getcode
得到的就可以和数字比较啦。

怎么从个 response 里得到响应的数据啊?

就这句:
data = res.read()

比如你要是请求的是个图片,这货可以直接写入到文件里,就保存到磁盘了。你要是请求的是个网页,这货直接就是 html 了,你可以打印出来瞧瞧:
print("response: \n" + data)

上面的打印里你可以看到,python 中字符串拼接和 java 一样,很方便吧。
对了,提一点,python 最最不爽的,是严格缩进。妈了个巴子的,这玩意儿能折腾死人(但是我相信有很好的 IDE 或者 emacs/vim 插件可以解决,只是我现在还木有去搜寻)。这就留作后话吧,像我这么啰嗦的人,这次就讲这么多吧。太多知识,主要不是篇幅有限,是他妈的我就会这么多啊。

遗留问题

Q:因为要带形参名字,函数参数顺序能随便改不?

A:随便搜了下,发现也可以不带形参名字,但是不带的话就必须保证和定义顺序一样(妈了个巴子的)。带上呢顺序自己随便玩,被老子蒙对了,突然觉得自己好牛逼。

作者:大锐哥

地址:http://blog.csdn.net/prevention
参与项目:http://www.clubapp.com.cn
转载注明来自:http://blog.csdn.net/prevention
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: