01-爬蟲必備基礎知識

什麼是網絡爬蟲

  • 網絡爬蟲(又被稱爲網頁蜘蛛,網絡機器人)就是模擬客戶端發送網絡請求,接收請求響應,一種按照必定的規則,自動地抓取互聯網信息的程序。只要是瀏覽器能作的事情,原則上,爬蟲都可以作,簡單來講就是咱們本身寫程序,去互聯網上抓取咱們須要的數據,如圖片,MP3,MP4等html

爬蟲分類

  • 通用爬蟲web

    • 一般指搜索引擎的爬蟲 數據庫

  • 聚焦爬蟲瀏覽器

    • 針對特定網站的爬蟲 緩存

    • 咱們須要什麼數據,這個數據在哪一個網站上,咱們就去爬哪一個網站安全

  • Robots協議 服務器

http/https協議

  • http協議併發

    • (HyperText Transfer Protocol,超文本傳輸協議):是一種發佈和接收 HTML頁面的方法。 默認端口號爲80app

  • https協議

    • (Hypertext Transfer Protocol over Secure Socket Layer)簡單講是HTTP的安全版,在HTTP下加入SSL層。

    • SSL(Secure Sockets Layer 安全套接層)主要用於Web的安全傳輸協議,在傳輸層對網絡鏈接進行加密,保障在Internet上數據傳輸的安全。

http的請求與響應

  • http通訊主要由兩個部分組成客戶端請求消息 與 服務器響應消息 ,客戶端老是發送請求,服務端根據發送的請求獲取響應

 

  • url格式

 

  • 圖中中括號是可選項

  • protocol :協議(例如:http, https, ftp)

  • hostname :主機地址,能夠是域名,也能夠是IP地址

  • port :端口 http協議默認端口是:80端口,若是不寫默認就是:80端口

  • path: 路徑 網絡資源在服務器中的指定路徑

  • parameter: 參數 若是要向服務器傳入參數,在這部分輸入

  • query: 查詢字符串 若是須要從服務器那裏查詢內容,在這裏編輯

  • fragment: 錨點,若是想訪問網頁後直接到達指定位置,能夠在這部分設置

  • 例如:

客戶端http請求

URL只是標識資源的位置,而HTTP是用來提交和獲取資源。客戶端發送一個HTTP請求到服務器的請求消息,包括如下格式:

請求行請求頭部空行請求數據

四個部分組成,下圖給出了請求報文的通常格式。

一個典型的HTTP請求示例
GET https://www.baidu.com/ HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://www.baidu.com/
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
Cookie: BAIDUID=04E4001F34EA74AD4601512DD3C41A7B:FG=1; BIDUPSID=04E4001F34EA74AD4601512DD3C41A7B; PSTM=1470329258; MCITY=-343%3A340%3A; BDUSS=nF0MVFiMTVLcUh-Q2MxQ0M3STZGQUZ4N2hBa1FFRkIzUDI3QlBCZjg5cFdOd1pZQVFBQUFBJCQAAAAAAAAAAAEAAADpLvgG0KGyvLrcyfrG-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFaq3ldWqt5XN; H_PS_PSSID=1447_18240_21105_21386_21454_21409_21554; BD_UPN=12314753; sug=3; sugstore=0; ORIGIN=0; bdime=0; H_PS_645EC=7e2ad3QHl181NSPbFbd7PRUCE1LlufzxrcFmwYin0E6b%2BW8bbTMKHZbDP0g; BDSVRTM=0

請求方法

GET https://www.baidu.com/ HTTP/1.1

根據HTTP標準,HTTP請求可使用多種請求方法。

HTTP 0.9:只有基本的文本 GET 功能。

HTTP 1.0:完善的請求/響應模型,並將協議補充完整,定義了三種請求方法: GET, POST 和 HEAD方法。

HTTP 1.1:在 1.0 基礎上進行更新,新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

HTTP 2.0(未普及):請求/響應首部的定義基本沒有改變,只是全部首部鍵必須所有小寫,並且請求行要獨立爲 :method、:scheme、:host、:path這些鍵值對。


HTTP請求主要分爲
GetPost兩種方法
  • GET是從服務器上獲取數據,POST是向服務器傳送數據

  • GET請求參數顯示,都顯示在瀏覽器網址上,HTTP服務器根據該請求所包含URL中的參數來產生響應內容,即「Get」請求的參數是URL的一部分。 例如: http://www.baidu.com/s?wd=Chinese

  • POST請求參數在請求體當中,消息長度沒有限制並且以隱式的方式進行發送,一般用來向HTTP服務器提交量比較大的數據(好比請求中包含許多參數或者文件上傳操做等),請求的參數包含在「Content-Type」消息頭裏,指明該消息體的媒體類型和編碼,

注意:避免使用Get方式提交表單,由於有可能會致使安全問題。 好比說在登錄表單中用Get方式,用戶輸入的用戶名和密碼將在地址欄中暴露無遺。

經常使用的請求報頭

1. Host (主機和端口號)

Host:對應網址URL中的Web名稱和端口號,用於指定被請求資源的Internet主機和端口號,一般屬於URL的一部分。

2. Connection (連接類型)

Connection:表示客戶端與服務鏈接類型

  1. Client 發起一個包含 Connection:keep-alive 的請求,HTTP/1.1使用 keep-alive 爲默認值。

  2. Server收到請求後:

    • 若是 Server 支持 keep-alive,回覆一個包含 Connection:keep-alive 的響應,不關閉鏈接;

    • 若是 Server 不支持 keep-alive,回覆一個包含 Connection:close 的響應,關閉鏈接。

  3. 若是client收到包含 Connection:keep-alive 的響應,向同一個鏈接發送下一個請求,直到一方主動關閉鏈接。

keep-alive在不少狀況下可以重用鏈接,減小資源消耗,縮短響應時間,好比當瀏覽器須要多個文件時(好比一個HTML文件和相關的圖形文件),不須要每次都去請求創建鏈接。

3. Upgrade-Insecure-Requests (升級爲HTTPS請求)

Upgrade-Insecure-Requests:升級不安全的請求,意思是會在加載 http 資源時自動替換成 https 請求,讓瀏覽器再也不顯示https頁面中的http請求警報。

HTTPS 是以安全爲目標的 HTTP 通道,因此在 HTTPS 承載的頁面上不容許出現 HTTP 請求,一旦出現就是提示或報錯。

4. User-Agent (瀏覽器名稱)

User-Agent:是客戶瀏覽器的名稱,之後會詳細講。

5. 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:用於傳輸應用程序數據或者二進制數據。

6. Referer (頁面跳轉處)

Referer:代表產生請求的網頁來自於哪一個URL,用戶是從該 Referer頁面訪問到當前請求的頁面。這個屬性能夠用來跟蹤Web請求來自哪一個頁面,是從什麼網站來的等。

有時候遇到下載某網站圖片,須要對應的referer,不然沒法下載圖片,那是由於人家作了防盜鏈,原理就是根據referer去判斷是不是本網站的地址,若是不是,則拒絕,若是是,就能夠下載;

7. Accept-Encoding(文件編解碼格式)

Accept-Encoding:指出瀏覽器能夠接受的編碼方式。編碼方式不一樣於文件格式,它是爲了壓縮文件並加速文件傳遞速度。瀏覽器在接收到Web響應以後先解碼,而後再檢查文件格式,許多情形下這能夠減小大量的下載時間。

例:Accept-Encoding:gzip;q=1.0, identity; q=0.5, *;q=0

若是有多個Encoding同時匹配, 按照q值順序排列,本例中按順序支持 gzip, identity壓縮編碼,支持gzip的瀏覽器會返回通過gzip編碼的HTML頁面。 若是請求消息中沒有設置這個域服務器假定客戶端對各類內容編碼均可以接受。

8. Accept-Language(語言種類)

Accept-Langeuage:指出瀏覽器能夠接受的語言種類,如en或en-us指英語,zh或者zh-cn指中文,當服務器可以提供一種以上的語言版本時要用到。

9. 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 的一種變長字符編碼,能夠解決多種語言文本顯示問題,從而實現應用國際化和本地化。

若是在請求消息中沒有設置這個域,缺省是任何字符集均可以接受。

10. Cookie (Cookie)

Cookie:瀏覽器用這個屬性向服務器發送Cookie。Cookie是在瀏覽器中寄存的小型數據體,它能夠記載和服務器相關的用戶信息,也能夠用來實現會話功能

11. Content-Type (POST數據類型)

Content-Type:POST請求裏用來表示的內容類型。

舉例:Content-Type = Text/XML; charset=gb2312:

指明該請求的消息體中包含的是純文本的XML類型的數據,字符編碼採用「gb2312」。

服務端HTTP響應

HTTP響應也由四個部分組成,分別是: 狀態行消息報頭空行響應正文

HTTP/1.1 200 OK
Server: Tengine
Connection: keep-alive
Date: Wed, 30 Nov 2016 07:58:21 GMT
Cache-Control: no-cache
Content-Type: text/html;charset=UTF-8
Keep-Alive: timeout=20
Vary: Accept-Encoding
Pragma: no-cache
X-NWS-LOG-UUID: bd27210a-24e5-4740-8f6c-25dbafa9c395
Content-Length: 180945

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ....

經常使用的響應報頭

理論上全部的響應頭信息都應該是迴應請求頭的。可是服務端爲了效率,安全,還有其餘方面的考慮,會添加相對應的響應頭信息,從上圖能夠看到:

1. Cache-Control:must-revalidate, no-cache, private。

這個值告訴客戶端,服務端不但願客戶端緩存資源,在下次請求資源時,必需要重新請求服務器,不能從緩存副本中獲取資源。

  • Cache-Control是響應頭中很重要的信息,當客戶端請求頭中包含Cache-Control:max-age=0請求,明確表示不會緩存服務器資源時,Cache-Control做爲做爲迴應信息,一般會返回no-cache,意思就是說,"那就不緩存唄"。

  • 當客戶端在請求頭中沒有包含Cache-Control時,服務端每每會定,不一樣的資源不一樣的緩存策略,好比說oschina在緩存圖片資源的策略就是Cache-Control:max-age=86400,這個意思是,從當前時間開始,在86400秒的時間內,客戶端能夠直接從緩存副本中讀取資源,而不須要向服務器請求。

2. Connection:keep-alive

這個字段做爲迴應客戶端的Connection:keep-alive,告訴客戶端服務器的tcp鏈接也是一個長鏈接,客戶端能夠繼續使用這個tcp鏈接發送http請求。

3. Content-Encoding:gzip

告訴客戶端,服務端發送的資源是採用gzip編碼的,客戶端看到這個信息後,應該採用gzip對資源進行解碼。

4. Content-Type:text/html;charset=UTF-8

告訴客戶端,資源文件的類型,還有字符編碼,客戶端經過utf-8對資源進行解碼,而後對資源進行html解析。一般咱們會看到有些網站是亂碼的,每每就是服務器端沒有返回正確的編碼。

5. Date:Sun, 21 Sep 2016 06:18:21 GMT

這個是服務端發送資源時的服務器時間,GMT是格林尼治所在地的標準時間。http協議中發送的時間都是GMT的,這主要是解決在互聯網上,不一樣時區在相互請求資源的時候,時間混亂問題。

6. Expires:Sun, 1 Jan 2000 01:00:00 GMT

這個響應頭也是跟緩存有關的,告訴客戶端在這個時間前,能夠直接訪問緩存副本,很顯然這個值會存在問題,由於客戶端和服務器的時間不必定會都是相同的,若是時間不一樣就會致使問題。因此這個響應頭是沒有Cache-Control:max-age=*這個響應頭準確的,由於max-age=date中的date是個相對時間,不只更好理解,也更準確。

7. Pragma:no-cache

這個含義與Cache-Control等同。

8.Server:Tengine/1.4.6

這個是服務器和相對應的版本,只是告訴客戶端服務器的信息。

9. Transfer-Encoding:chunked

這個響應頭告訴客戶端,服務器發送的資源的方式是分塊發送的。通常分塊發送的資源都是服務器動態生成的,在發送時還不知道發送資源的大小,因此採用分塊發送,每一塊都是獨立的,獨立的塊都能標示本身的長度,最後一塊是0長度的,當客戶端讀到這個0長度的塊時,就能夠肯定資源已經傳輸完了。

10. Vary: Accept-Encoding

告訴緩存服務器,緩存壓縮文件和非壓縮文件兩個版本,如今這個字段用處並不大,由於如今的瀏覽器都是支持壓縮的。

Cookie 和 Session:

服務器和客戶端的交互僅限於請求/響應過程,結束以後便斷開,在下一次請求時,服務器會認爲新的客戶端。

爲了維護他們之間的連接,讓服務器知道這是前一個用戶發送的請求,必須在一個地方保存客戶端的信息。

Cookie:經過在 客戶端 記錄的信息肯定用戶的身份。

Session:經過在 服務器端 記錄的信息肯定用戶的身份。

響應狀態碼

響應狀態代碼有三位數字組成,第一個數字定義了響應的類別,且有五種可能取值。

常見狀態碼:

  • 100~199:表示服務器成功接收部分請求,要求客戶端繼續提交其他請求才能完成整個處理過程。

  • 200~299:表示服務器成功接收請求並已完成整個處理過程。經常使用200(OK 請求成功)。

  • 300~399:爲完成請求,客戶需進一步細化請求。例如:請求的資源已經移動一個新地址、經常使用302(所請求的頁面已經臨時轉移至新的url)、307和304(使用緩存資源)。

  • 400~499:客戶端的請求有錯誤,經常使用404(服務器沒法找到被請求的頁面)、403(服務器拒絕訪問,權限不夠)。

  • 500~599:服務器端出現錯誤,經常使用500(請求未完成。服務器遇到不可預知的狀況)。

HTTP響應狀態碼參考:

1xx:信息
100 Continue
服務器僅接收到部分請求,可是一旦服務器並無拒絕該請求,客戶端應該繼續發送其他的請求。
101 Switching Protocols
服務器轉換協議:服務器將聽從客戶的請求轉換到另一種協議。

2xx:成功
200 OK
請求成功(其後是對GET和POST請求的應答文檔)
201 Created
請求被建立完成,同時新的資源被建立。
202 Accepted
供處理的請求已被接受,可是處理未完成。
203 Non-authoritative Information
文檔已經正常地返回,但一些應答頭可能不正確,由於使用的是文檔的拷貝。
204 No Content
沒有新文檔。瀏覽器應該繼續顯示原來的文檔。若是用戶按期地刷新頁面,而Servlet能夠肯定用戶文檔足夠新,這個狀態代碼是頗有用的。
205 Reset Content
沒有新文檔。但瀏覽器應該重置它所顯示的內容。用來強制瀏覽器清除表單輸入內容。
206 Partial Content
客戶發送了一個帶有Range頭的GET請求,服務器完成了它。

3xx:重定向
300 Multiple Choices
多重選擇。連接列表。用戶能夠選擇某連接到達目的地。最多容許五個地址。
301 Moved Permanently
所請求的頁面已經轉移至新的url。
302 Moved Temporarily
所請求的頁面已經臨時轉移至新的url。
303 See Other
所請求的頁面可在別的url下被找到。
304 Not Modified
未按預期修改文檔。客戶端有緩衝的文檔併發出了一個條件性的請求(通常是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。服務器告訴客戶,原來緩衝的文檔還能夠繼續使用。
305 Use Proxy
客戶請求的文檔應該經過Location頭所指明的代理服務器提取。
306 Unused
此代碼被用於前一版本。目前已再也不使用,可是代碼依然被保留。
307 Temporary Redirect
被請求的頁面已經臨時移至新的url。

4xx:客戶端錯誤
400 Bad Request
服務器未能理解請求。
401 Unauthorized
被請求的頁面須要用戶名和密碼。
401.1
登陸失敗。
401.2
服務器配置致使登陸失敗。
401.3
因爲 ACL 對資源的限制而未得到受權。
401.4
篩選器受權失敗。
401.5
ISAPI/CGI 應用程序受權失敗。
401.7
訪問被 Web 服務器上的 URL 受權策略拒絕。這個錯誤代碼爲 IIS 6.0 所專用。
402 Payment Required
此代碼尚沒法使用。
403 Forbidden
對被請求頁面的訪問被禁止。
403.1
執行訪問被禁止。
403.2
讀訪問被禁止。
403.3
寫訪問被禁止。
403.4
要求 SSL。
403.5
要求 SSL 128。
403.6
IP 地址被拒絕。
403.7
要求客戶端證書。
403.8
站點訪問被拒絕。
403.9
用戶數過多。
403.10
配置無效。
403.11
密碼更改。
403.12
拒絕訪問映射表。
403.13
客戶端證書被吊銷。
403.14
拒絕目錄列表。
403.15
超出客戶端訪問許可。
403.16
客戶端證書不受信任或無效。
403.17
客戶端證書已過時或還沒有生效。
403.18
在當前的應用程序池中不能執行所請求的 URL。這個錯誤代碼爲 IIS 6.0 所專用。
403.19
不能爲這個應用程序池中的客戶端執行 CGI。這個錯誤代碼爲 IIS 6.0 所專用。
403.20
Passport 登陸失敗。這個錯誤代碼爲 IIS 6.0 所專用。
404 Not Found
服務器沒法找到被請求的頁面。
404.0
沒有找到文件或目錄。
404.1
沒法在所請求的端口上訪問 Web 站點。
404.2
Web 服務擴展鎖定策略阻止本請求。
404.3
MIME 映射策略阻止本請求。
405 Method Not Allowed
請求中指定的方法不被容許。
406 Not Acceptable
服務器生成的響應沒法被客戶端所接受。
407 Proxy Authentication Required
用戶必須首先使用代理服務器進行驗證,這樣請求才會被處理。
408 Request Timeout
請求超出了服務器的等待時間。
409 Conflict
因爲衝突,請求沒法被完成。
410 Gone
被請求的頁面不可用。
411 Length Required
"Content-Length" 未被定義。若是無此內容,服務器不會接受請求。
412 Precondition Failed
請求中的前提條件被服務器評估爲失敗。
413 Request Entity Too Large
因爲所請求的實體的太大,服務器不會接受請求。
414 Request-url Too Long
因爲url太長,服務器不會接受請求。當post請求被轉換爲帶有很長的查詢信息的get請求時,就會發生這種狀況。
415 Unsupported Media Type
因爲媒介類型不被支持,服務器不會接受請求。
416 Requested Range Not Satisfiable
服務器不能知足客戶在請求中指定的Range頭。
417 Expectation Failed
執行失敗。
423
鎖定的錯誤。

5xx:服務器錯誤
500 Internal Server Error
請求未完成。服務器遇到不可預知的狀況。
500.12
應用程序正忙於在 Web 服務器上從新啓動。
500.13
Web 服務器太忙。
500.15
不容許直接請求 Global.asa。
500.16
UNC 受權憑據不正確。這個錯誤代碼爲 IIS 6.0 所專用。
500.18
URL 受權存儲不能打開。這個錯誤代碼爲 IIS 6.0 所專用。
500.100
內部 ASP 錯誤。
501 Not Implemented
請求未完成。服務器不支持所請求的功能。
502 Bad Gateway
請求未完成。服務器從上游服務器收到一個無效的響應。
502.1
CGI 應用程序超時。 ·
502.2
CGI 應用程序出錯。
503 Service Unavailable
請求未完成。服務器臨時過載或當機。
504 Gateway Timeout
網關超時。
505 HTTP Version Not Supported
服務器不支持請求中指明的HTTP協議版本

爬蟲開發的通常流程

  1. 發送請求,獲取響應

  2. 解析網頁,獲取數據

  3. 保存數據到本地或者數據庫

相關文章
相關標籤/搜索