失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > python http2_python2使用urllib/urllib2实现Http请求

python http2_python2使用urllib/urllib2实现Http请求

时间:2020-02-06 08:14:27

相关推荐

python http2_python2使用urllib/urllib2实现Http请求

在Http请求中,最为常见的两种请求为GET、POST请求,下面实现方式主要是以urllib/urilib2方式实现。

urllib/urllib2是python中两个内置的模块,要实现Http功能,实现方式以urllib2为主,urllib为辅,在urllib2中提供了一个完整的基础函数urllib2.urlopen(url),通过向指定的url发出请求来获取数据

1、GET请求的实现

import urllib2

response = urllib2.urlopen(“127.0.0.1:8800”)

content = resonse.read()

print content

在上述的实现方式中,可以对分为请求、响应两步,形式如下:

import urllib2

#生成一个请求

requset = urllib2.Requset("127.0.0.1:8800")

#请求与响应

response = urllib2.urlopen(requset)

content = response.read()

2、POST请求的实现

import urllib

import urllib2

url = "127.0.0.1:8800"

#请求数据

postdata = {

'username': 'lxn',

'password': '888888888'

}

#将数据编码

data = urllib.urllencode(postdata)

#生成一个请求并且写入头信息

req = urllib.Request(url, data)

#请求与响应

response = urllib2.urlopen(req)

content = response.read()

上面实现方式就是一个简单的post请求,但是有时可能会出现这种情况:即使POST请求的数据是对的,但是服务器还是拒绝你的访问。 这是为什么呢?问题出现在请求中的头信息中,因为服务器会校验请求头来判断是否来自浏览器的访问,比如在反爬虫的引用中。

我们可以通过加上请求头信息:

import urllib

import urllib2

url = "127.0.0.1:8800"

headers = {

'User-Agent':"Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)",

'Referer':'127.0.0.1:8800'

}

#请求数据

postdata = {

'username': 'lxn',

'password': '888888888'

}

#将数据编码

data = urllib.urllencode(postdata)

#生成一个请求并且写入头信息

req = urllib.Request(url, data,headers)

#请求与响应

response = urllib2.urlopen(req)

content = response.read()

我们也可以使用add_header方式来添加头信息:

import urllib

import urllib2

url = '127.0.0.1:8800/login'

postdata = {'username' : 'lxn',

'password' : '88888888'}

data = urllib.urlencode(postdata)

req = urllib2.Request(url)

# 将user_agent,referer写入头信息

req.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)')

req.add_header('Referer','/')

req.add_data(data)

response = urllib2.urlopen(req)

content = response.read()

3、Timeout超时设定

在Python2.6之前的版本,urllib2的API中并没有开放Timeout超时接口,要设定Timeout值,只能更改Socket的全局Timeout值,实例如下:

import urllib2

import socket

socket.setdefaulttimeout(10) # 10 秒钟后超时

urllib2.socket.setdefaulttimeout(10) # 另一种方式

在Python2.6及新的版本中,urlopen函数提供了对Timeout的设置,示例如下:

import urllib2

request=urllib2.Request('127.0.0.1:8800/login')

response = urllib2.urlopen(request,timeout=2) #2秒后超时

content=response.read()

4、获取HTTP响应码

对于200OK来说,只要使用urlopen返回的response对象的getcode()方法就可以得到HTTP的返回码(只针对返回码为200的请求)。但对其他返回码来说,urlopen会抛出异常。这时候,就要检查异常对象的code属性了,示例如下:

import urllib2

try:

response = urllib2.urlopen('127.0.0.1:8800')

print response

except urllib2.HTTPError as e:

if hasattr(e, 'code'):

print 'Error code:',e.code

参考书籍:《Python爬虫开发与项目实战》 — 范传辉 编著

如果觉得《python http2_python2使用urllib/urllib2实现Http请求》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。