Python網路資料爬取----網路爬蟲基礎(一)
The website is the API......(未來的資料都是通過網路來提供的,website本身對爬蟲來講就是自動獲取資料的API)。掌握定向網路資料爬取和網頁解析的基本能力。
##Requests 庫的使用,此庫是Python公認的優秀的第三方網路爬蟲庫。能夠自動的爬取HTML頁面;自動的生成網路請求提交。
##robots.tex 協議 網路爬蟲排除標準 (網路爬蟲的盜亦有道)
1.安裝Requests庫 以管理員許可權進入cmd控制檯, 通過" pip install requests "命令安裝Requests庫
#測試安裝Requests庫的效果,以爬取百度主頁為例>>> import requests >>> r = requests.get("http://www.baidu.com")##一行程式碼就可以獲取任何對應的URL的資源 >>> r.status_code() #狀態碼 200 >>> r.encoding = "utf-8" #將編碼更改為UTF-8編碼 >>> r.text #列印網頁內容
......百度主頁的內容......
2. requests 的主要方法:
##2.1 r = requests.get(url) : get 方法為獲得一個網頁最常用的方法 ,此方法構建一個向伺服器傳送請求的Request(requests庫內部生產的)
requests.get(url,params=None,**kwargs)
url :獲取URL頁面的連結
parmas:url 中額外的引數,可以是字典或位元組流格式,可選
**kwargs:12個控制訪問引數
其實get 方法採用request方法進行封裝,其他的方法也通過呼叫request方法來實現的。可以理解為requests庫只有一種request方法,為了程式設計方便才提供額外的6種方法。
3.Response物件包含了伺服器返回的所有資訊,同時也包含了向伺服器傳送請求的資訊
##Response 物件的5個屬性
3.1. r.status_code HTTP請求的返回狀態,200表示連線成功,404表示連線失敗;(有可能返回的是其他的值,只要不是200,都表示連線是失敗的)
3.2.r.text HTTP響應內容的所有字串形式,即URL對應的網頁內容
3.3. r.encoding 從 HTTP header中猜測響應內容的編碼方式(如果header中不存在charst欄位,則預設的是ISO--8859--1編碼)
3.4.r.apparent_encoding 從內容中分析出響應內容編碼方式(根據網頁內容分析出編碼方式,更加準確)
3.5.r.content 表示響應內容的二進位制形式
############################################################################################################
##爬取網頁的通用程式碼框架
##爬取網頁有風險,有可能有些網站不允許爬或者因為其他的原因無法爬取
理解requests庫的異常:
# requests.ConnectionError 網路連線錯誤異常,如查詢DNS失敗或者伺服器的防火牆拒絕連線等
# requests.HTTPError :HTTP錯誤異常
# requests.URLRequirde: URL缺失異常
# requests.TooManyRediecrts :重定向異常,超過最大重定向次數(對一些複雜的連線訪問的時候,容易產生這樣的錯誤)
# requests.ConnectTimeout :連線遠端伺服器超時異常(與伺服器連線超過一個預定的時間而產生的異常)
# requests.Timeout :發起URL請求到獲取URL內容,產生的超時異常
##Response 作為一個返回的物件,它提供了一個方法
r.raise_for_status() --->與異常打交道的方法,能夠判定返回的狀態碼是不是200,如果返回的不是200,將產生一個equests.HTTPError 異常
##爬取網頁的通用程式碼框架 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))
####通用程式碼框架可以有效的處理,在訪問或者爬取網頁的時候產生的異常、錯誤,以及由於網路不穩定等因素產生的異常。使用者在使用通用程式碼框架後可以使得爬取網頁變得更加有效、穩定可靠###
####requests庫的7個主要方法:
1. requests.request()
2.requests.get()
3.requests.head()
4.requests.post()
5.requests.put()
6.requests.patch()
7.requests.delete()
HTTP 協議,超文字傳輸協議,是一種基於“”請求與響應“”模式的,無狀態的應用層協議。(無狀態指的是第一次請求與第二次請求並無關聯)
HTTP協議採用URL作為定位網路資源的標識
URL的格式 http://host[:port][path](URL是通過HTTP協議存取網路資源的Internet路徑,一個URL對應一個數據資源)
host: 合法的主機域名和IP地址
port:埠號 ,預設的埠號為80
path:請求的資源在伺服器上的路徑
HTTP協議對資源的操作(其實這6個方法也是requests庫6個函式對應的功能):
GET :請求獲取URL位置資源 與 requests.get() 方法一致
POST :請求向URL的資源後增加新的資訊,不改變現有的內容 與 requests.post()方法一致
HEAD :請求獲取URL資源的響應訊息報告,即獲取該資源的頭部資訊與 requsts.head()方法一致
PUT :請求向URL的位置存取一個資源,原來的資源將被覆蓋 與 requests.put()方法一致
PATCH:請求向URL位置處的資源進行區域性更新,改變該出資源的部分資訊與 requests.patch()方法一致
DELETE:請求刪除URL位置處的相關資源 與 requests.delete()方法一致
##理解PATCH和PUT的區別
假設URL位置有一組資料UserInfo,包括UserID,UserName等20個欄位;
需求:使用者修改UserName其他不變
*使用PATCH,僅向URL提交UserName的區域性更新請求(主要好處:節省網路頻寬)
*採用PUT,必須將所以的20個欄位一併提交到URL,未提交的文欄位將被刪除(覆蓋)
####requests庫的head() 方法
#requests庫的head()方法 import requests r = requests.head("http://httpbin.org/get")#用很少的網路流量獲取網路資源的概要資訊 print(r.headers) >>> {'Connection': 'keep-alive', 'Server': 'gunicorn/19.9.0', 'Date': 'Thu, 01 Nov 2018 14:33:19 GMT', 'Content-Type': 'application/json', 'Content-Length': '265', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true', 'Via': '1.1 vegur'} >>>r.text ..........(無)