Python爬蟲中HTTP和HTTPS的雜七雜八
HTTP協議(HyperText Transfer Protocol,埠號80)即超文字傳輸協議,是一種釋出和接收HTML頁面的方法。HTTPS(HyperText Transfer Protocol over Secure Socket Layer,埠號443)是HTTP的安全版本,加入了SSL層。SSL(Secure Socket Layer)即安全套接層,主要用於web的安全傳輸協議,在傳輸層對網路連線進行加密,保障在Internet上資料傳輸的安全。
瀏覽器傳送HTTP請求的過程:
- 使用者在瀏覽器的位址列中輸入一個URL之後,瀏覽器會向HTTP伺服器傳送HTTP請求,主要分為get和post兩種方法;
- 伺服器把response對應的HTML檔案物件傳送回給瀏覽器;
- 瀏覽器分析response中的HTML,針對其引用的其他檔案如CSS、JS等,瀏覽器會自動傳送request去獲取圖片;
- 當所有的檔案都下載成功之後,網頁會根據HTML語法結構完整的顯示出來。
GET請求是從伺服器上獲取資料,POST請求是向伺服器傳送資料。其中get請求的引數都會顯示在瀏覽器的網址上,即get請求引數是URL的一部分,故存在安全隱患。post請求引數在請求體之中,訊息長度沒有限制而且以隱式的方式進行傳送,通常用來向HTTP伺服器提交量比較大的資料,請求的引數包含在Content-Type訊息頭中。
常用的請求報頭:
- Host (主機和埠號)
Host:對應網址URL中的Web名稱和埠號,用於指定被請求資源的Internet主機和埠號,通常屬於URL的一部分。
- Connection (連結型別)
Connection:表示客戶端與服務連線型別
Client 發起一個包含 Connection:keep-alive
的請求,HTTP/1.1使用 keep-alive
為預設值。
Server收到請求後:
如果 Server 支援 keep-alive,回覆一個包含 Connection:keep-alive 的響應,不關閉連線;
如果 Server 不支援 keep-alive,回覆一個包含 Connection:close 的響應,關閉連線。
如果client收到包含 Connection:keep-alive
的響應,向同一個連線傳送下一個請求,直到一方主動關閉連線。
keep-alive在很多情況下能夠重用連線,減少資源消耗,縮短響應時間,比如當瀏覽器需要多個檔案時(比如一個HTML檔案和相關的圖形檔案),不需要每次都去請求建立連線。
- Upgrade-Insecure-Requests (升級為HTTPS請求)
Upgrade-Insecure-Requests:升級不安全的請求,意思是會在載入 http 資源時自動替換成 https 請求,讓瀏覽器不再顯示https頁面中的http請求警報。
HTTPS 是以安全為目標的 HTTP 通道,所以在 HTTPS 承載的頁面上不允許出現 HTTP 請求,一旦出現就是提示或報錯。
- User-Agent (瀏覽器名稱)
User-Agent:是客戶瀏覽器的名稱,以後會詳細講。
- Accept (傳輸檔案型別)
Accept:指瀏覽器或其他客戶端可以接受的MIME(Multipurpose Internet Mail Extensions(多用途網際網路郵件擴充套件))檔案型別,伺服器可以根據它判斷並返回適當的檔案格式。
舉例:
Accept: */*
:表示什麼都可以接收。
Accept:image/gif
:表明客戶端希望接受GIF影象格式的資源;
Accept:text/html
:表明客戶端希望接受html文字。
Accept: text/html, application/xhtml+xml;q=0.9, image/*;q=0.8
:表示瀏覽器支援的 MIME 型別分別是 html文字、xhtml和xml文件、所有的影象格式資源。
q是權重係數,範圍 0 =< q <= 1,q 值越大,請求越傾向於獲得其“;”之前的型別表示的內容。若沒有指定q值,則預設為1,按從左到右排序順序;若被賦值為0,則用於表示瀏覽器不接受此內容型別。
Text:用於標準化地表示的文字資訊,文字訊息可以是多種字符集和或者多種格式的;Application:用於傳輸應用程式資料或者二進位制資料。詳細請點選
- Referer (頁面跳轉處)
Referer:表明產生請求的網頁來自於哪個URL,使用者是從該 Referer頁面訪問到當前請求的頁面。這個屬性可以用來跟蹤Web請求來自哪個頁面,是從什麼網站來的等。
有時候遇到下載某網站圖片,需要對應的referer,否則無法下載圖片,那是因為人家做了防盜鏈,原理就是根據referer去判斷是否是本網站的地址,如果不是,則拒絕,如果是,就可以下載;
- Accept-Encoding(檔案編解碼格式)
Accept-Encoding:指出瀏覽器可以接受的編碼方式。編碼方式不同於檔案格式,它是為了壓縮檔案並加速檔案傳遞速度。瀏覽器在接收到Web響應之後先解碼,然後再檢查檔案格式,許多情形下這可以減少大量的下載時間。
舉例:Accept-Encoding:gzip;q=1.0, identity; q=0.5, *;q=0
如果有多個Encoding同時匹配, 按照q值順序排列,本例中按順序支援 gzip, identity壓縮編碼,支援gzip的瀏覽器會返回經過gzip編碼的HTML頁面。 如果請求訊息中沒有設定這個域伺服器假定客戶端對各種內容編碼都可以接受。
- Accept-Language(語言種類)
Accept-Langeuage:指出瀏覽器可以接受的語言種類,如en或en-us指英語,zh或者zh-cn指中文,當伺服器能夠提供一種以上的語言版本時要用到。
-
Accept-Charset(字元編碼)
Accept-Charset:指出瀏覽器可以接受的字元編碼。
舉例:Accept-Charset:iso-8859-1,gb2312,utf-8
- ISO8859-1:通常叫做Latin-1。Latin-1包括了書寫所有西方歐洲語言不可缺少的附加字元,英文瀏覽器的預設值是ISO-8859-1.
- gb2312:標準簡體中文字符集;
- utf-8:UNICODE 的一種變長字元編碼,可以解決多種語言文字顯示問題,從而實現應用國際化和本地化。
如果在請求訊息中沒有設定這個域,預設是任何字符集都可以接受。
- Cookie (Cookie)
Cookie:瀏覽器用這個屬性向伺服器傳送Cookie。Cookie是在瀏覽器中寄存的小型資料體,它可以記載和伺服器相關的使用者資訊,也可以用來實現會話功能,以後會詳細講。
- Content-Type (POST資料型別)
Content-Type:POST請求裡用來表示的內容型別。
舉例:Content-Type = Text/XML; charset=gb2312:
指明該請求的訊息體中包含的是純文字的XML型別的資料,字元編碼採用“gb2312”。
HTTP相應碼:
1xx:資訊
2xx:成功
3xx:重定向
4xx:客戶端錯誤
5xx:伺服器錯誤