第三方庫(kù)

2018-02-24 15:48 更新

標(biāo)準(zhǔn)庫(kù)的內(nèi)容已經(jīng)非常多了,前面僅僅列舉幾個(gè),但是python給編程者的支持還不僅僅在于標(biāo)準(zhǔn)庫(kù),它還有不可勝數(shù)的第三方庫(kù)。因此,如果作為一個(gè)python編程者,即使你達(dá)到了master的水平,最好的還是要在做某個(gè)事情之前,在網(wǎng)上搜一下是否有標(biāo)準(zhǔn)庫(kù)或者第三方庫(kù)替你完成那件事。因?yàn)?,偉大的艾薩克·牛頓爵士說(shuō)過(guò):

如果我比別人看得更遠(yuǎn),那是因?yàn)槲艺驹诰奕说募缟稀?/p>

編程,就要站在巨人的肩上。標(biāo)準(zhǔn)庫(kù)和第三方庫(kù)以及其提供者,就是巨人,我們本應(yīng)當(dāng)謙卑地向其學(xué)習(xí),并應(yīng)用其成果。

安裝第三方庫(kù)

要是用第三方庫(kù),第一步就是要安裝,在本地安裝完畢,就能如同標(biāo)準(zhǔn)庫(kù)一樣使用了。其安裝方法如下:

方法一:利用源碼安裝

在github.com網(wǎng)站可以下載第三方庫(kù)的源碼(或者其它途徑),得到源碼之后,在本地安裝。

一般情況,得到的碼格式大概都是 zip 、 tar.zip、 tar.bz2格式的壓縮包。解壓這些包,進(jìn)入其文件夾,通常會(huì)看見(jiàn)一個(gè) setup.py 的文件。如果是Linux或者M(jìn)ac(我是用ubuntu,特別推薦哦),就在這里運(yùn)行shell,執(zhí)行命令:

python setup.py install

如果用的是windows,需要打開(kāi)命令行模式,執(zhí)行上述指令即可。

如此,就能把這個(gè)第三庫(kù)安裝到系統(tǒng)里。具體位置,要視操作系統(tǒng)和你當(dāng)初安裝python環(huán)境時(shí)設(shè)置的路徑而定。默認(rèn)條件下,windows是在C:\Python2.7\Lib\site-packages,Linux在/usr/local/lib/python2.7/dist-packages(這個(gè)只是參考,不同發(fā)行版會(huì)有差別,具體請(qǐng)讀者根據(jù)自己的操作系統(tǒng),自己找找),Mac在?/Library/Python/2.7/site-packages。

有安裝就要有卸載,卸載所安裝的庫(kù)非常簡(jiǎn)單,只需要到相應(yīng)系統(tǒng)的site-packages目錄,直接刪掉庫(kù)文件即卸載。

方法二:pip

用源碼安裝,不是我推薦的,我推薦的是用第三方庫(kù)的管理工具安裝。有一個(gè)網(wǎng)站,是專(zhuān)門(mén)用來(lái)存儲(chǔ)第三方庫(kù)的,所有在這個(gè)網(wǎng)站上的,都能用pip或者easy_install這種安裝工具來(lái)安裝。這個(gè)網(wǎng)站的地址:https://pypi.python.org/pypi

首先,要安裝pip(python官方推薦這個(gè),我當(dāng)然要順勢(shì)了,所以,就只介紹并且后面也只使用這個(gè)工具)。如果讀者跟我一樣,用的是ubuntu或者其它某種Linux,基本不用這個(gè)操作,在安裝操作系統(tǒng)的時(shí)候已經(jīng)默認(rèn)把這個(gè)東西安裝好了(這還不是用ubuntu的理由嗎?)。如果因?yàn)槭裁丛颍瑳](méi)有安裝,可以使用如下方法:

Debian and Ubuntu:

sudo apt-get install python-pip

Fedora and CentOS:

sudo yum install python-pip

當(dāng)然,也可以這里下載文件get-pip.py,然后執(zhí)行python get-pip.py來(lái)安裝。這個(gè)方法也適用于windows。

pip安裝好了。如果要安裝第三方庫(kù),只需要執(zhí)行pip install XXXXXX(XXXXXX代表第三方庫(kù)的名字)即可。

當(dāng)?shù)谌綆?kù)安裝完畢,接下來(lái)的使用就如同前面標(biāo)準(zhǔn)庫(kù)一樣。

舉例:requests庫(kù)

以requests模塊為例,來(lái)說(shuō)明第三方庫(kù)的安裝和使用。之所以選這個(gè),是因?yàn)榍懊娼榻B了urllib和urllib2兩個(gè)標(biāo)準(zhǔn)庫(kù)的模塊,與之有類(lèi)似功能的第三方庫(kù)中requests也是一個(gè)用于在程序中進(jìn)行http協(xié)議下的get和post請(qǐng)求的模塊,并且被網(wǎng)友說(shuō)成“好用的要哭”。

說(shuō)明:下面的內(nèi)容是網(wǎng)友1world0x00提供,我僅做了適當(dāng)編輯。

安裝

pip 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請(qǐng)求

>>> r = requests.get("http://www.itdiffer.com")

得到一個(gè)請(qǐng)求的實(shí)例,然后:

>>> r.cookies
<<class 'requests.cookies.RequestsCookieJar'>[]>

這個(gè)網(wǎng)站對(duì)客戶(hù)端沒(méi)有寫(xiě)任何cookies內(nèi)容。換一個(gè)看看:

>>> 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)]>

原來(lái)這樣呀。繼續(xù),還有別的屬性可以看看。

>>> 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

下面這個(gè)比較長(zhǎng),是網(wǎng)頁(yè)的內(nèi)容,僅僅截取顯示部分:

>>> 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"  rel="external nofollow" target="_blank"  rel="external nofollow" target="_blank" >
  <link rel="canonical"  rel="external nofollow" target="_blank"  />
  <link rel="stylesheet" type="text/css"  rel="external nofollow" target="_blank"  />
  <meta name="description" content="愛(ài)生活,愛(ài)拉芳。不裝逼還能做朋友。" />
  <meta name="keywords" content="php" />
  <link rel="pingback"  rel="external nofollow" target="_blank"  />

  ......

請(qǐng)求發(fā)出后,requests會(huì)基于http頭部對(duì)相應(yīng)的編碼做出有根據(jù)的推測(cè),當(dāng)你訪問(wèn)r.text之時(shí),requests會(huì)使用其推測(cè)的文本編碼。你可以找出requests使用了什么編碼,并且能夠使用r.coding屬性來(lái)改變它。

>>> 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"  rel="external nofollow" target="_blank"  rel="external nofollow" target="_blank" >\n            <link ......

以二進(jìn)制的方式打開(kāi)服務(wù)器并返回?cái)?shù)據(jù)。

post請(qǐng)求

requests發(fā)送post請(qǐng)求,通常你會(huì)想要發(fā)送一些編碼為表單的數(shù)據(jù)——非常像一個(gè)html表單。要實(shí)現(xiàn)這個(gè),只需要簡(jiǎn)單地傳遞一個(gè)字典給data參數(shù)。你的數(shù)據(jù)字典在發(fā)出請(qǐng)求時(shí)會(huì)自動(dòng)編碼為表單形式。

>>> import requests
>>> payload = {"key1":"value1","key2":"value2"}
>>> r = requests.post("http://httpbin.org/post")
>>> r1 = requests.post("http://httpbin.org/post", data=payload)

r沒(méi)有加data的請(qǐng)求,看看效果:

r1是加了data的請(qǐng)求,看效果:

多了form項(xiàng)。喵。

http頭部

>>> r.headers['content-type']
'application/json'

注意,在引號(hào)里面的內(nèi)容,不區(qū)分大小寫(xiě)'CONTENT-TYPE'也可以。

還能夠自定義頭部:

>>> r.headers['content-type'] = 'adad'
>>> r.headers['content-type']
'adad'

注意,當(dāng)定制頭部的時(shí)候,如果需要定制的項(xiàng)目有很多,需要用到數(shù)據(jù)類(lèi)型為字典。

網(wǎng)上有一個(gè)更為詳細(xì)敘述有關(guān)requests模塊的網(wǎng)頁(yè),可以參考:http://requests-docs-cn.readthedocs.org/zh_CN/latest/index.html

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)