urllib库的使用
request.urlopen()函数
urlopen(url)
可以发送请求,也可以加上data,timeout等参数。
response=request.urlopen(url)
timeout参数
设置timeout参数,如果响应时间超过timeout,则抛出异常。
response=request.urlopen(request,timeout=1)
这里设置timeout值为1,超过1s,就会抛出异常URLError,属于urllib.error模块。
我们可以用socket模块来判断异常类型。
request.Request()函数
Request()函数可以把请求实例化,这样配置相关参数更加灵活。
request=request.Request(url)
response=request.urlopen(request)
这里看到urlopen()函数的参数可以是url,也可以是request.
data参数
可以在请求中加入data参数,则传入方式应为post.
data={'name':'hello'}
这里data是一个字典,可以用
str=urllib.parse.urlencode(data)
将其转换成字符串,然后
data_bytes=bytes(str,encoding='utf-8')
将其转换成bytes(字节流)类型。
这样可以将其加入到请求中一起发送给服务器
response=resquest.urlopen(url,data=data_bytes)
headers参数
headers参数也是个字典,包括
User-Agent 浏览器版本,我们配置它达到伪装成浏览器的目的。
host 服务器IP
method参数
method参数是一个字符串,表示请求的方法,比如get,put,post等。
get仅仅获得页面信息,如需传值,需显式的写在url里,故不安全。
post可以通过表单传值,不会显示在url里,故较安全。
代码实现
from urllib import request,parse,error
import socket
data={'name':'hello'}
str=parse.urlencode(data)
data_bytes=bytes(str,encoding='utf8')
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
'Host':'httpbin.org'
}
url='https://httpbin.org/post'
req=request.Request(url,data=data_bytes,headers=headers,method='POST')
try:
response=request.urlopen(req,timeout=1)
print(response.read().decode('utf-8'))
except error.URLError as e:
if isinstance(e.reason,socket.timeout):
print('time out!')
试着把timeout的值调成0.1,一般来说0.1s这么短的时间是完不成响应的,所以会抛出超时异常。