Python3的两种HTTP请求实现

初学Python,近两天在考虑写个爬虫玩玩,于是花了点时间了解大蟒蛇的标准库。

既然是初学,那我应该知道如何用才行。使用搜索引擎也全是收到的python2.x 的内容,于是就用2.x 的用法在3.x的文档上搜索了下。知道了两种请求http的基本用法。

第一种方法:使用urllib.request.urlopen() 

req = urllib.request.Request(url, None, header, None, False, method)
 content = urllib.request.urlopen(req) 


第二种方法:使用http.client.HTTPConnection.request()

 conn = http.client.HTTPConnection(host)      
conn.request(method, "", "", header)     
content = conn.getresponse() 


文件httpRequest.py 详细代码 

在我的测试中,我向csdn.net这个地址发送请求,执行结果如下:

让我颇感意外的是两种执行结果并未返回相同的状态码,一个是200,一个是302重定向。遗憾的是,官方的英文文档实在没说清楚两种方式的使用场景,(也许是我英文水平有限没看明白)由于对http协议了解不够,在得到这个结果的时候并未想到在返回码上分析原因,而是使用抓包工具抓包分析。(详细抓包过程就不在这里说明了,有兴趣可自己抓包看看,win使用WiireShark,linux使用tcpDump) 抓包发现使用第一种方法请求完毕后,本机会关闭这个tcp连接并对响应头中的Location: http://www.csdn.net/ 发送GET请求建立一个新的连接, csdn响应GET请求并返回200状态码与页面数据。而使用第二种方法,在发送请求后便关闭tcp,然后返回状态码302。

很显然,urllib是比HTTPConnection更高层次的封装,至少对重定向来讲,HTTPConnection不会做任何处理,直接返回重定向头,而urllib收到302状态码后自动请求重定向的页面,并返回重定向后的页面响应。

现在还有两个问题没有完全解决:

1、对HTTP协议本身认识不够,不知道urllib的封装还有哪些不一样?

2、http.client.HTTPConnection可以通过.set_debuglevel显示调试信息,通过urlopen又如何打开。查了文档,试过以下方法,能够运行,但无效:

http_handler = urllib.request.HTTPHandler(debuglevel=1)
https_handler = urllib.request.HTTPSHandler(debuglevel=1)
opener = urllib.request.build_opener(http_handler, https_handler)
urllib.request.install_opener(opener) 
content = opener.open(req)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值