11.28 python網絡爬蟲之HTTP原理,爬蟲的基本原理,Cookies和代理介紹

一.HTTP基本原理

(一)URI和URL

URI的全稱為統一資源標誌符,URL的全稱為統一資源定位符。用來指定一個資源的訪問方式,包括訪問協議,訪問路徑和資源名稱,從而找到需要的資源(網頁的內容都是按照一定層次保存到網站系統的後臺數據庫或者文件夾內)。
其實URL是URI的子集,URI的另一個子類叫做URN,全稱為統一資源名稱。但在現在的互聯網中,URN用得非常少,我們可以把URI看作URL。

(二)超文本

網頁源代碼由一些標籤構成,瀏覽器解析了這些標籤後,就會形成我們平常看到的網頁,網頁的源代碼HTML就稱作為超文本。

(三)HTTP和HTTPS

URL的開頭有http或https,是訪問資源需要的協議類型。
HTTP的全稱為超文本傳輸協議,是用於從網絡傳輸超文本數據到本地瀏覽器的傳送協議。目前廣泛使用的是HTTP1.1版本。


而HTTPS是以安全為目標的HTTP通道,是HTTP的安全版,它的安全基礎是SSL,就是HTTP下加入SSL層。傳輸的內容通過SSL加密,保證了數據傳輸的安全。而且每個用HTTPS的url後面都有一個鎖頭標誌,可以查看網站認證之後的真實信息,也可以通過CA(電子認證服務)下發的安全證書查詢。
在訪問谷歌的時候,對於一些不安全的未被加密的網址,會對其進行高亮顯示"此網站不安全"。
在訪問12306網站的時候,大家可能會發現,也是會被提示不安全,因為這個網站的證書是鐵道部自行頒發的,並沒有被ca機構信任。但是他仍舊是SSL認證的,如果要爬取這樣的站點,就需要設置忽略證書選項。

(四)HTTP請求過程

我們在瀏覽器中輸入一個URL,回車後就會觀察到頁面內容。其實就是我們用瀏覽器向網站所在的服務器發送了一個請求,網站的服務器接收到這個請求後進行處理和解析,然後再返回對應的響應,之後傳給瀏覽器,瀏覽器再對其進行解析,把網頁內容呈現出來。
可以用網頁的審查元素打開開發者模式

下的Network監聽組件,裡面可以得到訪問當前請求網頁時發生的所有網絡請求和響應,我們打開淘寶首頁查看一下:

python網絡爬蟲之HTTP原理,爬蟲的基本原理,Cookies和代理介紹

其中各列的意義如下:
|列名| 含義 |
-------|-------
|Name|請求的名稱,一般是URL的最後一部分內容|
| Status|響應的狀態碼 ,200表示正常。|
|Type| 請求的文檔類型,document表示一個HTML文檔|
|Initiator|請求源,用來標記請求是那個對象或進程發起的|
|Size|從服務器下載的文件和資源的大小,如果是從緩存中獲取數據,這回顯示from cache|
|Time|發起請求到獲取響應所用的總時間|
|Waterfall|網絡請求的可視化瀑布流|
當我們點擊任意一個過程時,就會看到更詳細的內容:

python網絡爬蟲之HTTP原理,爬蟲的基本原理,Cookies和代理介紹


這裡,General中,Request URL為請求的URL,Request Method為請求的方法,Status Code為響應的狀態碼。Remote Address為遠程服務器的地址和端口,Referrer Policy為Referrer辨別策略。
我們繼續向下看,可以看到,有Response Headers和Requests Headers,分別表示響應頭和請求頭,請求頭就是我們發送請求的信息,伴隨著General中的URL,請求方法,進行請求。瀏覽器接收到響應時,會解析響應內容,進而呈現網頁內容。

(五)請求

1.請求方法

常見有兩種,分別為GET和POST。GET請求可以加一些參數,POST請求大多數在處理表單提交時發起。且POST請求的數據常以字典表單的形式發起,會出現在請求體中,不會出現在URL中。還有一些其他的請求方法,但不太常見,這裡就不說明了。
POST請求更安全,數據不會直接包含在url中,會只包含在請求體中。且GET請求提交的數據最多隻有1024個字節。
當登錄時需要提交密碼,用GET方法就會直接暴露在url中,就會造成信息洩露,最好用POST方法。而且上傳文件的時候,由於文件內容比較大,選擇POST方法比較好。


還有一些其他的不常見的方法,這裡就不介紹了。

2.請求的網址

請求的網址URL,統一資源定位符,定位我們想請求的資源。

3.請求頭

請求的信息,用於告訴服務器我們的請求,讓服務器返回我們需要的信息。常見的有Cookie,Referer,Host,User-Agent。大家可以查看維基百科的說明:維基百科請求頭說明
常用的幾個的含義如下:
| 常用請求頭信息 |含義 |
|--|--|
|Accept|請求報文域,指定客戶端可以接受的類型信息|
|Accept-Language|指定客戶端可以接受的語言類型|
|Accept-Encoding|指定客戶端可以接受的內容編碼|
| Cookie|服務器通過 (Set- Cookie )發送的一個 超文本傳輸協議,是網站用於辨別用戶進行會話跟蹤而存儲在客戶端本地的數據 |
| Referer| 表示瀏覽器所訪問的前一個頁面,正是那個頁面上的某個鏈接將瀏覽器帶到了當前所請求的這個頁面|
|Host|服務器的域名ip(用於虛擬主機 ),以及服務器所監聽的傳輸控制協議端口號。|
|User-Agent|瀏覽器的瀏覽器身份標識字符串,包括客戶端的操作系統,瀏覽器的版本等信息|


|Content-Type|互聯網媒體類型,表示具體請求中的媒體類型信息,如text/html表示HTML格式,image/gif表示GIF圖片,application/json代表JSON類型|
請求頭是請求的重要組成部分,要構建好。

4.請求體

用於進行POST請求而設置的,是一個數據表單。在GET請求中為空。在請求頭中,Content-Type為請求體的多媒體類型。指定Content-Type為application/x-www-form-urlencoded,才會以表單數據的形式提交;設置為application/json會以JSON數據提交;或者是multipart/form-data以表單文件進行提交;text/xml以XML數據提交。
如果要提交表單,要說明Content-Type是哪種類型的數據,否則會出錯。

(六)響應

1.響應狀態碼

服務器的響應狀態,200表示正常,其他常見的有,403表示禁止訪問,404表示頁面未找到,500表示服務器內部錯誤等。

2.響應頭

顯示了相應的一些基本信息。有需要時可以查詢。

3.響應體

就是響應的主體,請求網頁時時Html代碼,請求多媒體時,是二進制文件。可以用content輸出二進制文件,可以通過響應頭的Content-Type查看返回的數據類型是什麼。


這裡主要的響應體是網頁的源代碼以及JSON數據。

二.爬蟲的基本原理

爬蟲是獲取網頁並提取和保存信息的自動化程序。

(一)獲取網頁技術

用urllib,requests等類庫實現HTTP請求。獲取網頁源代碼或者json數據。

(二)提取信息

萬能方法正則表達式,但是正則比較複雜且容易出錯,其他方法有用Beautiful Soup,pyquery,lxml等提取網頁節點的屬性或文本值。

(三)保存數據

可以簡單保存為TXT文本,CSV文本或JSON文本,也可以保存到數據庫,如MySQL和MongoDB等,或者保存到遠程服務器,利用網絡編程與SFTP(安全文件傳送協議)進行操作。

(四)能爬的數據

網頁源碼,JSON格式的API接口數據,二進制多媒體數據,基本上網上的信息在robot協議下的數據都能爬,還有移動互聯網下APP的數據。
這裡要注意一定要遵守網絡爬蟲robot協議,否則就是盜取別人的數據。

(五)JavaScript動態渲染頁面的數據

現在當我們爬取網頁源碼時,會發現與我們用審查元素查看的頁面不同。這是因為現在越來越多的網頁採用Ajax,前端模塊化工具,CSS與JS等動態構建網頁,我們得到的只是一個空殼。當我們用urlllib與requests等庫請求頁面時,只是得到網頁的Html源碼,因此這時候就會用到動態抓取技術,來進行動態提取網頁內容。
我們可以分析其後臺Ajax接口,或者使用Selenium,Splash等第三方登臺抓取庫,或者自己寫一個庫(如果學成高手的話)來模擬JS渲染。

三.會話和Cookies

在很多情況下,我們都可以發現,好多網頁需要登錄後才可以訪問,有的可以在訪問某個網站的很多頁面時,都可以不用重新登錄,還會很長時間保存,有的卻需要每次關閉網頁後,下次重新輸入登錄信息。這種技術就涉及到會話(Session)和Cookies了。

(一)無狀態HTTP

這個意思指的是HTTP協議對事務處理是沒有記憶功能的,每次我們發一個請求到獲得響應,服務器缺乏一個用戶記錄,而且等待下次我們再進行登錄時,又要重新傳入登錄信息。這不僅僅會浪費時間,還會浪費資源。
隨著互聯網技術的發展,出現了兩種用於保持HTTP連接狀態的技術,分別是會話Cookies,會話在服務端,就是網站的服務器,用於保存用戶的會話信息,Cookies在客戶端,就會讓網頁在下次訪問時自動附帶上做為請求的一部分發送給服務器,服務器通過識別Cookies並鑑別出是哪個用戶,然後再判斷用戶是否是登錄狀態,返回對應的響應。
(二).會話

就是有始有終的一系列動作/消息。在網頁web中,會話對象用來存儲特定用戶會話所需的屬性及配置信息,這樣在訪問網頁時,這個會話保存的內容不會消失。如果用戶還沒有會話,則服務器將自動創建一個會話對象。當會話過期或放棄後,服務端將停止該會話。


(三).Cookies

指某些網站為了辨別用戶身份,進行會話跟蹤而存儲在用戶本地終端上的數據
可以在瀏覽器開發者工具的Application選項卡中的Storage查看cookies信息。由Max Age或Expires字段決定了過期的時間。基本上現在都是把Cookies保存在客戶端的硬盤上,當檢測到會話有很長時間沒有訪問時,才會刪除來節省內存。

四.代理IP

有時候服務器會檢測某個代理IP在單位時間的請求次數,如果過於頻繁,不像人類,就會拒絕服務,稱之為封IP。
代理說白了就是用別人的IP進行訪問,進行IP偽裝。
優點:
(1)突破自身IP的訪問限制。
(2)訪問一些單位或團體的內部資源。
(3)提高訪問速度。
(4)隱藏自身IP。

(一)使用網上的免費代理

這種方式是免費的,但是不太穩定,還需要維護一個代理池。

(二)使用付費代理服務

付費的肯定比免費的要好一些。

(三)ADSL撥號

撥一次號換一次IP,穩定性高。


最後,小編想說:我是一名python開發工程師,整理了一套最新的python系統學習教程,想要這些資

料的可以關注私信小編“01”即可,希望能對你有所幫助。


分享到:


相關文章: