1. 程式人生 > >Python網路資料爬取----網路爬蟲基礎(一)

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庫內部生產的)

物件;返回一個包含伺服器資源的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,將產生一個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
..........(無)