1. 程式人生 > >【爬蟲】初學爬蟲,瞭解始末(概念類—更新中)

【爬蟲】初學爬蟲,瞭解始末(概念類—更新中)

因為對堆糖的圖片心心念念,但是目前從網上翻出來的爬蟲程式碼沒有能夠做到將大圖儲存下來的,所以決定自學爬蟲,直到完成堆糖的大圖片的下載(*^▽^*)

網路爬蟲(又被稱為網頁蜘蛛,網路機器人,在FOAF社群中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動地抓取全球資訊網資訊的程式或者指令碼。

傳統爬蟲從一個或若干初始網頁的URL開始,獲得初始網頁上的URL,在抓取網頁的過程中,不斷從當前頁面上抽取新的URL放入佇列,直到滿足系統的一定停止條件。聚焦爬蟲的工作流程較為複雜,需要根據一定的網頁分析演算法過濾與主題無關的連結,保留有用的連結並將其放入等待抓取的URL佇列。然後,它將根據一定的搜尋策略從佇列中選擇下一步要抓取的網頁URL,並重覆上述過程,直到達到系統的某一條件時停止。另外,所有被爬蟲抓取的網頁將會被系統存貯,進行一定的分析、過濾,並建立索引,以便之後的查詢和檢索;對於聚焦爬蟲來說,這一過程所得到的分析結果還可能對以後的抓取過程給出反饋和指導。

[以上摘自百度百科]

https://upload-images.jianshu.io/upload_images/7145358-1050fb55d24132b2.png

有了一個清晰的脈絡,就比較好著手學習。

所以從上到下,從右到左,將技能樹的內容逐一解釋記錄學習。

一、HTTP相關

1.1  HTTP協議

超文字傳輸協議(HTTP,HyperText Transfer Protocol)是網際網路上應用最為廣泛的一種網路協議。所有的WWW檔案都必須遵守這個標準。HTTP是一個客戶端伺服器端請求和應答的標準(TCP)。客戶端是終端使用者,伺服器端是網站。通過使用Web瀏覽器網路爬蟲或者其它的工具,客戶端發起一個到伺服器上指定埠(預設為80)的HTTP請求。

1.2 請求方法

HTTP的請求方法(所有方法全為大寫)有多種,各個方法的解釋如下:

  • GET     獲取Request-URI所標識的資源,請求指定的頁面資訊,並返回實體主體。
  • POST    向指定資源提交資料進行處理請求(例如提交表單或者上傳檔案)。資料被包含在請求體中。POST請求可能會導致新的資源的建立或已有資源的修改。

  • HEAD    請求獲取響應訊息報頭,類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭。

以上三個是HTTP1.0定義的三種請求方法,也是最常用到的方法。

  • PUT     請求伺服器儲存一個資源,從客戶端向伺服器傳送的資料取代指定的文件的內容。

  • DELETE   請求伺服器刪除指定的頁面。

  • TRACE 

       請求伺服器回送收到的請求資訊,主要用於測試或診斷

  • CONNECT   保留將來使用,HTTP1.1協議中預留給能夠將連線改為管道方式的代理伺服器。

  • OPTIONS   請求查詢伺服器的效能,或者查詢與資源相關的選項和需求。

以上五個為HTTP1.1新增的請求方法。

1.3 HTTP 狀態碼

HTTP狀態碼(HTTP Status Code),由三個十進位制的數字組成,第一個十進位制數字定義了狀態碼的型別,後兩個數字沒有分類的作用,共有5種類型:

分類 分類描述
1** 資訊,伺服器收到請求,需要請求者繼續執行操作
2** 成功,操作被成功接收並處理
3** 重定向,需要進一步的操作完成請求
4** 客戶端錯誤,請求包含語法錯誤或無法完成請求
5** 伺服器錯誤,伺服器在處理請求的過程中發生了錯誤

我們常見的狀態碼有:

  • 200  —— 請求成功
  • 301  —— 資源(網頁等)被永久轉移到其他URL
  • 400  —— 客戶端請求有語法錯誤,不能被伺服器所理解
  • 403  —— 伺服器收到請求,但是拒絕提供服務
  • 404  —— 請求的資源(網頁等)不存在
  • 500  —— 內部伺服器錯誤
  • 503  —— 伺服器當前不能處理客戶端的請求,一段時間後可能恢復正常

1.4 HTTP請求頭

HTTP請求頭提供了關於請求,響應或者其他的傳送實體的資訊。(直接搬的菜鳥教程)

應答頭 說明
Allow

伺服器支援哪些請求方法(如GET、POST等)。

Content-Encoding

文件的編碼(Encode)方法。只有在解碼之後才可以得到Content-Type頭指定的內容型別。利用gzip壓縮文件能夠顯著地減少HTML文件的下載時間。Java的GZIPOutputStream可以很方便地進行gzip壓縮,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支援它。因此,Servlet應該通過檢視Accept-Encoding頭(即request.getHeader("Accept-Encoding"))檢查瀏覽器是否支援gzip,為支援gzip的瀏覽器返回經gzip壓縮的HTML頁面,為其他瀏覽器返回普通頁面。

Content-Length

表示內容長度。只有當瀏覽器使用持久HTTP連線時才需要這個資料。如果你想要利用持久連線的優勢,可以把輸出文件寫入 ByteArrayOutputStream,完成後檢視其大小,然後把該值放入Content-Length頭,最後通過byteArrayStream.writeTo(response.getOutputStream()傳送內容。

Content-Type

表示後面的文件屬於什麼MIME型別。Servlet預設為text/plain,但通常需要顯式地指定為text/html。由於經常要設定Content-Type,因此HttpServletResponse提供了一個專用的方法setContentType。

Date

當前的GMT時間。你可以用setDateHeader來設定這個頭以避免轉換時間格式的麻煩。

Expires

應該在什麼時候認為文件已經過期,從而不再快取它?

Last-Modified

文件的最後改動時間。客戶可以通過If-Modified-Since請求頭提供一個日期,該請求將被視為一個條件GET,只有改動時間遲於指定時間的文件才會返回,否則返回一個304(Not Modified)狀態。Last-Modified也可用setDateHeader方法來設定。

Location

表示客戶應當到哪裡去提取文件。Location通常不是直接設定的,而是通過HttpServletResponse的sendRedirect方法,該方法同時設定狀態程式碼為302。

Refresh

表示瀏覽器應該在多少時間之後重新整理文件,以秒計。除了重新整理當前文件之外,你還可以通過setHeader("Refresh", "5; URL=http://host/path")讓瀏覽器讀取指定的頁面。 注意這種功能通常是通過設定HTML頁面HEAD區的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">實現,這是因為,自動重新整理或重定向對於那些不能使用CGI或Servlet的HTML編寫者十分重要。但是,對於Servlet來說,直接設定Refresh頭更加方便。 注意Refresh的意義是"N秒之後重新整理本頁面或訪問指定頁面",而不是"每隔N秒重新整理本頁面或訪問指定頁面"。因此,連續重新整理要求每次都發送一個Refresh頭,而傳送204狀態程式碼則可以阻止瀏覽器繼續重新整理,不管是使用Refresh頭還是<META HTTP-EQUIV="Refresh" ...>。 注意Refresh頭不屬於HTTP 1.1正式規範的一部分,而是一個擴充套件,但Netscape和IE都支援它。

Server

伺服器名字。Servlet一般不設定這個值,而是由Web伺服器自己設定。

Set-Cookie

設定和頁面關聯的Cookie。Servlet不應使用response.setHeader("Set-Cookie", ...),而是應使用HttpServletResponse提供的專用方法addCookie。參見下文有關Cookie設定的討論。

WWW-Authenticate

客戶應該在Authorization頭中提供什麼型別的授權資訊?在包含401(Unauthorized)狀態行的應答中這個頭是必需的。例如,response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。 注意Servlet一般不進行這方面的處理,而是讓Web伺服器的專門機制來控制受密碼保護頁面的訪問(例如.htaccess)。

1.5 Cookie

指某些網站為了辨別使用者身份,進行session跟蹤而儲存在使用者本地終端上的資料(通常經過加密)。

Cookie 在計算機中是個儲存在瀏覽器目錄中的文字檔案,當瀏覽器執行時,儲存在 RAM 中發揮作用 (此種 Cookies 稱作 Session Cookies),一旦使用者從該網站或伺服器退出,Cookie 可儲存在使用者本地的硬碟上 (此種 Cookies 稱作 Persistent Cookies)

1.6 身份驗證

一般來說,爬蟲在對網頁進行爬取訪問的時候,會通過HTTP請求中的User Agent欄位告知自己的身份資訊。

1.7 Ajax

Ajax 即“Asynchronous Javascript And XML”(非同步 JavaScript 和 XML),是指一種建立互動式網頁應用的網頁開發技術。通過在後臺與伺服器進行少量資料交換,Ajax 可以使網頁實現非同步更新。這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。

因為Ajax技術,我們在進行爬蟲時,有時會發現get()的結果裡沒有我們想要的內容,因為載入頁面時只有少量的資料交換,我們用爬蟲獲得的只是第一次獲得的HTML,之後就需要在開發者工具裡找到自己想要的資料。等到有例項的時候再具體分析。

1.8 代理

使用爬蟲的過程中,不可避免的會遇到採取了防爬蟲的網站,這時,我們就需要代理ip了。

使用代理IP,我們首先可以從代理網站上獲取代理,再驗證IP是否可用。

1.9 HTTPS

HTTPS是HTTP的安全版,在HTTP下加入SSL層(安全套接層)。

HTTP的埠號為80,HTTPS的埠號為443。

1.10 WEB伺服器

Web伺服器一般指網站伺服器,是指駐留於因特網上某種型別計算機的程式,可以向瀏覽器等Web客戶端提供文件, [1] 也可以放置網站檔案,讓全世界瀏覽;可以放置資料檔案,讓全世界下載。目前最主流的三個Web伺服器是Apache Nginx IIS。

常見的web伺服器有Tomcat,Apache和Jboss。

就我身邊的人來看,使用Tomcat的人最多。

1.11 RESTful API

REST全稱是Representational State Transfer,中文意思是表述(編者注:通常譯為表徵)性狀態轉移。如果一個架構符合REST的約束條件和原則,我們就稱它為RESTful架構。REST本身並沒有創造新的技術、元件或服務,而隱藏在RESTful背後的理念就是使用Web的現有特徵和能力, 更好地使用現有Web標準中的一些準則和約束。