4、利用Request和Beautiful Soup抓取指定URL內容
阿新 • • 發佈:2019-02-17
所謂網頁抓取,就是把URL地址中指定的網路資源從網路流中讀取出來,儲存到本地。
類似於使用程式模擬IE瀏覽器的功能,把URL作為HTTP請求的內容傳送到伺服器端, 然後讀取伺服器端的響應資源。
在Python3.5中,我們使用Request這個元件來抓取網頁。
Request是Python的一個獲取URLs(Uniform Resource Locators)的元件。
它以get函式的形式提供了一個非常簡單的介面。
最簡單的Request的應用程式碼只需要四行。
我們新建一個檔案test.py來感受一下Request的作用:
import requests
from bs4 import BeautifulSoup
#coding:utf-8
url = 'http://www.baidu.com'
try:
response = requests.get(url)
#URLError
#通常,URLError在沒有網路連線(沒有路由到特定伺服器),或者伺服器不存在的情況下產生。
except:
data = {
'url':url,
'error_type':'requests.get.error'
}
print(data)
#HTTPError
#伺服器上每一個HTTP 應答物件response包含一個數字"狀態碼"。
#有時狀態碼指出伺服器無法完成請求。預設的處理器會為你處理一部分這種應答。
#HTTP狀態碼通常分為5種類型,分別以1~5五個數字開頭,由3位整陣列成.
#比如客戶端向伺服器傳送請求,如果成功地獲得請求的資源,則返回的狀態碼為200,表示響應成功。
else:
response.encoding = 'utf8'
print(response.text)
我們可以開啟百度主頁,右擊,選擇檢視原始碼(火狐OR谷歌瀏覽器均可),會發現也是完全一樣的內容。
也就是說,上面這四行程式碼將我們訪問百度時瀏覽器收到的程式碼們全部列印了出來。
這就是一個最簡單的Request的例子。
除了”http:”,URL同樣可以使用”ftp:”,”file:”等等來替代。
HTTP是基於請求和應答機制的:
客戶端提出請求,服務端提供應答。
如果傳送了一個錯誤請求(一個 4XX 客戶端錯誤,或者 5XX 伺服器錯誤響應),我們可以通過 Response.raise_for_status() 來丟擲異常
200:請求成功 處理方式:獲得響應的內容,進行處理
201:請求完成,結果是建立了新資源。新建立資源的URI可在響應的實體中得到 處理方式:爬蟲中不會遇到
202:請求被接受,但處理尚未完成 處理方式:阻塞等待
204:伺服器端已經實現了請求,但是沒有返回新的信 息。如果客戶是使用者代理,則無須為此更新自身的文件檢視。 處理方式:丟棄
300:該狀態碼不被HTTP/1.0的應用程式直接使用, 只是作為3XX型別迴應的預設解釋。存在多個可用的被請求資源。 處理方式:若程式中能夠處理,則進行進一步處理,如果程式中不能處理,則丟棄
301:請求到的資源都會分配一個永久的URL,這樣就可以在將來通過該URL來訪問此資源 處理方式:重定向到分配的URL
302:請求到的資源在一個不同的URL處臨時儲存 處理方式:重定向到臨時的URL
304 請求的資源未更新 處理方式:丟棄
400 非法請求 處理方式:丟棄
401 未授權 處理方式:丟棄
403 禁止 處理方式:丟棄
404 沒有找到 處理方式:丟棄
5XX 迴應程式碼以“5”開頭的狀態碼錶示伺服器端發現自己出現錯誤,不能繼續執行請求 處理方式:丟棄
------------------------------------------------------------------------------------------------
HTTPError例項產生後會有一個整型'code'屬性,是伺服器傳送的相關錯誤號。
Error Codes錯誤碼
因為預設的處理器處理了重定向(300以外號碼),並且100-299範圍的號碼指示成功,所以你只能看到400-599的錯誤號碼。
BaseHTTPServer.BaseHTTPRequestHandler.response是一個很有用的應答號碼字典,顯示了HTTP協議使用的所有的應答號。
當一個錯誤號產生後,伺服器返回一個HTTP錯誤號,和一個錯誤頁面。
你可以使用HTTPError例項作為頁面返回的應答物件response。