以前咱們用了 urllib 庫,這個做爲入門的工具仍是不錯的,對了解一些爬蟲的基本理念,掌握爬蟲爬取的流程有所幫助。入門以後,咱們就須要學習一些更加高級的內容和工具來方便咱們的爬取。那麼這一節來簡單介紹一下 requests 庫的基本用法。python
利用 pip 安裝git
$ pip install requests
或者利用 easy_installgithub
$ easy_install requests
經過以上兩種方法都可以完成安裝。json
首先咱們引入一個小例子來感覺一下服務器
import requests r = requests.get('http://cuiqingcai.com') print type(r) print r.status_code print r.encoding #print r.text print r.cookies
以上代碼咱們請求了本站點的網址,而後打印出了返回結果的類型,狀態碼,編碼方式,Cookies等內容。cookie
運行結果以下app
<class 'requests.models.Response'> 200 UTF-8 <RequestsCookieJar[]>
怎樣,是否是很方便。別急,更方便的在後面呢。工具
requests庫提供了http全部的基本請求方式。例如post
r = requests.post("http://httpbin.org/post") r = requests.put("http://httpbin.org/put") r = requests.delete("http://httpbin.org/delete") r = requests.head("http://httpbin.org/get") r = requests.options("http://httpbin.org/get")
嗯,一句話搞定。學習
最基本的GET請求能夠直接用get方法
r = requests.get("http://httpbin.org/get")
若是想要加參數,能夠利用 params 參數
import requests payload = {'key1': 'value1', 'key2': 'value2'} r = requests.get("http://httpbin.org/get", params=payload) print r.url
運行結果
http://httpbin.org/get?key2=value2&key1=value1
若是想請求JSON文件,能夠利用 json() 方法解析
例如本身寫一個JSON文件命名爲a.json,內容以下
["foo", "bar", { "foo": "bar" }]
利用以下程序請求並解析
import requests r = requests.get("a.json") print r.text print r.json()
運行結果以下,其中一個是直接輸出內容,另一個方法是利用 json() 方法解析,感覺下它們的不一樣
["foo", "bar", { "foo": "bar" }] [u'foo', u'bar', {u'foo': u'bar'}]
若是想獲取來自服務器的原始套接字響應,能夠取得 r.raw 。 不過須要在初始請求中設置 stream=True 。
r = requests.get('https://github.com/timeline.json', stream=True) r.raw <requests.packages.urllib3.response.HTTPResponse object at 0x101194810> r.raw.read(10) '\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'
這樣就獲取了網頁原始套接字內容。
若是想添加 headers,能夠傳 headers 參數
import requests payload = {'key1': 'value1', 'key2': 'value2'} headers = {'content-type': 'application/json'} r = requests.get("http://httpbin.org/get", params=payload, headers=headers) print r.url
經過headers參數能夠增長請求頭中的headers信息
對於 POST 請求來講,咱們通常須要爲它增長一些參數。那麼最基本的傳參方法能夠利用 data 這個參數。
import requests payload = {'key1': 'value1', 'key2': 'value2'} r = requests.post("http://httpbin.org/post", data=payload) print r.text
運行結果
{ "args": {}, "data": "", "files": {}, "form": { "key1": "value1", "key2": "value2" }, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "23", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "python-requests/2.9.1" }, "json": null, "url": "http://httpbin.org/post" }
能夠看到參數傳成功了,而後服務器返回了咱們傳的數據。
有時候咱們須要傳送的信息不是表單形式的,須要咱們傳JSON格式的數據過去,因此咱們能夠用 json.dumps() 方法把表單數據序列化。
import json import requests url = 'http://httpbin.org/post' payload = {'some': 'data'} r = requests.post(url, data=json.dumps(payload)) print r.text
運行結果
{ "args": {}, "data": "{\"some\": \"data\"}", "files": {}, "form": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "16", "Host": "httpbin.org", "User-Agent": "python-requests/2.9.1" }, "json": { "some": "data" }, "url": "http://httpbin.org/post" }
經過上述方法,咱們能夠POST JSON格式的數據
若是想要上傳文件,那麼直接用 file 參數便可
新建一個 a.txt 的文件,內容寫上 Hello World!
import requests url = 'http://httpbin.org/post' files = {'file': open('test.txt', 'rb')} r = requests.post(url, files=files) print r.text
能夠看到運行結果以下
{ "args": {}, "data": "", "files": { "file": "Hello World!" }, "form": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "156", "Content-Type": "multipart/form-data; boundary=7d8eb5ff99a04c11bb3e862ce78d7000", "Host": "httpbin.org", "User-Agent": "python-requests/2.9.1" }, "json": null, "url": "http://httpbin.org/post" }
這樣咱們便成功完成了一個文件的上傳。
requests 是支持流式上傳的,這容許你發送大的數據流或文件而無需先把它們讀入內存。要使用流式上傳,僅需爲你的請求體提供一個類文件對象便可
with open('massive-body') as f: requests.post('http://some.url/streamed', data=f)
這是一個很是實用方便的功能。