|
| 1 | +>你们要爱惜光阴,用智慧与外人交往。你们的言语要常常带着和气,好像用盐调和,就可知道怎样回答各人。(COLOSSIANS 4:5-6) |
| 2 | +
|
| 3 | +#第三方库 |
| 4 | + |
| 5 | +标准库的内容已经非常多了,前面仅仅列举几个,但是python给编程者的支持还不仅仅在于标准库,它还有不可胜数的第三方库。因此,如果作为一个python编程者,即使你达到了master的水平,最好的还是要在做某个事情之前,在网上搜一下是否有标准库或者第三方库替你完成那件事。因为,伟大的艾萨克·牛顿爵士说过: |
| 6 | + |
| 7 | +>如果我比别人看得更远,那是因为我站在巨人的肩上。 |
| 8 | +
|
| 9 | +编程,就要站在巨人的肩上。标准库和第三方库以及其提供者,就是巨人,我们本应当谦卑地向其学习,并应用其成果。 |
| 10 | + |
| 11 | +##安装第三方库 |
| 12 | + |
| 13 | +要是用第三方库,第一步就是要安装,在本地安装完毕,就能如同标准库一样使用了。其安装方法如下: |
| 14 | + |
| 15 | +**方法一:利用源码安装** |
| 16 | + |
| 17 | +在github.com网站可以下载第三方库的源码(或者其它途径),得到源码之后,在本地安装。 |
| 18 | + |
| 19 | +一般情况,得到的码格式大概都是 zip 、 tar.zip、 tar.bz2格式的压缩包。解压这些包,进入其文件夹,通常会看见一个 setup.py 的文件。如果是Linux或者Mac(我是用ubuntu,特别推荐哦),就在这里运行shell,执行命令: |
| 20 | + |
| 21 | + python setup.py install |
| 22 | + |
| 23 | +如果用的是windows,需要打开命令行模式,执行上述指令即可。 |
| 24 | + |
| 25 | +如此,就能把这个第三库安装到系统里。具体位置,要视操作系统和你当初安装python环境时设置的路径而定。默认条件下,windows是在`C:\Python2.7\Lib\site-packages`,Linux在`/usr/local/lib/python2.7/dist-packages`(这个只是参考,不同发行版会有差别,具体请读者根据自己的操作系统,自己找找),Mac在 `/Library/Python/2.7/site-packages`。 |
| 26 | + |
| 27 | +有安装就要有卸载,卸载所安装的库非常简单,只需要到相应系统的site-packages目录,直接删掉库文件即卸载。 |
| 28 | + |
| 29 | +**方法二:pip** |
| 30 | + |
| 31 | +用源码安装,不是我推荐的,我推荐的是用第三方库的管理工具安装。有一个网站,是专门用来存储第三方库的,所有在这个网站上的,都能用pip或者easy_install这种安装工具来安装。这个网站的地址:https://pypi.python.org/pypi |
| 32 | + |
| 33 | +首先,要安装pip(python官方推荐这个,我当然要顺势了,所以,就只介绍并且后面也只使用这个工具)。如果读者跟我一样,用的是ubuntu或者其它某种Linux,基本不用这个操作,在安装操作系统的时候已经默认把这个东西安装好了(这还不是用ubuntu的理由吗?)。如果因为什么原因,没有安装,可以使用如下方法: |
| 34 | + |
| 35 | +Debian and Ubuntu: |
| 36 | + |
| 37 | + sudo apt-get install python-pip |
| 38 | + |
| 39 | +Fedora and CentOS: |
| 40 | + |
| 41 | + sudo yum install python-pip |
| 42 | + |
| 43 | +当然,也可以这里下载文件[get-pip.py](https://bootstrap.pypa.io/get-pip.py),然后执行`python get-pip.py`来安装。这个方法也适用于windows。 |
| 44 | + |
| 45 | +pip安装好了。如果要安装第三方库,只需要执行`pip install XXXXXX`(XXXXXX代表第三方库的名字)即可。 |
| 46 | + |
| 47 | +当第三方库安装完毕,接下来的使用就如同前面标准库一样。 |
| 48 | + |
| 49 | +##举例:requests库 |
| 50 | + |
| 51 | +以requests模块为例,来说明第三方库的安装和使用。之所以选这个,是因为前面介绍了urllib和urllib2两个标准库的模块,与之有类似功能的第三方库中requests也是一个用于在程序中进行http协议下的get和post请求的模块,并且被网友说成“好用的要哭”。 |
| 52 | + |
| 53 | +**说明**:下面的内容是网友1world0x00提供,我仅做了适当编辑。 |
| 54 | + |
| 55 | +###安装 |
| 56 | + |
| 57 | + pip install requests |
| 58 | + |
| 59 | +安装好之后,在交互模式下: |
| 60 | + |
| 61 | + >>> import requests |
| 62 | + >>> dir(requests) |
| 63 | + ['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'] |
| 64 | + |
| 65 | +从上面的列表中可以看出,在http中常用到的get,cookies,post等都赫然在目。 |
| 66 | + |
| 67 | +###get请求 |
| 68 | + |
| 69 | + >>> r = requests.get("http://www.itdiffer.com") |
| 70 | + |
| 71 | +得到一个请求的实例,然后: |
| 72 | + |
| 73 | + >>> r.cookies |
| 74 | + <<class 'requests.cookies.RequestsCookieJar'>[]> |
| 75 | + |
| 76 | +这个网站对客户端没有写任何cookies内容。换一个看看: |
| 77 | + |
| 78 | + >>> r = requests.get("http://www.1world0x00.com") |
| 79 | + >>> r.cookies |
| 80 | + <<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)]> |
| 81 | + |
| 82 | +原来这样呀。继续,还有别的属性可以看看。 |
| 83 | + |
| 84 | + >>> r.headers |
| 85 | + {'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'} |
| 86 | + |
| 87 | + >>> r.encoding |
| 88 | + 'UTF-8' |
| 89 | + |
| 90 | + >>> r.status_code |
| 91 | + 200 |
| 92 | + |
| 93 | +下面这个比较长,是网页的内容,仅仅截取显示部分: |
| 94 | + |
| 95 | + >>> print r.text |
| 96 | + |
| 97 | + <!DOCTYPE html> |
| 98 | + <html lang="zh-CN"> |
| 99 | + <head> |
| 100 | + <meta charset="utf-8"> |
| 101 | + <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| 102 | + <title>1world0x00sec</title> |
| 103 | + <link rel="stylesheet" href="http://www.1world0x00.com/usr/themes/default/style.min.css"> |
| 104 | + <link rel="canonical" href="http://www.1world0x00.com/" /> |
| 105 | + <link rel="stylesheet" type="text/css" href="http://www.1world0x00.com/usr/plugins/CodeBox/css/codebox.css" /> |
| 106 | + <meta name="description" content="爱生活,爱拉芳。不装逼还能做朋友。" /> |
| 107 | + <meta name="keywords" content="php" /> |
| 108 | + <link rel="pingback" href="http://www.1world0x00.com/index.php/action/xmlrpc" /> |
| 109 | + |
| 110 | + ...... |
| 111 | + |
| 112 | +请求发出后,requests会基于http头部对相应的编码做出有根据的推测,当你访问r.text之时,requests会使用其推测的文本编码。你可以找出requests使用了什么编码,并且能够使用r.coding属性来改变它。 |
| 113 | + |
| 114 | + >>> r.content |
| 115 | + '\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 ...... |
| 116 | + |
| 117 | + 以二进制的方式打开服务器并返回数据。 |
| 118 | + |
| 119 | +###post请求 |
| 120 | + |
| 121 | +requests发送post请求,通常你会想要发送一些编码为表单的数据——非常像一个html表单。要实现这个,只需要简单地传递一个字典给data参数。你的数据字典在发出请求时会自动编码为表单形式。 |
| 122 | + |
| 123 | + >>> import requests |
| 124 | + >>> payload = {"key1":"value1","key2":"value2"} |
| 125 | + >>> r = requests.post("http://httpbin.org/post") |
| 126 | + >>> r1 = requests.post("http://httpbin.org/post", data=payload) |
| 127 | + |
| 128 | +r没有加data的请求,看看效果: |
| 129 | + |
| 130 | + |
| 131 | + |
| 132 | +r1是加了data的请求,看效果: |
| 133 | + |
| 134 | + |
| 135 | + |
| 136 | +多了form项。喵。 |
| 137 | + |
| 138 | +###http头部 |
| 139 | + |
| 140 | + >>> r.headers['content-type'] |
| 141 | + 'application/json' |
| 142 | + |
| 143 | +注意,在引号里面的内容,不区分大小写`'CONTENT-TYPE'`也可以。 |
| 144 | + |
| 145 | +还能够自定义头部: |
| 146 | + |
| 147 | + >>> r.headers['content-type'] = 'adad' |
| 148 | + >>> r.headers['content-type'] |
| 149 | + 'adad' |
| 150 | + |
| 151 | +注意,当定制头部的时候,如果需要定制的项目有很多,需要用到数据类型为字典。 |
| 152 | + |
| 153 | +网上有一个更为详细叙述有关requests模块的网页,可以参考:[http://requests-docs-cn.readthedocs.org/zh_CN/latest/index.html](http://requests-docs-cn.readthedocs.org/zh_CN/latest/index.html) |
| 154 | + |
| 155 | +------ |
| 156 | + |
| 157 | +[总目录](./index.md) | [上节:标准库(8)](./227.md) | [下节:存入文件](./229.md) |
| 158 | + |
| 159 | +如果你认为有必要打赏我,请通过支付宝:**qiwsir@126.com**,不胜感激。 |
0 commit comments