Python Urllib模块 三十行代码编写自己的英语翻译器,随用随翻
今天运用的是Urllib模块
urllib是基于http的高层库,它有以下三个主要功能:
request处理客户端的请求
response处理服务端的响应
parse会解析url
下面我们来说的是request函数
urllib.request模块定义了一些打开URLs(一般是HTTP协议)复杂操作像是basic和摘要模式认证,重定向,cookies等的方法和类。这个模块式模拟文件模块实现的,将本地的文件路径改为远程的url。因此函数返回的是类文件对象(file-like object)
运用方法
urllib.request.urlopen(url, data=None, [timeout ]*, cafile=None, capath=None, cadefault=False, context=None)
url可以是一个字符串形式或者Request 对象
如果data参数有值就是用post方式响应否则默认为GET 方式
urllib.request 模块使用HTTP/1.1 的无连接的状态协议
urlopen()函数返回类文件对象,提供以下内建方法:
read() , readline() ,readlines() , fileno() , close() :这些方法的使用方式与文件对象完全一样
info():返回一个httplib.HTTPMessage对象,表示远程服务器返回的头信息
getcode():返回Http状态码。
如果是http请求:
(informational):请求已经收到,正在进行中
(successful):请求成功接收,解析,完成
(Redirection):需要重定向
(Client Error):客户端问题,请求存在语法错误,网址未找到
(Server Error):服务器问题
geturl():返回请求的url
接下来说的是urlencode函数
urllib库里面有个urlencode函数,可以把key-value这样的键值对转换成我们想要的格式,返回的是a=1&b=2这样的字符串,比如:
当urlencode之后的字符串传递过来之后,接受完毕就要解码了——urldecode。urllib提供了unquote()这个函数,可没有urldecode()!
好,话不多说,上源码,这个就是短短的不到三十行代码的翻译器。
源码
程序执行情况:
这里要注意的是两个函数
urllib.request.urlopen()
urllib.parse.urlencode()
urllib.request.urlopen()函数其实不止一个参数,有好几个哦,其中第二个是data,data应该是一个buffer的标准应用程序/ x-www-form-urlencoded格式。
urllib.parse.urlencode()函数接受一个映射或序列集合,并返回一个字符串的格式。我们可以看看urllib.parse.urlencode()的结果是什么样的:
上图的结果刚好与urllib.request.urlopen()的data参数的数据类型要求一致了。
注意,上面urlopen当中的url,这个是分析有道翻译页面的真实的Request URL: