小白學 Python 爬蟲(7):HTTP 基礎

人生苦短,我用 Pythonjavascript

前文傳送門:html

小白學 Python 爬蟲(1):開篇java

小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝python

小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門數據庫

小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門json

小白學 Python 爬蟲(5):前置準備(四)數據庫基礎小程序

小白學 Python 爬蟲(6):前置準備(五)爬蟲框架的安裝微信小程序

網絡的起源

這個實際上是一個冷知識,各位同窗能夠猜想一下計算機網絡的起源是在哪裏。瀏覽器

硅谷?大學?實驗室?有點接近了,但還不夠準確。緩存

準確的答案是在美蘇冷戰背景下的美國國防部

對的,你沒看錯,是美國軍方 ,最早進的技術老是先應用於軍事領域,隨着時間的推移纔會慢慢的民用化。

1968年,在美國國防部高級計劃局的領導下,阿帕網( ARPANET )誕生了。

ARPANET只有四個節點,鏈接起加利福尼亞州大學洛杉磯分校、加州大學聖巴巴拉分校、斯坦福大學、猶他州大學這四所學校的大型計算機。

阿帕網 ,是全球公認的計算機網絡的始祖。

URI 、 URL 和 URN

爬蟲是一個模擬瀏覽器進行 HTTP 請求的過程。這就須要咱們瞭解從瀏覽器輸入 URL 到獲取到網頁中間究竟發生了什麼。

先介紹一組概念, URI 和 URL :

  • URI = Universal Resource Identifier 統一資源標誌符,用來標識抽象或物理資源的一個緊湊字符串。
  • URL = Universal Resource Locator 統一資源定位符,一種定位資源的主要訪問機制的字符串,一個標準的URL必須包括:protocol、host、port、path、parameter、anchor。
  • URN = Universal Resource Name 統一資源名稱,經過特定命名空間中的惟一名稱或ID來標識資源。

沒看懂是吧,沒事兒,不須要懂,瞭解一下就行了,咱們來舉例子。

好比上面這張圖片的地址:https://cdn.geekdigging.com/python-spider/uri-url-urn.png ,它是一個 URL 同時也是一個 URI , URL 是 URI 的子集,也就是說每一個 URL 都是 URI ,但不是每一個 URI 都是 URL ,由於 URI 還包括一個子類叫 URN 。在目前的網絡中 URN 的使用很是少,因此幾乎全部的 URI 都是 URL ,通常的網頁連接咱們既能夠稱爲 URL ,也能夠稱爲 URI ,徹底看我的喜愛。

超文本

什麼是超文本?

超文本是指能夠連接到另外一個文檔或文本的單詞,短語或大塊文本。超文本涵蓋了文本超連接和圖形超連接。

咱們在瀏覽器中訪問的網頁是由 HTML 編寫而成,而 HTML 則被稱做爲「超文本標記語言」。在 HTML 代碼中,包含了一系列的標籤,包括圖片等的超連接。

咱們來看一下一個真實的網站的源代碼是怎麼樣的,在 Chrome 瀏覽器中,使用 F12 打開開發者工具。

HTTP 和 HTTPS

什麼是 HTTP ?

超文本傳輸協議,是一個基於請求與響應,無狀態的,應用層的協議,常基於TCP/IP協議傳輸數據,互聯網上應用最爲普遍的一種網絡協議,全部的WWW文件都必須遵照這個標準。設計HTTP的初衷是爲了提供一種發佈和接收HTML頁面的方法。

什麼是HTTPS?

《圖解HTTP》這本書中曾提過HTTPS是身披SSL外殼的HTTP。HTTPS是一種經過計算機網絡進行安全通訊的傳輸協議,經由HTTP進行通訊,利用SSL/TLS創建全信道,加密數據包。HTTPS使用的主要目的是提供對網站服務器的身份認證,同時保護交換數據的隱私與完整性。

PS:TLS是傳輸層加密協議,前身是SSL協議,由網景公司1995年發佈,有時候二者不區分。

如今愈來愈多的網站和App都已經向HTTPS方向發展,例如:

  • 蘋果公司強制全部iOS App在2017年1月1日前所有改成使用HTTPS加密,不然App就沒法在應用商店上架;
  • 谷歌從2017年1月推出的Chrome 56開始,對未進行HTTPS加密的網址連接亮出風險提示,即在地址欄的顯著位置提醒用戶「此網頁不安全」;
  • 騰訊微信小程序的官方需求文檔要求後臺使用HTTPS請求進行網絡通訊,不知足條件的域名和協議沒法請求。

HTTP協議

HTTP 協議自己是很是簡單的。它規定,只能由客戶端主動發起請求,服務器接收請求處理後返回響應結果,同時 HTTP 是一種無狀態的協議,協議自己不記錄客戶端的歷史請求記錄。

爲了比較直觀的展現這個過程,咱們依然打開 Chrome 瀏覽器,按 F12 開啓開發者模式。

看第一行,www.geekdigging.com 那一行:

  • Name:請求的名稱。
  • Status:狀態碼, 200 表明正常響應。
  • Type:文旦類型,這裏咱們是請求了一個 HTML 文檔。
  • Initiator:請求源。用來標記請求是由哪一個對象或進程發起的。
  • Size:資源大小,這個標識了咱們請求的資源的大小。
  • Time:消耗的時間,單位是 ms 。
  • Watefall:網絡請求的可視化瀑布流。

咱們點擊一下那一行,能夠看到更加詳細的內容:

包含了 Header 頭信息, Preview (Response Preview) 響應信息預覽, Response 響應具體的 HTML 代碼, Cookies ,Timing 整個請求週期耗時。

General部分: Request URL 爲請求的URL, Request Method 爲請求的方法, Status Code 爲響應狀態碼, Remote Address 爲遠程服務器的地址和端口, Referrer Policy 爲Referrer判別策略。

Request 請求

一個HTTP請求報文由請求行(request line)、請求頭部(headers)、空行(blank line)和請求數據(request body)4個部分組成。

請求行

分爲三個部分:請求方法、請求地址URL和HTTP協議版本,它們之間用空格分割。

例如,GET /index.html HTTP/1.1。

HTTP/1.1 定義的請求方法有8種:

  • GET :請求頁面,並返回頁面內容。
  • POST :大多用於提交表單或上傳文件,數據包含在請求體中。
  • PUT :從客戶端向服務器傳送的數據取代指定文檔中的內容。
  • DELETE :請求服務器刪除指定的頁面。
  • PATCH :是對 PUT 方法的補充,用來對已知資源進行局部更新 。
  • HEAD:相似於 GET 請求,只不過返回的響應中沒有具體的內容,用於獲取報頭。
  • OPTIONS:容許客戶端查看服務器的性能。
  • TRACE:回顯服務器收到的請求,主要用於測試或診斷。
  • CONNECT :HTTP/1.1 協議中預留給可以將鏈接改成管道方式的代理服務器。

經常使用的有 GET 和 POST 。

GET

在瀏覽器中直接輸入URL並回車,這就發起了一個 GET 請求,請求的參數會直接包含在 URL 裏,請求參數和對應的值附加在URL後面,利用一個問號 ? 表明URL的結尾與請求參數的開始,傳遞參數長度受限制。因爲不一樣的瀏覽器對地址的字符限制也有所不一樣,通常最多隻能識別1024個字符,因此若是須要傳送大量數據的時候,也不適合使用GET方式。

POST

容許客戶端給服務器提供信息較多。POST方法將請求參數封裝在HTTP請求數據中,以名稱/值的形式出現,能夠傳輸大量數據,這樣POST方式對傳送的數據大小沒有限制,並且也不會顯示在URL中。

請求頭

由於請求行所攜帶的信息量很是有限,以致於客戶端還有不少想向服務器要說的事情不得不放在請求首部(Header),請求首部用於給服務器提供一些額外的信息,好比 User-Agent 用來代表客戶端的身份,讓服務器知道你是來自瀏覽器的請求仍是爬蟲,是來自 Chrome 瀏覽器仍是 FireFox。HTTP/1.1 規定了47種首部字段類型。 HTTP 首部字段的格式很像 Python 中的字典類型,由鍵值對組成,中間用冒號隔開。

下面簡要說明一些經常使用的頭信息。

  • Accept:請求報頭域,用於指定客戶端可接受哪些類型的信息。
  • Accept-Language:指定客戶端可接受的語言類型。
  • Accept-Encoding:指定客戶端可接受的內容編碼。
    Host:用於指定請求資源的主機IP和端口號,其內容爲請求URL的原始服務器或網關的位置。從HTTP 1.1版本開始,請求必須包含此內容。
  • Cookie:也經常使用複數形式 Cookies,這是網站爲了辨別用戶進行會話跟蹤而存儲在用戶本地的數據。它的主要功能是維持當前訪問會話。例如,咱們輸入用戶名和密碼成功登陸某個網站後,服務器會用會話保存登陸狀態信息,後面咱們每次刷新或請求該站點的其餘頁面時,會發現都是登陸狀態,這就是Cookies的功勞。Cookies裏有信息標識了咱們所對應的服務器的會話,每次瀏覽器在請求該站點的頁面時,都會在請求頭中加上Cookies並將其發送給服務器,服務器經過Cookies識別出是咱們本身,而且查出當前狀態是登陸狀態,因此返回結果就是登陸以後才能看到的網頁內容。
  • Referer:此內容用來標識這個請求是從哪一個頁面發過來的,服務器能夠拿到這一信息並作相應的處理,如做來源統計、防盜鏈處理等。
  • User-Agent:簡稱UA,它是一個特殊的字符串頭,可使服務器識別客戶使用的操做系統及版本、瀏覽器及版本等信息。在作爬蟲時加上此信息,能夠假裝爲瀏覽器;若是不加,極可能會被識別出爲爬蟲。
  • Content-Type:也叫互聯網媒體類型(Internet Media Type)或者MIME類型,在HTTP協議消息頭中,它用來表示具體請求中的媒體類型信息。例如,text/html表明HTML格式,image/gif表明GIF圖片,application/json表明JSON類型,更多對應關係能夠查看此對照表:http://tool.oschina.net/commons

請求數據

請求體通常承載的內容是POST請求中的表單數據,而對於GET請求,請求體則爲空。

注意這裏提交數據的方式和請求頭設置的 Content-Type 息息相關。

Response 響應

服務端接收請求並處理後,返回響應內容給客戶端,一樣地,響應內容也必須遵循固定的格式瀏覽器才能正確解析。HTTP 響應也由3部分組成,分別是:響應行、響應首部、響應體,與 HTTP 的請求格式是相對應的。

響應行

響應行一樣也是3部分組成,由服務端支持的 HTTP 協議版本號、狀態碼、以及對狀態碼的簡短緣由描述組成。

狀態碼

響應狀態碼錶示服務器的響應狀態,常見的如200表明服務器正常響應,404表明頁面未找到,500表明服務器內部發生錯誤。

響應頭

響應頭包含了服務器對請求的應答信息,如Content-Type、Server、Set-Cookie等。下面簡要說明一些經常使用的頭信息。

  • Date:標識響應產生的時間。
  • Last-Modified:指定資源的最後修改時間。
  • Content-Encoding:指定響應內容的編碼。
  • Server:包含服務器的信息,好比名稱、版本號等。
  • Content-Type:文檔類型,指定返回的數據類型是什麼,如text/html表明返回HTML文檔,application/x-javascript則表明返回JavaScript文件,image/jpeg則表明返回圖片。
  • Set-Cookie:設置Cookies。響應頭中的Set-Cookie告訴瀏覽器須要將此內容放在Cookies中,下次請求攜帶Cookies請求。
  • Expires:指定響應的過時時間,可使代理服務器或瀏覽器將加載的內容更新到緩存中。若是再次訪問時,就能夠直接從緩存中加載,下降服務器負載,縮短加載時間。

響應體

最重要的當屬響應體的內容了。響應的正文數據都在響應體中,好比請求網頁時,它的響應體就是網頁的HTML代碼;請求一張圖片時,它的響應體就是圖片的二進制數據。

在作爬蟲時,咱們主要經過響應體獲得網頁的源代碼、JSON數據等,而後從中作相應內容的提取。

參考

https://blog.csdn.net/koflance/article/details/79635240

http://www.javashuo.com/article/p-wybdsvhv-kt.html

https://cuiqingcai.com/5465.html

https://blog.csdn.net/ailunlee/article/details/90600174

相關文章
相關標籤/搜索