1. 程式人生 > >Requests 庫 | 不可勝數的 Python 第三方庫

Requests 庫 | 不可勝數的 Python 第三方庫

寫在之前

標準庫的內容已經非常多了,我在前面的文章中已經介紹了七八個,沒看的可以回頭找著去看看。雖然介紹了不少,但是 Python 給程式設計者的支援不僅僅在於標準庫,它還有不可勝數的第三方庫。

作為一個 Pythoner,即使你的技術已經達到大佬的級別,在做某件事情之前最好還是 Google 一下是否有標準庫或者第三方庫來幫你完成,不是有那麼一句話麼:“如果我比別人看的更遠,那是因為我站在巨人的肩膀上”。程式設計就是要站在巨人的肩膀上,標準庫 & 第三方庫及其提供者就是這樣的巨人,我們應心懷感念,虛心學習。

安裝第三方庫

安裝第三方庫的方法有很多,不同的方法有不同的優缺點,大家可以根據自己的喜好或者實際中的工作需要來選擇。

使用 pip 安裝,這個是我首推的安裝方法,用第三方庫的管理工具安裝。有一個網站是專門用來儲存第三方庫的,網站地址為 https://pypi.python.org/pypi ,所有在這個網站上,可以用 pip 或者 easy_install 這種安裝工具來安裝。

pip 是一個以 Python 計算機程式語言寫成的軟體包管理系統,它可以安裝和管理軟體包。另外,不少的軟體包也可以在 “Python 軟體包索引” 中找到。
首先,要安裝 pip,大家可以先檢查一下在自己的作業系統中是否已經有了 pip,因為有的作業系統,或者已經預先安裝了,或者在安裝 Python 的時候就安裝了。如果確定沒有安裝的話,就要針對自己的作業系統進行安裝,例如在 Ubuntu 系統中:

pip apt-get install python3-pip

當然也可以下載檔案 get-pip.pyhttps://bootstrap.pypa.io/get-pip.py),然後執行 python get-pip.py 來安裝,這個方法同樣適用於 Windows 系統。

這樣 pip3 就安裝好了,然後你就可以“為所欲為”的安裝第三方庫了。之所以這樣,是因為只需要執行 pip3 install **** (**** 代表第三方庫的名字,如果你做了特別的設定,或者不再考慮 python2 的相關安裝了,那麼可以直接使用 pip install **** 的方式進行安裝)即可。當然這個前提是那個庫已經在 PyPI 裡面了。

當第三方庫安裝完成以後,接下來的使用就如同前面的標準庫一樣。

requests 庫

在這裡我們以很重要的 requests 庫為例,來說明一下第三方庫的安裝和使用。requests 是一個用於在程式中進行 http 協議下的 get 和 post 請求的模組,可以說是好用到哭。

1.安裝

pip3 install requests

安裝好之後進入互動模式,在互動模式下進行如下操作:

>>> import requests
>>> dir(requests)
['ConnectTimeout', 'ConnectionError', 'DependencyWarning', 'FileModeWarning', 'HTTPError', 'NullHandler', 'PreparedRequest', 'ReadTimeout', 'Request', 'RequestException', 'RequestsDependencyWarning', 'Response', 'Session', 'T
imeout', 'TooManyRedirects', 'URLRequired', '__author__', '__author_email__', '__build__', '__builtins__', '__cached__', '__cake__', '__copyright__', '__description__', '__doc__', '__file__', '__license__', '__loader__', '__n
ame__', '__package__', '__path__', '__spec__', '__title__', '__url__', '__version__', '_check_cryptography', '_internal_utils', 'adapters', 'api', 'auth', 'certs', 'chardet', 'check_compatibility', 'codes', 'compat', 'cookies
', 'delete', 'exceptions', 'get', 'head', 'hooks', 'logging', 'models', 'options', 'packages', 'patch', 'post', 'put', 'request', 'session', 'sessions', 'status_codes', 'structures', 'urllib3', 'utils', 'warnings']

從上面的程式碼可以看出,在 http 中常用到的 get,cookies,post 都赫然在目。

2.get 請求

>>> r = requests.get('http://www.baidu.com')

上面得到某度的一個請求例項,然後:

>>> r.cookies
<RequestsCookieJar[Cookie(version=0, name='BDORZ', value='27315', port=None, port_specified=False, domain='.baidu.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1537
434404, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False)]>

仔細觀察上面,是不是看到了 cookie 的 name 和 value ?結合我們以前學過的網路的相關知識,有沒有一種豁然開朗的感覺?下面讓我們繼續來檢視一下其它的屬性:

>>> r.headers
{'Server': 'bfe/1.0.8.18', 'Date': 'Wed, 19 Sep 2018 09:06:42 GMT', 'Content-Type': 'text/html', 'Last-Modified': 'Mon, 23 Jan 2017 13:28:36 GMT', 'Connection': 'Keep-Alive', 'Cache-Control': 'private, no-cache, no-store, pro
xy-revalidate, no-transform', 'Pragma': 'no-cache', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
>>> r.encoding
'ISO-8859-1'
>>> r.status_code
200

上面這些都是在客戶端看到的網頁的基本屬性,下面這個則是網頁的內容,比較長,我只擷取部分內容顯示:

>>> print(r.text)
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.
bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>
....

請求發出後,requests 會基於 http 頭部對相應的編碼做出有根據的推測,當你訪問 r.text 時,requests 會使用其推測的文字編碼。你可以找出 requests 使用了什麼編碼,並且能夠使用 r.coding 屬性來改變它。

>>> r.content
b'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=tex
t/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>

3.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 的請求,得到的效果如下:

>>> print(r.text)
{
 "args": {},
 "data": "",
 "files": {},
 "form": {},
 "headers": {
   "Accept": "*/*",
   "Accept-Encoding": "gzip, deflate",
   "Connection": "close",
   "Content-Length": "0",
   "Host": "httpbin.org",
   "User-Agent": "python-requests/2.19.1"
 },
 "json": null,
 "origin": "58.33.136.74",
 "url": "http://httpbin.org/post"
}

r1 為 data 提供了值,得到的效果如下:

>>> print(r1.text)
{
 "args": {},
 "data": "",
 "files": {},
 "form": {
   "key1": "value1",
   "key2": "value2"
 },
 "headers": {
   "Accept": "*/*",
   "Accept-Encoding": "gzip, deflate",
   "Connection": "close",
   "Content-Length": "23",
   "Content-Type": "application/x-www-form-urlencoded",
   "Host": "httpbin.org",
   "User-Agent": "python-requests/2.19.1"
 },
 "json": null,
 "origin": "",
 "url": "http://httpbin.org/post"
}

比較上面兩個結果,發現後者當 data 被賦值以後,在結果中 form 的值即為 data 所傳入的資料,它就是 post 給伺服器的內容。

寫在之後

通過這麼一個例項,在上面我們展示了一下第三方模組的應用方法,其實沒有什麼特殊的地方,安裝後和用標準庫模組一樣。一般來說的話,第三方模組常常在某個方面做得更好,或者效能更優。所以,請不要把它們放在你的視線之外。

更多內容,歡迎關注公眾號「Python空間」,期待和你的交流。
在這裡插入圖片描述