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庫內部生產的)對象;返回一個包含服務器資源的Response(包含了網絡爬蟲返回的內容)對象。
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,將產生一個requests.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 ..........(無)
