Python 的內置 urllib 模塊,能夠用於訪問資源,可是,用起來比較麻煩。python
requests 是一個第三方庫,在處理 URL 資源上面很是方便,這也是入門爬蟲比較推薦的庫之一。git
若是安裝了 Anaconda 這一步能夠省略,不然,可使用下面的命令來安裝 requests:github
$ pip install requests
使用 requests,須要先導入 requests 模塊:json
>>> import requests
使用 get()
獲取某個頁面。以 requests 官方文檔說起的 Github 公共時間線爲例:api
>>> url = "https://api.github.com/events" >>> resp = requests.get(url)
在這裏,requests 的 get() 方法返回一個 Response
對象,賦值給變量 resp
。如今能夠經過這個對象獲取須要的內容。瀏覽器
>>> resp.status_code # 響應碼,200 表示正常訪問 200 >>> resp.text '[{"id":"11696703469","type":"CreateEvent","actor":{"id":59443325,"login":"mahmoudjafarinejad",...' >>> resp.encoding 'utf-8'
status_code
返回的是響應碼,200
在這裏表示正常訪問。resp.text
在這裏返回的是響應的內容。在返回的響應內容,requests 會自動推測文本編碼,可使用 encoding
屬性來查看具體使用了什麼編碼,例如文中使用該屬性返回 utf-8
。bash
返回的 Response
對象,可使用 content
屬性得到字節對象:服務器
>>> resp.content b'[{"id":"11696703469","type":"CreateEvent","actor":{"id":59443325,"login":"mahmoudjafarinejad",...'
requests 能夠處理 JSON 數據。但這中間也有些須要注意的地方,先看代碼:微信
>>> resp.json() [{'id': '11697045499', 'type': 'IssueCommentEvent', 'actor': {'id': 5268763, 'login': 'zz-jason', ...]
在這裏使用 json()
能夠得到 JSON 內容。這裏須要注意:若是解碼失敗,該方法會拋出異常。例如,若返回的響應碼是 401
,嘗試訪問 resp.json()
時,就會拋出 ValueError: No JSON object could be decoded
異常。post
還有一個須要注意的地方,並非說成功調用 resp.json()
就表示響應成功。有些服務器在失敗的響應中包含一個 JSON 對象。這個時候調用 resp.json()
返回的將是這個包含錯誤細節的 JSON 對象。因此要檢測是否響應成功還須要配合使用 resp.status_code
。
當訪問網頁的時候,咱們可能會遇到帶參數的 URL,當使用 requests 的時候,咱們能夠傳入 dict 做爲參數傳入(這裏以 http://httpbin.org
爲例):
>>> resp = requests.get('http://httpbin.org/get', params={'key1': 'value1', 'key2': 'value2'}) >>> resp.url 'http://httpbin.org/get?key1=value1&key2=value2'
在上面的例子當中,傳入 key1=value1
和 key2=value2
到指定的 URL 中。使用 resp.url
能夠看到 URL 已被正確編碼。
傳遞 dict 做爲參數的時候,dict 中值爲 None 的鍵都不會被添加到 URL 的查詢字符串中。
有時候直接使用 get() 方法訪問網站時,返回的響應碼並非 200。這是由於有些網站有反爬機制,這個時候能夠定義請求頭,模擬瀏覽器正常訪問網站,這裏咱們以豆瓣爲例,在沒有定義請求頭的狀況下嘗試使用 get() 方法:
>>> url ="https://www.douban.com/" >>> resp = requests.get(url) >>> resp.status_code 418
能夠看到這裏返回的響應碼是 418
。如今定義請求頭,再次訪問:
>>> headers = {'User-Agent': 'Mozilla/5.0'} >>> resp = requests.get(url, headers=headers) >>> resp.status_code 200
這個時候,返回的響應碼爲 200,表示訪問成功。那麼這個時候就能夠利用返回的 Response 對象獲取須要的內容。
這裏提醒下: 就上面以豆瓣爲例,不要頻繁發起請求,如果頻繁請求,有可能會被認爲是惡意攻擊,並且這樣也會對服務器形成負擔。
當須要發送一些編碼爲表單形式的數據。這個時候,可使用 post()
方法,並傳遞一個字典給 data
參數。requests 在發出請求的時候會將傳入的數據字典編碼爲表單形式:
>>> data = {'key1': 'value1', 'key2': 'value2'} >>> resp = requests.post('http://httpbin.org/post', data=data) >>> print(resp.text) { ... "form": { "key1": "value1", "key2": "value2" }, ... }
能夠告訴 requests 在通過 timeout
參數所給定的時間中止響應。(timeout 參數以秒爲單位)
>>> resp = requests.get(url, timeout=2)
這裏表示在 2 秒後超時。
以上關於 requests 簡單上手的內容,更多詳細的內容能夠訪問下面的連接進行詳細參閱:
https://requests.readthedocs.io/en/latest/
歡迎關注微信公衆號《書所集錄》