Python爬蟲:數據抓取工具及類庫詳解

前言

文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,版權歸原做者全部,若有問題請及時聯繫咱們以做處理。python

做者: ncepu_Chengit

PS:若有須要Python學習資料的小夥伴能夠加點擊下方連接自行獲取github

http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cefjson

數據抓取的命令行工具

curlapi

curl是一個利用URL語法在命令行下進行網絡通訊的工具,相似於一個命令行版本的瀏覽器,但不會對頁面進行渲染.其用法很簡單,直接在命令行中輸入curl [URL地址] [參數]便可,如:瀏覽器

curl https://www.baidu.com

其經常使用參數以下: 在這裏插入圖片描述 wget服務器

wget也是一個利用URL語法在命令行環境下進行文件傳輸的工具,其基本用法爲wget [URL地址] [參數],如:cookie

wget https://www.baidu.com

其經常使用參數以下: 在這裏插入圖片描述 下面例子演示如何使用wget鏡像一個網站到本地並啓動:網絡

使用wget --mirror命令將整個網站的鏡像下載到本地app

wget --mirror -p --convert-links http://www.httpbin.org

切換到下載好的資源目錄下,使用Python自帶的http.server模塊開啓一個微型服務器

python -m http.server

訪問localhost:8000,便可訪問咱們搭建在本機上的鏡像網站.

數據抓取的Python庫

Python中有兩個經常使用的抓取數據的庫:urllib和requests.其中requests庫封裝了urllib庫,且比urllib庫更爲優雅.所以,咱們能夠直接學習requests庫.

requests庫

request庫的應用比較簡單,下面是官方提供的一段示例代碼:

r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
r.status_code # 返回 200
r.headers['content-type'] # 返回 'application/json; charset=utf8'
r.encoding # 返回 'utf-8'
r.text # 返回 u'{"type":"User"...'
r.json() # 返回 {u'private_gists': 419, u'total_private_repos': 77, ...}

requests庫的簡單使用

發送HTTP請求

下面幾個方法能夠發送HTTP請求,對應於HTTP的各類請求類型

  • requests.get(url, params=None, **kwargs)

  • requests.post(url, data=None, json=None, **kwargs)

  • requests.put(url, data=None, **kwargs)

  • requests.delete(url, **kwargs)

  • requests.head(url, **kwargs)

  • requests.options(url, **kwargs)

上面六個方法分別對應HTTP請求類型中的GET,POST,PUT,DELETE,HEAD和OPTIONS,各參數意義以下:

  • url: 請求的URL地址.

  • params: GET請求放進URL中的請求參數,以字典形式存儲.

  • data: 請求體中的數據.

  • **kwargs: 該請求須要的其餘參數,包括:

  • headers: 以字典格式存儲的請求頭內容.

  • json: 以字典形式存儲的請求體中數據,等同於data參數

  • cookies: 以字典形式存儲的cookies.

  • allow_redirects: 是否容許重定向,爲一個布爾值

  • timeout: 設置超時時間,單位爲秒

  • auth: 設置身份認證信息

解析HTTP響應

上述requests.get(), requests.post(), requests.put(), requests.delete(), requests.head(), requests.options()方法都會返回一個requests.models.Response對象,該對象封裝了HTTP響應報文,該對象提供了下述經常使用方法和屬性用於解析HTTP響應.

解析響應狀態的屬性和方法

url: 表示該HTTP請求的URL.

payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
r = requests.get('http://httpbin.org/get', params=payload)

r.url # 獲得 http://httpbin.org/get?key1=value1&key2=value2&key2=value3
  • tatus_code: 該HTTP響應的狀態碼.

  • reason: 響應狀態碼的說明.

解析響應內容的屬性和方法:

  • encoding: 該HTTP響應的編碼.

  • content: 該HTTP響應的內容.

  • text: 該HTTP響應的文本.根據r.encoding設置的編碼格式對r.content進行解碼獲得.

  • .json(): 將json格式的相應內容解析爲字典,若解析失敗則拋出ValueError異常.

解析響應頭的屬性和方法:

  • headers: 以字典形式返回HTTP響應頭,該字典的特殊之處在於其不區分鍵的大小寫.

r.headers['Content-Type']  # 獲得 'application/json'
r.headers.get('content-type') # 獲得 'application/json'

報錯

  • 遇到網絡問題(如DNS 查詢失敗、拒絕鏈接等)時,拋出一個ConnectionError異常.

  • 若HTTP請求返回了不成功的狀態碼(4xx或5xx),調用Response對象的raise_for_status() 會拋出一個HTTPError異常.

  • 若請求超時,則拋出一個Timeout異常.

  • 若請求超過了設定的最大重定向次數,則會拋出一個TooManyRedirects異常.

上述全部異常都繼承自requests.exceptions.RequestException .

相關文章
相關標籤/搜索