爬蟲(爬蟲原理與數據抓取)

爬蟲(爬蟲原理與數據抓取)

通用爬蟲和聚焦爬蟲

根據使用場景,網絡爬蟲可分爲 通用爬蟲 和 聚焦爬蟲 兩種.

通用爬蟲

通用網絡爬蟲 是 捜索引擎抓取系統(Baidu、Google、Yahoo等)的重要組成部分。主要目的是將互聯網上的網頁下載到本地,形成一個互聯網內容的鏡像備份。

通用搜索引擎(Search Engine)工作原理
通用網絡爬蟲 從互聯網中搜集網頁,採集信息,這些網頁信息用於爲搜索引擎建立索引從而提供支持,它決定着整個引擎系統的內容是否豐富,信息是否即時,因此其性能的優劣直接影響着搜索引擎的效果。

第一步:抓取網頁
搜索引擎網絡爬蟲的基本工作流程如下:

首先選取一部分的種子URL,將這些URL放入待抓取URL隊列;

取出待抓取URL,解析DNS得到主機的IP,並將URL對應的網頁下載下來,存儲進已下載網頁庫中,並且將這些URL放進已抓取URL隊列。

分析已抓取URL隊列中的URL,分析其中的其他URL,並且將URL放入待抓取URL隊列,從而進入下一個循環…

搜索引擎如何獲取一個新網站的URL:

  1. 新網站向搜索引擎主動提交網址:(如百度http://zhanzhang.baidu.com/linksubmit/url)
  2. 在其他網站上設置新網站外鏈(儘可能處於搜索引擎爬蟲爬取範圍)
  3. 搜索引擎和DNS解析服務商(如DNSPod等)合作,新網站域名將被迅速抓取。
    但是搜索引擎蜘蛛的爬行是被輸入了一定的規則的,它需要遵從一些命令或文件的內容,如標註爲nofollow的鏈接,或者是Robots協議。
    在這裏插入圖片描述
    Robots協議(也叫爬蟲協議、機器人協議等),全稱是“網絡爬蟲排除標準”(Robots Exclusion Protocol),網站通過Robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取,例如:

淘寶網:https://www.taobao.com/robots.txt

騰訊網: http://www.qq.com/robots.txt

第二步:數據存儲
搜索引擎通過爬蟲爬取到的網頁,將數據存入原始頁面數據庫。其中的頁面數據與用戶瀏覽器得到的HTML是完全一樣的。

搜索引擎蜘蛛在抓取頁面時,也做一定的重複內容檢測,一旦遇到訪問權重很低的網站上有大量抄襲、採集或者複製的內容,很可能就不再爬行。

第三步:預處理
搜索引擎將爬蟲抓取回來的頁面,進行各種步驟的預處理。

提取文字
中文分詞
消除噪音(比如版權聲明文字、導航條、廣告等……)
索引處理
鏈接關係計算
特殊文件處理

除了HTML文件外,搜索引擎通常還能抓取和索引以文字爲基礎的多種文件類型,如 PDF、Word、WPS、XLS、PPT、TXT 文件等。我們在搜索結果中也經常會看到這些文件類型。

但搜索引擎還不能處理圖片、視頻、Flash 這類非文字內容,也不能執行腳本和程序。

第四步:提供檢索服務,網站排名
搜索引擎在對信息進行組織和處理後,爲用戶提供關鍵字檢索服務,將用戶檢索相關的信息展示給用戶。

同時會根據頁面的PageRank值(鏈接的訪問量排名)來進行網站排名,這樣Rank值高的網站在搜索結果中會排名較前,當然也可以直接使用 Money 購買搜索引擎網站排名,簡單粗暴。
在這裏插入圖片描述

但是,這些通用性搜索引擎也存在着一定的侷限性:
通用搜索引擎所返回的結果都是網頁,而大多情況下,網頁裏90%的內容對用戶來說都是無用的。

不同領域、不同背景的用戶往往具有不同的檢索目的和需求,搜索引擎無法提供針對具體某個用戶的搜索結果。

萬維網數據形式的豐富和網絡技術的不斷髮展,圖片、數據庫、音頻、視頻多媒體等不同數據大量出現,通用搜索引擎對這些文件無能爲力,不能很好地發現和獲取。

通用搜索引擎大多提供基於關鍵字的檢索,難以支持根據語義信息提出的查詢,無法準確理解用戶的具體需求。

針對這些情況,聚焦爬蟲技術得以廣泛使用。

聚焦爬蟲

聚焦爬蟲,是"面向特定主題需求"的一種網絡爬蟲程序,它與通用搜索引擎爬蟲的區別在於: 聚焦爬蟲在實施網頁抓取時會對內容進行處理篩選,儘量保證只抓取與需求相關的網頁信息。

而我們今後要學習的,就是聚焦爬蟲。

HTTP和HTTPS

HTTP協議(HyperText Transfer Protocol,超文本傳輸協議):是一種發佈和接收 HTML頁面的方法。

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

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

HTTP的端口號爲80,
HTTPS的端口號爲443
HTTP工作原理
網絡爬蟲抓取過程可以理解爲模擬瀏覽器操作的過程。

瀏覽器的主要功能是向服務器發出請求,在瀏覽器窗口中展示您選擇的網絡資源,HTTP是一套計算機通過網絡進行通信的規則。

HTTP的請求與響應
HTTP通信由兩部分組成: 客戶端請求消息 與 服務器響應消息

在這裏插入圖片描述

瀏覽器發送HTTP請求的過程:
當用戶在瀏覽器的地址欄中輸入一個URL並按回車鍵之後,瀏覽器會向HTTP服務器發送HTTP請求。HTTP請求主要分爲“Get”和“Post”兩種方法。

當我們在瀏覽器輸入URL http://www.baidu.com 的時候,瀏覽器發送一個Request請求去獲取 http://www.baidu.com 的html文件,服務器把Response文件對象發送回給瀏覽器。

瀏覽器分析Response中的 HTML,發現其中引用了很多其他文件,比如Images文件,CSS文件,JS文件。 瀏覽器會自動再次發送Request去獲取圖片,CSS文件,或者JS文件。

當所有的文件都下載成功後,網頁會根據HTML語法結構,完整的顯示出來了。

URL(Uniform / Universal Resource Locator的縮寫):統一資源定位符,是用於完整地描述Internet上網頁和其他資源的地址的一種標識方法。

在這裏插入圖片描述

基本格式:scheme://host[:port#]/path/…/[?query-string][#anchor]

scheme:協議(例如:http, https, ftp)
host:服務器的IP地址或者域名
port#:服務器的端口(如果是走協議默認端口,缺省端口80)
path:訪問資源的路徑
query-string:參數,發送給http服務器的數據
anchor:錨(跳轉到網頁的指定錨點位置)
例如:

ftp://192.168.0.116:8080/index

http://www.baidu.com

http://item.jd.com/11936238.html#product-detail

客戶端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這些鍵值對。

序號 方法 描述
1 GET 請求指定的頁面信息,並返回實體主體。
2 HEAD 類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭
3 POST 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件),數據被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。
4 PUT 從客戶端向服務器傳送的數據取代指定的文檔的內容。
5 DELETE 請求服務器刪除指定的頁面。
6 CONNECT HTTP/1.1協議中預留給能夠將連接改爲管道方式的代理服務器。
7 OPTIONS 允許客戶端查看服務器的性能。
8 TRACE 回顯服務器收到的請求,主要用於測試或診斷。
HTTP請求主要分爲Get和Post兩種方法
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:表示客戶端與服務連接類型

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文件和相關的圖形文件),不需要每次都去請求建立連接。

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

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

  1. User-Agent (瀏覽器名稱)
    User-Agent:是客戶瀏覽器的名稱,以後會詳細講。

  2. 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:用於傳輸應用程序數據或者二進制數據。詳細請點擊

  1. Referer (頁面跳轉處)
    Referer:表明產生請求的網頁來自於哪個URL,用戶是從該 Referer頁面訪問到當前請求的頁面。這個屬性可以用來跟蹤Web請求來自哪個頁面,是從什麼網站來的等。

有時候遇到下載某網站圖片,需要對應的referer,否則無法下載圖片,那是因爲人家做了防盜鏈,原理就是根據referer去判斷是否是本網站的地址,如果不是,則拒絕,如果是,就可以下載;

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

舉例:Accept-Encoding:gzip;q=1.0, identity; q=0.5, *;q=0
如果有多個Encoding同時匹配, 按照q值順序排列,本例中按順序支持 gzip, identity壓縮編碼,支持gzip的瀏覽器會返回經過gzip編碼的HTML頁面。 如果請求消息中沒有設置這個域服務器假定客戶端對各種內容編碼都可以接受。

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

  2. 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 的一種變長字符編碼,可以解決多種語言文本顯示問題,從而實現應用國際化和本地化。
如果在請求消息中沒有設置這個域,缺省是任何字符集都可以接受。

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

  2. 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

<p>First name: <input type="text" name="fname" /></p>
<p>Last name: <input type="text" name="lname" /></p>
<input type="submit" value="Submit" />

利用cookie模擬登陸
View Code

處理HTTPS請求 SSL證書驗證
現在隨處可見 https 開頭的網站,urllib2可以爲 HTTPS 請求驗證SSL證書,就像web瀏覽器一樣,如果網站的SSL證書是經過CA認證的,則能夠正常訪問,如:https://www.baidu.com/等…

如果SSL證書驗證不通過,或者操作系統不信任服務器的安全證書,比如瀏覽器在訪問12306網站如:https://www.12306.cn/mormhweb/的時候,會警告用戶證書不受信任。(據說 12306 網站證書是自己做的,沒有通過CA認證)

View Code

關於CA
CA(Certificate Authority)是數字證書認證中心的簡稱,是指發放、管理、廢除數字證書的受信任的第三方機構,如北京數字認證股份有限公司、上海市數字證書認證中心有限公司等…

CA的作用是檢查證書持有者身份的合法性,並簽發證書,以防證書被僞造或篡改,以及對證書和密鑰進行管理。

現實生活中可以用身份證來證明身份, 那麼在網絡世界裏,數字證書就是身份證。和現實生活不同的是,並不是每個上網的用戶都有數字證書的,往往只有當一個人需要證明自己的身份的時候才需要用到數字證書。

普通用戶一般是不需要,因爲網站並不關心是誰訪問了網站,現在的網站只關心流量。但是反過來,網站就需要證明自己的身份了。

比如說現在釣魚網站很多的,比如你想訪問的是www.baidu.com,但其實你訪問的是www.daibu.com”,所以在提交自己的隱私信息之前需要驗證一下網站的身份,要求網站出示數字證書。

一般正常的網站都會主動出示自己的數字證書,來確保客戶端和網站服務器之間的通信數據是加密安全的。

本章爲轉載文章,原創文章網址爲:https://www.cnblogs.com/luchun666/p/9394149.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章