1. 爬蟲基礎(chǔ)
1.1 HTTP基本原理
1.1.1 URI和URL
? URI,全稱Uniform Resource Identifier,即統(tǒng)一資源標(biāo)志符;URL,全稱Uniform Resource Locator,即統(tǒng)一資源定位符。
? 舉例來說,https://github.com/favicon.ico既是一個(gè)URI,也是一個(gè)URL。即有favicon.ico這樣一個(gè)圖標(biāo)資源,用這樣一個(gè)URI/URL指定了訪問它的唯一方式,其中包括訪問協(xié)議https、訪問路徑(即根目錄)和資源名稱。通過一個(gè)鏈接,便可以從互聯(lián)網(wǎng)中找到某個(gè)資源,這個(gè)鏈接就是URI/URL。
? URL是URI的子集,也就是說每個(gè)URL都是URI,但并非每個(gè)URI都是URL。除了URL,URI還包括一個(gè)子類,叫做URN,全稱Uniform Resource Name,即統(tǒng)一資源名稱。URN只為資源命名而不指定如何定位資源。在目前的互聯(lián)網(wǎng)中,URN使用非常少,所以幾乎所有的URI都是URL。
? URL遵循一定的格式規(guī)范,其基本組成格式如下:
scheme://[username:password@]hostname[:port][/path][;parameters][?query][#fragment]
? 其中,中括號(hào)包括的內(nèi)容代表非必要部分。下面介紹幾部分代表的含義和作用。
- **scheme:協(xié)議。**常用的協(xié)議有http、https、ftp等,另外也常被稱作protocol。
- **username、password:用戶名和密碼。**在某些情況下URL需要提供用戶名和密碼才能訪問。
- **hostname:主機(jī)地址。**可以是域名或IP地址。
- **port:端口。**服務(wù)器設(shè)定的服務(wù)端口,http協(xié)議的默認(rèn)端口為80,https協(xié)議的默認(rèn)端口為443。
- **path:路徑。**指的是網(wǎng)絡(luò)資源在服務(wù)器中的指定地址。
- **parameters:參數(shù)。**用來指定訪問某個(gè)資源時(shí)的附加信息。
- **query:查詢。**用來查詢某類資源,如果有多個(gè)查詢,則用&隔開。
- **fragment:片段。**對(duì)資源描述的部分補(bǔ)充,可以理解為資源內(nèi)部的書簽?,F(xiàn)在主要用于單頁面路由和HTML錨點(diǎn)。
1.1.2 HTTP和HTTPS
? 在爬蟲中,我們抓取的頁面主要是基于http或https協(xié)議的,因此應(yīng)首先了解一下兩個(gè)協(xié)議的含義。
? HTTP的全稱是Hypertext Transfer Protocol,即超文本傳輸協(xié)議,作用是把超文本數(shù)據(jù)從網(wǎng)絡(luò)傳輸?shù)奖镜貫g覽器,能夠保證高效而準(zhǔn)確地傳輸超文本文檔。HTTPS的全稱是Hypertext Transfer Protocol over Secure Socket Layer,是以安全為目標(biāo)的HTTP通道,簡(jiǎn)單講就是HTTP的安全版,即在HTTP下加入SSL層,簡(jiǎn)稱HTTPS。HTTPS的安全基礎(chǔ)是SSL,因此通過該協(xié)議傳輸?shù)膬?nèi)容都是經(jīng)過SSL加密的,SSL的作用主要有以下兩種:
- 建立一個(gè)信息安全通道,保證數(shù)據(jù)傳輸?shù)陌踩浴?/strong>
- 確認(rèn)網(wǎng)站的真實(shí)性。
1.1.3 HTTP請(qǐng)求過程
? 在瀏覽器地址欄中輸入一個(gè)URL,按下回車之后可觀察到對(duì)應(yīng)的頁面內(nèi)容。實(shí)際上,這個(gè)過程是瀏覽器先向網(wǎng)站所在的服務(wù)器發(fā)送一個(gè)請(qǐng)求,網(wǎng)站服務(wù)器接收到請(qǐng)求后對(duì)其進(jìn)行處理和解析,然后返回對(duì)應(yīng)的響應(yīng),接著傳回瀏覽器。由于響應(yīng)里包含頁面的源代碼等內(nèi)容,所以瀏覽器再對(duì)其進(jìn)行解析,便將網(wǎng)頁呈現(xiàn)出來。
? 打開瀏覽器,訪問百度,此時(shí)單機(jī)鼠標(biāo)右鍵并選擇“檢查”菜單即可打開瀏覽器的開發(fā)者工具,如圖1-1-1所示。
? 切換到Network(網(wǎng)絡(luò))面板,然后刷新網(wǎng)頁,可以看到在Network(網(wǎng)絡(luò))面板下方出現(xiàn)很多條目,其中一個(gè)條目就代表一次發(fā)送請(qǐng)求和接收響應(yīng)的過程,如圖1-1-2所示。
? 觀察www.baidu.com,其中各列的含義如下:
- 第一列名稱:請(qǐng)求的名稱。一般用URL的最后一部分內(nèi)容作為名稱。
- 第二列狀態(tài):響應(yīng)的狀態(tài)碼。這里顯示為200,表示響應(yīng)正常。通過狀態(tài)碼,可以判斷發(fā)送請(qǐng)求之后是否得到了正常的響應(yīng)。
- 第三列協(xié)議:請(qǐng)求的協(xié)議類型。
- 第四列類型:請(qǐng)求的文檔類型。這里為document,代表這次請(qǐng)求的是一個(gè)HTML文檔,內(nèi)容是一些HTML代碼。
- 第五列發(fā)起程序:請(qǐng)求源。用來標(biāo)記請(qǐng)求是由哪個(gè)對(duì)象或進(jìn)程發(fā)起的。
- 第六列大小:從服務(wù)器下載的文件或請(qǐng)求的資源大小。如果資源是從緩存中取得的,則該列會(huì)顯示from cache。
- 第七列時(shí)間:從發(fā)起請(qǐng)求到獲取響應(yīng)所花的總時(shí)間。
- 第八列時(shí)間線:網(wǎng)絡(luò)請(qǐng)求的可視化瀑布流。
? 單擊這個(gè)條目,即可看到其更詳細(xì)的信息,如圖1-1-3所示。
? 首先是常規(guī)項(xiàng),其中請(qǐng)求URL為主機(jī)請(qǐng)求的URL,請(qǐng)求方法為主機(jī)請(qǐng)求的方法,狀態(tài)代碼為響應(yīng)狀態(tài)碼,遠(yuǎn)程地址為遠(yuǎn)程服務(wù)器的地址和端口,引用者策略為引用者判別策略。
? 繼續(xù)往下可以看到相應(yīng)標(biāo)頭和請(qǐng)求標(biāo)頭。請(qǐng)求頭中包含許多請(qǐng)求信息,這些是請(qǐng)求的一部分,服務(wù)器會(huì)根據(jù)請(qǐng)求頭里的信息判斷請(qǐng)求是否合法,進(jìn)而做出對(duì)應(yīng)的響應(yīng)。響應(yīng)頭是相應(yīng)的一部分,其中包含服務(wù)器的類型、文檔類型、日期等信息,瀏覽器在接收到響應(yīng)后,會(huì)對(duì)其進(jìn)行解析,進(jìn)而呈現(xiàn)網(wǎng)頁內(nèi)容。
1.1.4 請(qǐng)求
? 請(qǐng)求,英文為Request,由客戶端發(fā)往服務(wù)器,分為四部分內(nèi)容:請(qǐng)求方法(Request Method)、請(qǐng)求的網(wǎng)址(Request URL)、請(qǐng)求頭(Request Headers)、請(qǐng)求體(Request Body)。下面分別介紹:
? 1.請(qǐng)求方法
? 請(qǐng)求方法,用于標(biāo)識(shí)請(qǐng)求客戶端請(qǐng)求服務(wù)端的方式,常見的請(qǐng)求方法有兩種:GET和POST。
? 在瀏覽器中直接輸入U(xiǎn)RL并回車,便發(fā)起了一個(gè)GET請(qǐng)求,請(qǐng)求的參數(shù)會(huì)直接包含到URL里。POST請(qǐng)求大多在提交表單時(shí)發(fā)起,其數(shù)據(jù)通常以表單的形式傳輸,而不會(huì)體現(xiàn)在URL中。
? GET請(qǐng)求和POST請(qǐng)求有如下區(qū)別:
- GET請(qǐng)求的參數(shù)包含在URL里,數(shù)據(jù)可以在URL中看到;而POST請(qǐng)求的URL不會(huì)包含這些數(shù)據(jù),數(shù)據(jù)都是通過表單形式傳輸?shù)模瑫?huì)包含在請(qǐng)求體中。
- GET請(qǐng)求提交的數(shù)據(jù)最多只有1024字節(jié),POST方式則沒有限制。
? 我們平常遇到的絕大多數(shù)請(qǐng)求是GET或POST請(qǐng)求。其實(shí)除了這兩個(gè),還有一些請(qǐng)求方法,如HEAD、PUT、DELETE、CONNECT、OPTIONS、TRACE等,我們簡(jiǎn)單將請(qǐng)求方法總結(jié)為表1-1-1。
方法 | 描述 |
---|---|
GET | 請(qǐng)求頁面,并返回頁面內(nèi)容 |
HEAD | 類似于GET請(qǐng)求,不過返回的響應(yīng)中沒有具體內(nèi)容。用于獲取報(bào)頭 |
POST | 大多用于提交表單或上傳文件,數(shù)據(jù)包含在請(qǐng)求體中 |
PUT | 用客戶端傳向服務(wù)器的數(shù)據(jù)替代指定文檔中的內(nèi)容 |
DELETE | 請(qǐng)求服務(wù)器刪除指定的頁面 |
CONNECT | 把服務(wù)器當(dāng)做跳板,讓服務(wù)器代替客戶端訪問其他網(wǎng)頁 |
OPTIONS | 允許客戶端查看服務(wù)器的性能 |
TRACE | 回顯服務(wù)器收到的請(qǐng)求。主要用于測(cè)試或診斷 |
? 2.請(qǐng)求的網(wǎng)址
? 請(qǐng)求的網(wǎng)址,它可以唯一確定客戶端向請(qǐng)求的資源。
? 3.請(qǐng)求頭
? 請(qǐng)求頭,用來說明服務(wù)器要使用的附加信息,比較重要的信息有Cookie、Referer、User-Agent等。下面簡(jiǎn)單介紹一些常用的請(qǐng)求頭信息:
- Accept:請(qǐng)求報(bào)頭域,用于指定客戶端可接受哪些類型的信息。
- Accept-Language:用于指定客戶端可接受的語言類型。
- Accept-Encoding:用于指定客戶端可接受的內(nèi)容編碼。
- Host:用于指定請(qǐng)求資源的主機(jī)IP和端口號(hào),其內(nèi)容為請(qǐng)求URL的原始服務(wù)器或網(wǎng)關(guān)的位置。
- Cookie:網(wǎng)站為了辨別用戶,進(jìn)行會(huì)話跟蹤而存儲(chǔ)在用戶本地的數(shù)據(jù)。主要功能是維持當(dāng)前訪問會(huì)話。
- Referer:用于標(biāo)識(shí)請(qǐng)求是從哪個(gè)頁面發(fā)過來的,服務(wù)器可以拿到這一信息并做相應(yīng)的處理。
- User-Agent:簡(jiǎn)稱UA,這是一個(gè)特殊的字符串頭,可以使服務(wù)器識(shí)別客戶端使用的操作系統(tǒng)及版本、瀏覽器及版本等信息。做爬蟲時(shí)如果加上此信息,可以偽裝成瀏覽器。
- Content-Type:也叫做互聯(lián)網(wǎng)媒體類型(Internet Media Type)或者M(jìn)IME類型,在HTTP協(xié)議消息頭中,它用來表示具體請(qǐng)求中的媒體類型信息。
? 4.請(qǐng)求體
? 請(qǐng)求體,一般承載的內(nèi)容是POST請(qǐng)求中的表單數(shù)據(jù),對(duì)于GET請(qǐng)求,請(qǐng)求體為空。
? 例如,登錄百度時(shí)捕獲到的請(qǐng)求和響應(yīng)如圖1-1-4所示。
? 登錄之前,需要先填寫用戶名和密碼信息,登錄時(shí)這些內(nèi)容會(huì)以表單數(shù)據(jù)的形式提交給服務(wù)器,此時(shí)需要注意Request Headers中指定Content-Type為application/x-www-form-urlencoded。只有這樣設(shè)置Content-Type,內(nèi)容才會(huì)以表單數(shù)據(jù)的形式提交。另外,也可以將Content-Type設(shè)置為application/json來提交json數(shù)據(jù),或者設(shè)置為multipart/form-data來上傳文件。
? 表1-1-2列出了Content-Type和POST提交數(shù)據(jù)方式的關(guān)系。
Content-Type | POST提交數(shù)據(jù)的方式 |
---|---|
application/x-www-form-urlencoded | 表單數(shù)據(jù) |
multipart/form-data | 表單文件上傳 |
application/json | 序列化JSON數(shù)據(jù) |
text/xml | XML數(shù)據(jù) |
? 在爬蟲中,構(gòu)造POST請(qǐng)求需要使用正確的Content-Type,并了解設(shè)置各種請(qǐng)求庫的各個(gè)參數(shù)時(shí)使用的都是哪種Content-Type,否則可能會(huì)導(dǎo)致POST提交后無法得到正常響應(yīng)。
? 5.響應(yīng)
? 響應(yīng),即Response,由服務(wù)器返回給客戶端,可以分為三部分:響應(yīng)狀態(tài)碼(Response Status Code)、響應(yīng)頭(Response Headers)和響應(yīng)體(Response Body)。
- 響應(yīng)狀態(tài)碼
? 響應(yīng)狀態(tài)碼,表示服務(wù)器的響應(yīng)狀態(tài)。在爬蟲中,我們可以根據(jù)狀態(tài)碼判斷服務(wù)器的響應(yīng)狀態(tài),表1-1-3列出了常見的狀態(tài)碼和對(duì)應(yīng)含義。
狀態(tài)碼 | 說明 | 詳情 |
---|---|---|
100 | 繼續(xù) | 請(qǐng)求者應(yīng)當(dāng)繼續(xù)提出請(qǐng)求。服務(wù)器已接收到請(qǐng)求的一部分,正在等待其余部分 |
101 | 切換協(xié)議 | 請(qǐng)求者已要求服務(wù)器切換協(xié)議,服務(wù)器已確認(rèn)并準(zhǔn)備切換 |
200 | 成功 | 服務(wù)器已成功處理了請(qǐng)求 |
201 | 已創(chuàng)建 | 請(qǐng)求成功并且服務(wù)器創(chuàng)建了新的資源 |
202 | 已接收 | 服務(wù)器已接收請(qǐng)求,但尚未處理 |
203 | 非授權(quán)信息 | 服務(wù)器已成功處理了請(qǐng)求,但返回的信息可能來自另一個(gè)源 |
204 | 無內(nèi)容 | 服務(wù)器成功處理了請(qǐng)求,但沒有返回任何內(nèi)容 |
205 | 重置內(nèi)容 | 服務(wù)器成功處理了請(qǐng)求,內(nèi)容被重置 |
206 | 部分內(nèi)容 | 服務(wù)器成功處理了部分請(qǐng)求 |
300 | 多種選擇 | 針對(duì)請(qǐng)求,服務(wù)器可執(zhí)行多種操作 |
301 | 永久移動(dòng) | 請(qǐng)求的網(wǎng)頁已永久移動(dòng)到新位置,即永久重定向 |
302 | 臨時(shí)移動(dòng) | 請(qǐng)求的網(wǎng)頁暫時(shí)跳轉(zhuǎn)到其他頁面,即暫時(shí)重定向 |
303 | 查看其他位置 | 如果原來的請(qǐng)求是POST,重定向目標(biāo)文檔應(yīng)該通過GET提取 |
304 | 未修改 | 此次請(qǐng)求返回的網(wǎng)頁未經(jīng)修改,繼續(xù)使用上次的資源 |
305 | 使用代理 | 請(qǐng)求者應(yīng)該使用代理訪問該網(wǎng)頁 |
307 | 臨時(shí)重定向 | 臨時(shí)從其他位置響應(yīng)請(qǐng)求的資源 |
400 | 錯(cuò)誤請(qǐng)求 | 服務(wù)器無法解析該請(qǐng)求 |
401 | 未授權(quán) | 請(qǐng)求沒有進(jìn)行身份驗(yàn)證或驗(yàn)證未通過 |
403 | 禁止訪問 | 服務(wù)器拒絕此請(qǐng)求 |
404 | 未找到 | 服務(wù)器找不到請(qǐng)求的網(wǎng)頁 |
405 | 方法禁用 | 服務(wù)器禁用了請(qǐng)求中指定的方法 |
406 | 不接收 | 無法使用請(qǐng)求的內(nèi)容響應(yīng)請(qǐng)求的網(wǎng)頁 |
407 | 需要代理授權(quán) | 請(qǐng)求者需要使用代理授權(quán) |
408 | 請(qǐng)求超時(shí) | 服務(wù)器請(qǐng)求超時(shí) |
409 | 沖突 | 服務(wù)器在完成請(qǐng)求時(shí)發(fā)生沖突 |
410 | 已刪除 | 請(qǐng)求的資源已永久刪除 |
411 | 需要有效長(zhǎng)度 | 服務(wù)器不接收不含有效內(nèi)容長(zhǎng)度標(biāo)頭字段的請(qǐng)求 |
412 | 未滿足前提條件 | 服務(wù)器未滿足請(qǐng)求者在請(qǐng)求中設(shè)置的某一個(gè)前提條件 |
413 | 請(qǐng)求實(shí)體過大 | 請(qǐng)求實(shí)體過大,超出服務(wù)器的處理能力 |
414 | 請(qǐng)求URI過長(zhǎng) | 請(qǐng)求網(wǎng)址過長(zhǎng),服務(wù)器無法處理 |
415 | 不支持類型 | 請(qǐng)求格式不被請(qǐng)求頁面支持 |
416 | 請(qǐng)求范圍不符 | 頁面無法提供請(qǐng)求的范圍 |
417 | 未滿足期望值 | 服務(wù)器未滿足期望請(qǐng)求標(biāo)頭字段的要求 |
500 | 服務(wù)器內(nèi)部錯(cuò)誤 | 服務(wù)器遇到錯(cuò)誤,無法完成請(qǐng)求 |
501 | 未實(shí)現(xiàn) | 服務(wù)器不具備完成請(qǐng)求的能力 |
502 | 錯(cuò)誤網(wǎng)關(guān) | 服務(wù)器作為網(wǎng)關(guān)或代理,接收到上游服務(wù)器的無效響應(yīng) |
503 | 服務(wù)不可用 | 服務(wù)器目前無法使用 |
504 | 網(wǎng)關(guān)超時(shí) | 服務(wù)器作為網(wǎng)關(guān)或代理,沒有及時(shí)從上游服務(wù)器接收到請(qǐng)求 |
505 | HTTP版本不支持 | 服務(wù)器不支持請(qǐng)求中使用的HTTP協(xié)議版本 |
- 響應(yīng)頭
? 響應(yīng)頭,包含了服務(wù)器對(duì)請(qǐng)求的應(yīng)答信息,下面簡(jiǎn)要說明一些常用的響應(yīng)頭信息。
- Date:用于標(biāo)識(shí)響應(yīng)產(chǎn)生的時(shí)間。
- Last-Modified:用于指定資源的最后修改時(shí)間。
- Content-Encoding:用于指定響應(yīng)內(nèi)容的編碼。
- Server:包含服務(wù)器的信息。
- Content-Type:文檔類型,指定返回的數(shù)據(jù)是什么類型。
- Set-Cookie:設(shè)置Cookie,告訴瀏覽器需要將此內(nèi)容放在Cookie中,下次請(qǐng)求時(shí)將Cookie攜帶上。
- Expires:用于指定響應(yīng)的過期時(shí)間,可以讓代理服務(wù)器或?yàn)g覽器將加載的內(nèi)容更新到緩存中。當(dāng)再次訪問相同的內(nèi)容時(shí),就可以直接從緩存中加載,達(dá)到降低服務(wù)器負(fù)載、縮短加載時(shí)間的目的。
- 響應(yīng)體
? 響應(yīng)體,可以說是最關(guān)鍵的部分,相應(yīng)的正文都存在于響應(yīng)體中。爬蟲請(qǐng)求網(wǎng)頁時(shí),要解析的內(nèi)容就是響應(yīng)體,如圖1-1-5所示。
文章來源:http://www.zghlxwxcb.cn/news/detail-774321.html
? 在瀏覽器開發(fā)者工具中點(diǎn)擊響應(yīng),就可以看到網(wǎng)頁的源代碼,也就是響應(yīng)體的內(nèi)容,這是爬蟲的解析目標(biāo)。在做爬蟲時(shí),我們主要通過響應(yīng)體得到網(wǎng)頁的源代碼、JSON數(shù)據(jù)等,然后從中提取相應(yīng)內(nèi)容。文章來源地址http://www.zghlxwxcb.cn/news/detail-774321.html
到了這里,關(guān)于《網(wǎng)絡(luò)爬蟲開發(fā)實(shí)戰(zhàn)》學(xué)習(xí)筆記:1.1 HTTP基本原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!