《Python網路爬蟲與數據挖掘小課堂》——part4

  • 2019 年 11 月 24 日
  • 筆記

Requests庫的入門-python

01

簡介

Requests庫是Python HTTP 庫。

Requests作用:自動爬取HTML頁面/自動提交網路請求。

Requests庫項目地址:http://docs.python-requests.org/en/master/

中文下載地址:http://docs.python-requests.org/zh_CN/latest/

02

安裝

Requests庫的安裝有兩種方式:

1.pip安裝:簡單快捷(推薦)

Win_7_64bit平台:

「以管理員身份運行」cmd,執行 pip install requests

Python的下載(版本有2.x和3.x)、安裝、環境變數配置、pip安裝及使用見往前文章(爬蟲系列)。

2.python命令方式

先去github網址的Requests庫項目下載:https://github.com/kennethreitz/requests

下載完解壓即可

下載完解壓到桌面即可,該文件夾目錄如下:

Win_7_64bit平台:「以管理員身份運行」cmd,

執行 python setup.py install

其中setup.py是Requests庫中setup.py的絕對路徑。

測試程式碼:以官網為例

>>> import requests

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

>>> r.status_code

>>> r.headers

>>> r.encoding

>>> r.text

03

方法

Requests庫的七個主要方法及說明

requests.request():構造一個請求,支撐以下各方法的基礎方法

requests.get():獲取HTML網頁的主要方法,對應於HTTP的GET

requests.head():獲取HTML網頁頭資訊的方法,對應於HTTP的HEAD

requests.post():向HTML網頁提交POST請求的方法,對應於HTTP的POST

requests.put():向HTML網頁提交PUT請求的方法,對應於HTTP的PUT

requests.patch():向HTML網頁提交局部修改請求,對應於HTTP的PATCH

requests.delete():向HTML頁面提交刪除請求,對應於HTTP的DELETE

01

Requests庫的get()方法

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

  • url : 擬獲取頁面的url鏈接
  • params : url中的額外參數,字典或位元組流格式,可選
  • **kwargs : 12個控制訪問的參數

02

Requests庫的2個重要對象

Response對象包含爬蟲返回的內容

Response對象包含伺服器返回的所有資訊,也包含請求的Request資訊

Response對象的屬性及說明

r.status_code:HTTP請求的返回狀態,200表示連接成功,404表示失敗

r.text:HTTP響應內容的字元串形式,即,url對應的頁面內容

r.encoding:從HTTP header中猜測的響應內容編碼方式

r.apparent_encoding:從內容中分析出的響應內容編碼方式(備選編碼方式)

r.content:HTTP響應內容的二進位形式

理解Response的編碼

r.encoding:從HTTP header中猜測的響應內容編碼方式

r.apparent_encoding:從內容中分析出的響應內容編碼方式(備選編碼方式)

詳細說明如下:

  1. r.encoding:如果header中不存在charset,則認為編碼為ISO‐8859‐1
  2. r.text:根據r.encoding顯示網頁內容
  3. r.apparent_encoding:根據網頁內容分析出的編碼方式,可以看作是r.encoding的備選

03

理解Requests庫的異常

異常及說明

requests.ConnectionError:網路連接錯誤異常,如DNS查詢失敗、拒絕連接等

requests.HTTPError:HTTP錯誤異常

requests.URLRequired:URL缺失異常

requests.TooManyRedirects:超過最大重定向次數,產生重定向異常

requests.ConnectTimeout:連接遠程伺服器超時異常

requests.Timeout:請求URL超時,產生超時異常

r.raise_for_status()在方法內部判斷r.status_code是否等於200,如果不是200,產生異常 requests.HTTPError,不需要增加額外的if語句,該語句便於利用try‐except進行異常處理。

示例程式碼:

import requests

def getHTMLText(url):

try:

r = requests.get(url, timeout=30)

r.raise_for_status()

r.encoding = r.apparent_encoding

return r.text

except:

return "產生異常"

if __name__ == "__main__":

url = "http://www.baidu.com"

print(getHTMLText(url))

04

HTTP協議與Requests庫

HTTP,Hypertext Transfer Protocol,超文本傳輸協議

HTTP是一個基於「請求與響應」模式的、無狀態的應用層協議

HTTP協議採用URL作為定位網路資源的標識,URL格式如下:

http://host[:port][path]

host: 合法的Internet主機域名或IP地址

port: 埠號,預設埠為80

path: 請求資源的路徑

URL是通過HTTP協議存取資源的Internet路徑,一個URL對應一個數據資源

HTTP協議對資源的操作:

方法及說明

GET——請求獲取URL位置的資源

HEAD——請求獲取URL位置資源的響應消息報告,即獲得該資源的頭部資訊

POST——請求向URL位置的資源後附加新的數據

PUT——請求向URL位置存儲一個資源,覆蓋原URL位置的資源

PATCH——請求局部更新URL位置的資源,即改變該處資源的部分內容

DELETE——請求刪除URL位置存儲的資源

通過URL和命令管理資源,操作獨立無狀態,網路通道及伺服器成為了黑盒子

理解PATCH和PUT的區別

假設URL位置有一組數據UserInfo,包括UserID、UserName等20個欄位

需求:用戶修改了UserName,其他不變

採用PATCH,僅向URL提交UserName的局部更新請求

採用PUT,必須將所有20個欄位一併提交到URL,未提交欄位被刪除

PATCH的最主要好處:節省網路頻寬

HTTP協議與Requests庫

HTTP協議方法

Requests庫方法

功能一致性

GET

requests.get()

一致

HEAD

requests.head()

一致

POST

requests.post()

一致

PUT

requests.put()

一致

PATCH

requests.patch()

一致

DELETE

requests.delete()

一致

Requests庫主要方法解析

requests.request(method, url, **kwargs)

  • method : 請求方式,對應get/put/post等7種
  • url : 擬獲取頁面的url鏈接
  • **kwargs:控制訪問的參數,共13個

requests.request(method, url, **kwargs)

method : 請求方式

  1. r = requests.request('GET', url, **kwargs)
  2. r = requests.request('HEAD', url, **kwargs)
  3. r = requests.request('POST', url, **kwargs)
  4. r = requests.request('PUT', url, **kwargs)
  5. r = requests.request('PATCH', url, **kwargs)
  6. r = requests.request('delete', url, **kwargs)
  7. r = requests.request('OPTIONS', url, **kwargs)

**kwargs:控制訪問的參數

  1. params : 字典或位元組序列,作為參數增加到url中
  2. data : 字典、位元組序列或文件對象,作為Request的內容
  3. json : JSON格式的數據,作為Request的內容
  4. headers : 字典,HTTP訂製頭
  5. cookies : 字典或CookieJar,Request中的cookie
  6. auth : 元組,支援HTTP認證功能
  7. files : 字典類型,傳輸文件
  8. timeout : 設定超時時間,秒為單位
  9. proxies : 字典類型,設定訪問代理伺服器,可以增加登錄認證
  10. allow_redirects : True/False,默認為True,重定向開關
  11. stream : True/False,默認為True,獲取內容立即下載開關
  12. verify : True/False,默認為True,認證SSL證書開關
  13. cert : 本地SSL證書路徑

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

url : 擬獲取頁面的url鏈接

params : url中的額外參數,字典或位元組流格式,可選

**kwargs: 12個控制訪問的參數

requests.head(url, **kwargs)

url : 擬獲取頁面的url鏈接

**kwargs: 12個控制訪問的參數

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

url : 擬更新頁面的url鏈接

data : 字典、位元組序列或文件,Request的內容

json : JSON格式的數據,Request的內容

**kwargs: 12個控制訪問的參數

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

url : 擬更新頁面的url鏈接

data : 字典、位元組序列或文件,Request的內容

**kwargs: 12個控制訪問的參數

requests.patch(url, data=None, **kwargs)

url : 擬更新頁面的url鏈接

data : 字典、位元組序列或文件,Request的內容

**kwargs: 12個控制訪問的參數

requests.delete(url, **kwargs)

url : 擬刪除頁面的url鏈接

**kwargs: 12個控制訪問的參數

未完待續…………..