芝麻HTTP: Python爬蟲利器之Requests庫的用法

 

前言

以前咱們用了 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請求能夠直接用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請求

 

對於 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)

這是一個很是實用方便的功能。

相關文章
相關標籤/搜索