你们要爱惜光阴,用智慧与外人交往。你们的言语要常常带着和气,好像用盐调和,就可知道怎样回答各人。(COLOSSIANS 4:5-6)
第三方库
标准库的内容已经非常多了,前面仅仅列举几个,但是Python给编程者的支持不仅仅在于标准库,它还有不可胜数的第三方库。因此,如果作为一个Pythoner,即使你达到了master的水平,在做某个事情之前最好在网上搜一下是否有标准库或者第三方库替你完成。因为,伟大的艾萨克·牛顿爵士说过:
如果我比别人看得更远,那是因为我站在巨人的肩上。
编程,就要站在巨人的肩上。标准库和第三方库及其提供者,就是巨人,我们本应当谦卑地向其学习,并应用其成果。
安装第三方库
安装第三方库的方法有几种,不同方法有不同的优缺点,读者可以根据自己的喜好或者实际的工作情景来选择。
方法一:利用源码安装
在github.com网站可以下载第三方库的源码(注意:github不是源码的唯一来源,只不过很多源码都在这个网站上,我也喜欢罢了),得到源码之后,在本地安装。
如果你下载的是一个文件包,即得到的源码格式为 zip 、 tar.zip、 tar.bz2的压缩文件,需要先解压缩,然后进入其目录;如果你能熟练使用git命令,可以直接从github中clone源码到本地计算机上,然后进入该目录。
通常会看见一个 setup.py 的文件。
python setup.py install
在这里可能对某些操作系统的读者就漠视了,因为我用的是Ubuntu,读者可以根据自己的操作系统确定安装方法。
如此,就能把这个第三库安装到系统里。具体位置,要视操作系统和你当初安装Python环境时设置的路径而定。
这种安装方法有时候麻烦一些,但是比较灵活,主要体现在:
- 可以下载安装自己选定的任意版本的第三方库,比如最新版,或者更早的某个版本,所以在某些有特殊需要的时候,常常使用这种方式安装。
- 通过安装设置可以指定安装目录,自由度比较高。
有安装就要有卸载,卸载所安装的库非常简单,只需要到相应系统的site-packages目录,直接删掉库文件即卸载。
方法二:pip
用源码安装,不是我推荐的,我推荐的是用第三方库的管理工具安装。
有一个网站,是专门用来存储第三方库的,所有在这个网站上的,都能用pip或者easy_install这种安装工具来安装。网站的地址:https://pypi.python.org/pypi
pip是一个以Python计算机程序语言写成的软件包管理系统,它可以安装和管理软件包,另外不少的软件包也可以在“Python软件包索引”(英语:Python Package Index,简称PyPI)中找到。(源自《维基百科》)
首先,要安装pip。读者可以先检查一下,在你的操作系统中是否已经有了pip,因为有的操作系统,或者已经预先安装了,或者在安装Python的时候安装了。如果你确信没有安装,就要针对你的操作系统进行安装,例如在Ubutun中:
Python 2:
sudo apt-get install python-pip
Python 3:
sudo apt-get install python3-pip
当然,也可以这里下载文件get-pip.py,然后执行python get-pip.py
来安装。这个方法也适用于windows。
pip就这样安装好了,非常简单吧。
然后你就可以淋漓尽致地安装第三方库了,之所以如此,是因为只需要执行pip install XXXXXX
(XXXXXX代表第三方库的名字)即可。当然前提是那个库已经在PyPI里面了。
当第三方库安装完毕,接下来的使用就如同前面标准库一样。
举例:requests库
以requests模块为例,来说明第三方库的安装和使用。之所以选这个,是因为前面介绍了urllib和urllib2两个标准库的模块,与之有类似功能的第三方库中requests也是一个用于在程序中进行http协议下的get和post请求的模块,并且被网友说成“好用的要哭”。
说明:下面的内容是网友1world0x00提供,我仅做了适当编辑。
安装
Python 2:
pip install requests
Python 3:
pip3 install requests
安装好之后,在交互模式下:
>>> import requests
>>> dir(requests)
['ConnectionError', 'HTTPError', 'NullHandler', 'PreparedRequest', 'Request', 'RequestException', 'Response', 'Session', 'Timeout', 'TooManyRedirects', 'URLRequired', '__author__', '__build__', '__builtins__', '__copyright__', '__doc__', '__file__', '__license__', '__name__', '__package__', '__path__', '__title__', '__version__', 'adapters', 'api', 'auth', 'certs', 'codes', 'compat', 'cookies', 'delete', 'exceptions', 'get', 'head', 'hooks', 'logging', 'models', 'options', 'packages', 'patch', 'post', 'put', 'request', 'session', 'sessions', 'status_codes', 'structures', 'utils']
从上面的列表中可以看出,在http中常用到的get,cookies,post等都赫然在目。
get请求
>>> r = requests.get("http://www.itdiffer.com")
得到一个请求的实例,然后:
>>> r.cookies
<<class 'requests.cookies.RequestsCookieJar'>[]>
这个网站对客户端没有写任何cookies内容。换一个看看:
>>> r = requests.get("http://www.1world0x00.com")
>>> r.cookies
<<class 'requests.cookies.RequestsCookieJar'>[Cookie(version=0, name='PHPSESSID', value='buqj70k7f9rrg51emsvatveda2', port=None, port_specified=False, domain='www.1world0x00.com', domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={}, rfc2109=False)]>
仔细观察,是不是看到了cookie的name和value,结合对网络有关知识的理解,是不是有一种豁然开朗恍然大悟的感觉?
继续,还有别的属性可以看看。
>>> r.headers
{'x-powered-by': 'PHP/5.3.3', 'transfer-encoding': 'chunked', 'set-cookie': 'PHPSESSID=buqj70k7f9rrg51emsvatveda2; path=/', 'expires': 'Thu, 19 Nov 1981 08:52:00 GMT', 'keep-alive': 'timeout=15, max=500', 'server': 'Apache/2.2.15 (CentOS)', 'connection': 'Keep-Alive', 'pragma': 'no-cache', 'cache-control': 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'date': 'Mon, 10 Nov 2014 01:39:03 GMT', 'content-type': 'text/html; charset=UTF-8', 'x-pingback': 'http://www.1world0x00.com/index.php/action/xmlrpc'}
>>> r.encoding
'UTF-8'
>>> r.status_code
200
这些都是在客户端看到的网页基本属性。
下面这个比较长,是网页的内容,仅仅截取部分显示:
>>> print r.text
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>1world0x00sec</title>
<link rel="stylesheet" href="http://www.1world0x00.com/usr/themes/default/style.min.css">
<link rel="canonical" href="http://www.1world0x00.com/" />
<link rel="stylesheet" type="text/css" href="http://www.1world0x00.com/usr/plugins/CodeBox/css/codebox.css" />
<meta name="description" content="爱生活,爱拉芳。不装逼还能做朋友。" />
<meta name="keywords" content="php" />
<link rel="pingback" href="http://www.1world0x00.com/index.php/action/xmlrpc" />
......
请求发出后,requests会基于http头部对相应的编码做出有根据的推测,当你访问r.text之时,requests会使用其推测的文本编码。你可以找出requests使用了什么编码,并且能够使用r.coding属性来改变它。
>>> r.content
'\xef\xbb\xbf\xef\xbb\xbf<!DOCTYPE html>\n<html lang="zh-CN">\n <head>\n <meta charset="utf-8">\n <meta name="viewport" content="width=device-width, initial-scale=1.0">\n <title>1world0x00sec</title>\n <link rel="stylesheet" href="http://www.1world0x00.com/usr/themes/default/style.min.css">\n <link ......
以二进制的方式打开服务器并返回数据。
post请求
假如你向某个服务器发送一些数据,可能会谁用post的方式,用requests模块实现这种请求比较简单,只需要传递一个字典给data参数。
>>> import requests
>>> payload = {"key1":"value1","key2":"value2"}
>>> r = requests.post("http://httpbin.org/post")
>>> r1 = requests.post("http://httpbin.org/post", data=payload)
r没有加data的请求,得到的效果是:
r1为data提供了值,再看效果:
新闻比较看才有意思,代码也如此。比较上面两个结果,发现后者当data被赋值之后,在结果中form的值即为data所传入的数据,它就是post给服务器的内容。喵...
http头部
>>> r.headers['content-type']
'application/json'
注意,在引号里面的内容,不区分大小写('CONTENT-TYPE'
也可以)。
还能够自定义头部:
>>> r.headers['content-type'] = 'adad'
>>> r.headers['content-type']
'adad'
注意,当定制头部的时候,如果需要定制的项目有很多,一般用到字典类型的数据。
网上有一个更为详细叙述有关requests模块的网页,可以参考:http://requests-docs-cn.readthedocs.org/zh_CN/latest/index.html
通过一个实例,展示第三方模块的应用方法,其实没有什么特殊的地方,只要安装了,就和用标注库模块一样了。
根据我的个人经验,第三方模块常常在某个方面做得更好,或者性能更优化,所以,不要将其放在我们的视野之外。
如果你认为有必要打赏我,请通过支付宝:[email protected],不胜感激。