1. 程式人生 > >Python之爬蟲(精要)

Python之爬蟲(精要)

1.爬蟲
最大的爬蟲網站就是百度
1.瀏覽網站時經歷的過程
瀏覽器(請求request)->輸入URL地址(http://www.baidu.com/index.html file:///mnt ftp://172.25.254.31/pub
->http協議確定,www.baidu.com訪問的域名確定 ->DNS伺服器解析到IP地址
->確定要訪問的網頁內容 -> 將獲取到的頁面內容返回給瀏覽器(響應過程) )

2.爬取網頁
基本方法
在這裡插入圖片描述
這裡的timeout,意為訪問超過0.02秒則報錯
在這裡插入圖片描述

下面是正常爬取
獲得的是百度頁面的HTML資訊
在這裡插入圖片描述

在這裡插入圖片描述

使用Request物件 (可以新增其他的頭部資訊)

在這裡插入圖片描述
有必要說明,re的存在是例項化request物件,可以自定義請求的頭部資訊;
urlopen 不僅可以傳遞url地址,也可以傳遞request物件;

在這裡插入圖片描述
這是對應網站的HTML資訊
因為百度沒有反爬蟲策略,其他網站有,所以我們才偽裝瀏覽器

反爬蟲策略
模擬瀏覽器
Android

 first: Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19

second: Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30

third:Mozilla/5.0 (Linux; U; Android 2.2; en-gb; GT-P1000 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

IP代理
當抓取網站時,程式的執行速度很快,如果通過爬蟲去訪問,一個固定的IP訪問頻率很高,網站如果做反爬蟲策略,那麼就會封掉ip;
如何解決?
——設定延遲:time.sleep( random.randint (1,5)
____使用IP代理,讓其他IP代替你的IP訪問
如何獲取代理ip?
http://www.xicidaili.com
如何實現步驟?
1).呼叫 urllib.request.ProxyHandler (proxies=None); --類似理解為Request物件
2).呼叫Opener- - -類似於urlopen,這個是定製的
3).安裝Opener
4) . 代理ip的選擇

在這裡插入圖片描述
最終獲得對應的網站的HTML內容

2.儲存cookie資訊
#cookie資訊是什麼?
cookie,某些網站為了辨別使用者身份,只有登陸之後才能訪問某個頁面;
進行一個會話跟蹤,將使用者的相關資訊包括使用者名稱等儲存到本地終端
實現步驟:
在這裡插入圖片描述
在這裡插入圖片描述
這是將cookie儲存在檔案中,檔名為cookie.txt
檔案內容如下
在這裡插入圖片描述
讀取該檔案的HTML資訊則新增如下,就會獲得淘寶的HTML資訊
在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述
這是將cookie儲存在變數中

3.urllib常見的異常處理
異常:

    --------exception     urllib.error.URLError
    
    通常引起URLError的原因是:無網路連線,訪問的目標伺服器不存在。在這種情況下會有一個reason屬性,是一個錯誤碼,錯誤原因的元組。
    
    --------exception     urllib.error.HTTPError
    每一個從伺服器返回的HTTP響應都有一個狀態碼。其中,有的狀態嗎表示伺服器不能完成相應的請求,預設的處理程式可以為我們處理一些這樣的狀態碼(如返回是重定向,urllib2會自動為我們從重定向後的頁面中獲取資訊)。有些狀態碼,urllib2模組不能幫我們處理,那麼urlopen函式就會引起HTTPError異常,其中典型的就有404/401

    常見的狀態返回碼
    100-102:訊息型別,這一型別的狀態碼,代表請求已被接受,需要繼續處理。這類響應是臨時響應,只包含狀態行和某些可選的響應頭資訊,並以空行結束。
    200-207:成功型別,這一型別的狀態碼,代表請求已成功被伺服器接收、理解、並接受。其中200代表請求已成功,請求所希望的響應頭或資料體將隨此響應返回。出現此狀態碼是表示正常狀態。
    300-307:重定向型別,定向這類狀態碼代表需要客戶端採取進一步的操作才能完成請求。通常,這些狀態碼用來重定向,後續的請求地址(重定向目標)在本次響應的 Location 域中指明。當且僅當後續的請求所使用的方法是 GET 或者 HEAD 時,使用者瀏覽器才可以在沒有使用者介入的情況下自動提交所需要的後續請求。客戶端應當自動監測無限迴圈重定向(例如:A->A,或者A->B->C->A),因為這會導致伺服器和客戶端大量不必要的資源消耗。按照 HTTP/1.0 版規範的建議,瀏覽器不應自動訪問超過5次的重定向。
    400-451:請求錯誤型別,這類的狀態碼代表了客戶端看起來可能發生了錯誤,妨礙了伺服器的處理。除非響應的是一個 HEAD 請求,否則伺服器就應該返回一個解釋當前錯誤狀況的實體,以及這是臨時的還是永久性的狀況。這些狀態碼適用於任何請求方法。瀏覽器應當向用戶顯示任何包含在此類錯誤響應中的實體內容。如果錯誤發生時客戶端正在傳送資料,那麼使用TCP的伺服器實現應當仔細確保在關閉客戶端與伺服器之間的連線之前,客戶端已經收到了包含錯誤資訊的資料包。如果客戶端在收到錯誤資訊後繼續向伺服器傳送資料,伺服器的TCP棧將向客戶端傳送一個重置資料包,以清除該客戶端所有還未識別的輸入緩衝,以免這些資料被伺服器上的應用程式讀取並干擾後者。

first
在這裡插入圖片描述
在這裡插入圖片描述
這裡我關閉了網路,所以顯示連線被拒絕;屬於HTTP錯誤
second
在這裡插入圖片描述 在這裡插入圖片描述
這裡我訪問了不存在的url地址,所以報錯屬於URL錯誤
third
在這裡插入圖片描述
在這裡插入圖片描述
這裡因為我設定了連線時間,超過了0.01秒就會報錯,所以屬於超時異常

4.url解析
1.url.parse.urlparse( urlstring,scheme=’ ',allow_fragments=True)
功能:將url分為6部分,返回一個元組;
協議,伺服器的地址(IP:port),檔案路徑,訪問的頁面

在這裡插入圖片描述
在這裡插入圖片描述params裡的元組,就是給網站後新增的內容
解析:獲取使用協議和訪問的ip;
通過字典編碼的方式構造url地址;

5.requests模組
requests是一個http請求庫,他是基於urllib3來編寫的,他比urllib更加方便。
#例項引入
在這裡插入圖片描述
在這裡插入圖片描述
由圖中結果我們可以看出,
status_code是返回狀態碼
cookies返回的是快取物件
text則是HTML頁面內容
而內容的型別是字串

#帶引數的get請求
#獲取二進位制資料
在這裡插入圖片描述

在這裡插入圖片描述
因為圖片是二進位制檔案,我們用text只能獲得亂碼,顯示圖片要用content方法
這裡request.text返回的是字串的頁面資訊
request.content返回bytes的頁面資訊
這裡的url1是審查元素後出現的圖片地址
獲得圖片 ‘sss.png’ 內容如下
在這裡插入圖片描述
#高階設定
**上傳檔案
在這裡插入圖片描述
在這裡插入圖片描述
requests來提交Form表單,一般存在於網路的登陸,用來提交使用者名稱和密碼
而此時提交到了httpbin.org網站,在此網站可以顯示提交請求的內容

#忽略證書驗證
有點網站證書不合法無法訪問,如下操作可以忽略證書,正常訪問
在這裡插入圖片描述

#獲取cookie資訊
在這裡插入圖片描述
在這裡插入圖片描述

#解析json格式
在這裡插入圖片描述
在這裡插入圖片描述
json格式,藉助訪問淘寶網,查詢輸入ip所在地

#讀取已經存在的cookie資訊訪問網址內容(會話維持)
在這裡插入圖片描述

在這裡插入圖片描述
可以和前面cookie快取一起用,就可以讀取快取了

#代理設定/設定超時間
在這裡插入圖片描述
在這裡插入圖片描述