爬蟲(1) - 爬蟲基礎入門理論篇

葛老頭發表於2022-06-30

1.學習前置【必看】

近年來由於抓取資料而引起的糾紛越來越多,有的鋃鐺入獄,有的被處罰金,本人爬蟲筆記學習提醒大家:爬蟲有風險,採集需謹慎,寫程式碼不能違法,寫程式碼背後也有法律風險

1.1爬蟲注意點

1.1.1遵守Robots協議

Robots協議,也稱為爬蟲協議、機器人協議等,全稱是“網路爬蟲排除標準”(Robots Exclusion Protocol),網站通過Robots協議告訴爬蟲哪些頁面可以抓取,哪些頁面不能抓取

如何檢視網站的rebots協議?

(1)開啟瀏覽器,在位址列中輸入http://網站域名/robots.txt即可,以查詢百度的robots協議為例;Disallow後邊的目錄是禁止所有搜尋引擎搜尋的

(2)或者藉助相關網站進行檢視,如站長工具等,瀏覽器開啟http://s.tool.chinaz.com/robots,輸入網站地址,點選查詢即可

1.1.2.不過度採集資料

過度資料採集會對目標站點產生非常大的壓力,可導致目標站點伺服器癱瘓、不能訪問等,相當於網路攻擊。學習過程中抓取資料不可貪多,滿足學習需求即可,損害他人權益的事不能做

1.1.3.不要採集隱私資料

有選擇的採集資料,別人不讓看的資料不要爬,私人資料不要爬,如手機號、身份證號、住址、個人財產等不要抓取,受法律保護的特定型別的資料或資訊不能抓取

1.1.4.網站有宣告”禁止爬蟲採集或轉載商業化”

當採集的站點有宣告,禁止爬蟲採集或轉載商業化,請繞行,不讓爬的資料不要爬

1.1.5.不得將抓取資料用於商業化使用

惡意利用爬蟲技術抓取資料,進行不正當競爭,甚至牟取不法利益,會觸犯法律,資料採集不得傷害他人利益

 

1.2.爬蟲與爬蟲工程師

爬蟲(又被稱為網頁蜘蛛,網路機器人),是一種按照一定的規則,自動的抓取全球資訊網資訊的程式或者指令碼,是搜尋引擎的重要組成;爬蟲可以用於以下場景:搜尋引擎、資料分析、人工智慧、薅羊毛、搶車票等

目前市面主流的爬蟲產品有:神箭手、八爪魚、造數、后羿採集器等

爬蟲工程師簡單點理解就是資料的搬運工

爬蟲工程師技術儲備

  • python程式設計基礎
  • linux系統管理基礎
  • http協議
  • 資料庫增刪改查基礎

爬蟲技術怎麼學

  • 首先要學會基礎的Python語法知識
  • 學習Python爬蟲常用到的幾個重要內建庫Requests,用於請求網頁
  • 學習正規表示式re、Xpath(lxml)等網頁解析工具
  • 瞭解爬蟲的一些反爬機制,header、robot、代理IP、驗證碼等
  • 瞭解爬蟲與資料庫的結合,如何將爬取的資料進行儲存
  • 學習應用python的多執行緒、多程式進行爬取,提高爬蟲效率
  • 學習爬蟲的框架scrapy

 

2.網路基礎

2.1.網路協議

2.1.1什麼是協議?

協議可以理解為“規則”,是資料傳輸和資料的解釋規則,下圖是簡單圖解

2.1.2.OSI七層參考模型

  1. 物理層:可以理解為我們的網線,進行位元流的傳輸
  2. 資料鏈路層:可以理解為我們電腦的網路卡,網路卡的驅動可以提供介質訪問、鏈路管理等
  3. 網路層:網路卡可以設定ip地址,進行網路定址和路由選擇
  4. 傳輸層:可以想象成電腦裡面的應用,建立主機端到端連線
  5. 會話層:建立、維護和管理會話
  6. 表示層:處理資料格式、資料加密等
  7. 應用層:提供應用程式間通訊

示例:以小明和小紅利用qq軟體發訊息來再次講解下osi7層模型

小明在qq軟體裡面給小紅發了一個“hello”

資料封裝

  • 小明_應用層:對小明傳送的hello資料,加上應用層的報頭:應用層的資料協議單元
  • 小明_表示層:並不關心上一層的資料格式,把應用層整體的資料進行一個封裝,加上表示層的資料頭
  • 小明_會話層:對上一層資料加上會話層報頭並進行封裝
  • 小明_傳輸層:對上一層資料加上傳輸層報頭並進行封裝
  • 小明_網路層:對上一層資料加上網路層報頭並進行封裝
  • 小明_資料鏈路層:對上一層資料加上資料鏈路層報頭並進行封裝;同時還要對網路層的資料加上資料鏈路層報尾,形成最終的傳輸資料
  • 小明_物理層:傳送給交換機

交換機:傳送給路由器

路由器:傳送給小紅的物理層

資料解封裝

  • 小紅_物理層:攔截小明的傳輸的資料,遞交給資料鏈路層
  • 小紅_資料鏈路層:丟掉小明資料的資料幀的頭部,進行資料校驗,資料沒有問題是給小紅的並且資料是完整的,將資料遞交給網路層
  • 小紅_網路層:同資料鏈路層,進行解封裝,並傳遞給上一層
  • 小紅_傳輸層:同資料鏈路層,進行解封裝,並傳遞給上一層
  • 小紅_會話層:同資料鏈路層,進行解封裝,並傳遞給上一層
  • 小紅_表示層:同資料鏈路層,進行解封裝,並傳遞給上一層
  • 小紅_應用層:同資料鏈路層,進行解封裝,小紅看到“hello”

2.1.3.TCP/IP模型

TCP/IP協議棧,TCP/IP協議繼承ISO模型網上有的說是四層有的說是五層,四層的是將物理層沒算進去,到底記哪一個,這個不衝突,都可以。

圖示tcp/ip相比較iso少了表示層、會話層

TCP/IP各層實現的協議

  • 應用層:
    • HTTP:超文字傳輸協議,基於TCP,使用80號埠,是用於www伺服器傳輸超文字到本地瀏覽器的傳輸協議
    • SMTP:簡單郵件傳輸協議,基於TCP,使用25號埠,是一組用於由源地址到目的地址傳送郵件的規則,用來控制信件的傳送、中轉;比如QQ郵箱,用的就是這個協議
    • FTP:檔案傳輸協議,基於TCP,一般上傳下載用FTP服務,資料埠20號,控制埠21
    • TELNET:遠端登入協議,基於TCP,使用23號埠,是Internet遠端登入服務的標準協議和主要方式。為使用者提供了在本地計算機上完成遠端主機工作的能力。在終端使用者的電腦上上使用telnet程式連線到伺服器。使用明碼傳送,保密性差、簡單方便
    • DNS:域名解析,基於UDP,使用53號埠,提供域名到IP地址之間的轉換
    • SSH:安全外殼協議,基於TCP,使用22號埠,為建立在應用層和傳輸層基礎上的安全協議。SSH是目前較可靠,專為遠端登入會話和其他網路服務提供安全性的協議
  • 傳輸層:
    • TCP:傳輸控制協議。一種面向連線的、可靠的、基於位元組流的傳輸層協議
    • UDP:使用者資料包協議。一種面向無連線的通訊協議,不可靠的、基於報文的傳輸層通訊協議
    • SCTP:流量傳輸控制協議。一種面向連線的流傳輸協議;可以看成TCP的升級版
    • MPTCP:多路徑傳輸控制協議。TCP的多路徑版本。SCTP雖然在首發兩端有多條路徑,但實際只是使用一條路徑傳輸,當該條路徑出現故障時,不需要斷開連線,而是轉移到其他路徑。MPTCP真正意義上實現了多路徑並行傳輸,在連線建立階段,建立多條路徑,然後使用多條路徑同時傳輸資料
  •  網路層:
    • IP:Internet協議。通過路由選擇將下一條IP封裝後交給介面層。IP資料包是無連線服務
    • ICMP:Internet控制報文協議。是網路層的補充。用於在P主機、路由器之間傳遞控制訊息,檢測網路通不通、主機是否可達、路由是否可用等網路本身的訊息;cmd視窗ping地址就是用的這個協議
    • ARP:地址解析協議。通過目標裝置的IP地址,查詢目標裝置的MAC地址,以保證通訊的順利進行;常見於交換機路由器
    • RARP:反向地址解析協議

 

2.2.HTTP協議詳解

2.2.1.HTTP

HTTP協議,又稱之為超文字傳輸協議,是網際網路上應用最為廣泛的一種網路協議,它是基於TCP的應用層協議;

是客戶端和服務端進行通訊的一種規則,它的模式非常簡單,就是客戶端發起請求,服務端響應請求。

2.2.2.版本分佈

  • HTTP最早於1991年釋出,是0.9版,不過目前該版本已不再用
  • HTTP/1.0,於1996年5月釋出,引入了多種功能,至今仍在使用當中
  • HTTP/1.1,於1997年1月釋出,持久連線被預設採用,是目前最流行的版本
  • HTTP/2,於2015年5月釋出,引入了伺服器推送等多種功能,是目前最新的版本

2.2.3.HTTP請求

  • 請求行:包含請求方法、請求地址和HTTP協議版本
  • 訊息報頭:包含一系列的鍵值對
  • 請求正文(可選):注意和訊息報頭之間有一個空行

2.2.4.HTTP請求方法

  • GET:從伺服器獲取指定(請求地址)的資源的資訊,它通常只用於讀取資料,就像資料庫查詢一樣,不會對資源進行修改
  • POST:向指定資源提交資料(比如提交表單,上傳檔案),請求伺服器進行處理。資料被包含在請求正文中,這個請求可能會建立新的資源或更新現有的資源
  • PUT:通過指定資源的唯一標識(在伺服器上的具體存放位置),請求伺服器建立或更新資源
  • DELETE:請求伺服器刪除指定資源
  • HEAD:與GET方法類似,從伺服器獲取資源資訊,和GET方法不同的是,HEAD不含有呈現資料,僅僅是HTTP頭資訊。HEAD的好處在於,使用這個方法可以在不必傳輸全部內容的情況下,就可以獲得資源的元資訊(或後設資料)
  • OPTIONS:該方法可使伺服器傳回資源所支援的所有HTTP請求方法;簡單理解就是檢視伺服器支援哪些HTTP請求方法

2.2.5.HTTP響應

  • 狀態行:包含HTTP協議版本、狀態碼和狀態描述,以空格分隔
  • 響應頭:即訊息報頭,包含一系列的鍵值對
  • 響應正文:返回內容,注意和響應頭之間有一個空行

 

2.2.6.HTTP響應狀態碼

  • 1XX 訊息:請求已被服務接收,繼續處理
  • 2XX 成功:請求已成功被伺服器接收、理解、並接受
    • 200:OK
    • 201:Created 已建立
    • 202:Accepted 接收
    • 203:Non-Authoritative Information 非認證資訊
    • 204:No Content 無內容
  • 3XX 重定向:需要後續操作才能完成這一請求
    • 301:Moved Permanently 請求永久重定向
    • 302:Moved Temorarily 請求臨時重定向
    • 304:Not Modified 檔案未修改,可以直接使用快取的檔案
    • 305:Use Proxy 使用代理
  • 4XX 請求錯誤:請求含有此法錯誤或者無法被執行
    • 400:Bad Request 由於客戶端請求有語法錯誤,不能被伺服器所理解
    • 401:Unauthorized 請求未經授權。這個狀態程式碼必須和WWW-Authenticate報頭域一起使用
    • 403:Forbidden 伺服器收到請求,但是拒絕提供服務。伺服器通常會在響應正文中給出不提供服務的原因
    • 404:Not Found 請求的資源不存在,例如,輸入錯誤的URL
  • 5XX 伺服器錯誤:伺服器在處理某個正確請求時發生錯誤
    • 500:Internal Server Error 伺服器發生不可預期的錯誤,導致無法完成客戶端的請求
    • 503:Service Unavailable 伺服器當前不能夠處理客戶端的請求,在一段時間之後,伺服器肯能會恢復正常
    • 504:Gateway Time-out 閘道器超時

 

2.3.解析HTTP資料流的傳輸過程

 

以一個經典面試題作為縮影進行講解:

請簡述:從客戶端開啟瀏覽器到伺服器返回網頁,中間的過程

 

2.3.1.巨集觀解析

1)在一個客戶端上,開啟瀏覽器,在瀏覽器的位址列中,輸入www.baidu.com,訪問百度

2)在你敲入網址並按下回車之後,將會發生以下的事情:瀏覽器先嚐試從Host檔案中獲取http://www.baidu.com/對應的IP地址,如果能獲取到則直接使用hosts檔案的解析結果;host檔案在本地的C:\Windows\System32\drivers\etc目錄下

3)如果Host檔案中找不到,就會使用DNS協議來獲取IP。在DNS協議中,PC會向你本地DNS求助,請求DNS伺服器之後,得到百度的IP

4)接下來瀏覽器會請求獲得的Ip地址對應的Web伺服器,Web伺服器接收到客戶的請求並響應處理,將客戶請求的內容返回給客戶端瀏覽器

5)如果伺服器正常則給你回個“OK”,狀態碼為200並將你要的資料傳給你。你收到伺服器的回覆,是HTML形式的文字。瀏覽器必須能夠理解文字的內容,並快速的渲染到螢幕上,渲染出來後,你就能看到百度的首頁了

 

2.3.2.微觀解析

1)域名解析:同巨集觀解析,通過本地host檔案查詢;找不到,PC請求本地DNS幫忙;最後得到域名的IP

2)建立連線:

TCP三次握手:雙向連線確認過程

  • step-1 監聽:首先client客戶端和server服務端都處於LISTEN監聽狀態
  • step-2 第一次握手(客戶端)
    • 客戶端告訴服務端我要訪問你,完成第一次握手;
    • 詳解為:客戶端會傳送一個TCP的SYN,並且標誌位為1的這樣一個資料包;同時指明客戶端要連線伺服器的埠;傳送完畢後,客戶端進入SYN_SYNSEND的狀態;並完成第一次握手
  • step-3 第二次握手(服務端)
    • 服務端告訴客戶端我收到了你的SYN資料包,你的內容為SYN=1,並且返回一個ACK=1的資料包,和客戶端的SYN=1一併打包發給客戶端;
    • 同時服務端由LISTEN狀態變成SYN_RCVD狀態;完成第二次握手
  • step-4 客戶端傳送ACK給服務端
    • 客戶端再次訪問服務端,併傳送ACK=1確認資料包,跟服務端確認是否一致
    • 傳送完畢後客戶端進入ESTABLISHED狀態
  • step-5 第三次握手(服務端):
    • 服務端收到客戶端發過來的ACK=1資料包,確認無誤後,同樣進入ESTABLISHED狀態
    • 完成第三次握手

3)傳送HTTP請求:同巨集觀解析,客戶端傳送get或post請求;伺服器正常給你返回200,OK,以及返回你要的html文字;客戶端對服務端給的heml文字進行解析、渲染、展示

4)斷開連線:

TCP四次揮手:雙向斷開確認

  • step-1 第一次揮手(客戶端)
    • 客戶端告訴服務端請求我已經傳送完畢了,我想要跟你斷開連線了,沒有資料可以傳送了,但是呢服務端你還能向我傳送資料,我還能接收資料;
    • 詳解為:客戶端會傳送一個TCP的FIN,並且標誌位為1的這樣一個資料包;告訴服務端我已經沒有資料可以傳送了,但是我還能接收資料;傳送完畢後,客戶端進入FIN_WAIT_1的狀態;並完成第一次揮手
  • step-2 第二次揮手(服務端)
    • 服務端確認了客戶端的FIN資料包,並回一個ACK=1的資料包,表明我接收到了客戶端關閉連線的請求,但是我這邊還沒有準備好關閉整個連線;
    • 同時服務端由進入CLOSE_WAIT狀態;完成第二次握手
  • step-3 客戶端接收ACK等待服務端關閉連線
    • 客戶端接收到服務端發過來的ACK=1資料包,客戶端狀態變更為FIN_WAIT_2狀態;並等待服務端關閉連線
  • step-4 第三次揮手(服務端)
    • 服務端向客戶端傳送一個FIN=1的資料包,表明我可以關閉連線了,響應資料已經都發完了。
    • 服務端狀態變更為LAST_ACK;等待客戶端傳送ACK確認包
  • step-5 第四次揮手(客戶端)
    • 客戶端收到服務端可以關閉的FIN資料包後,傳送ACK=1包給服務端;告訴服務端,我這邊沒有問題,你關閉連線吧
    • 客戶端狀態變更為TIME_WAIT
  • step-6 服務端關閉連線
    • 服務端接收到客戶端傳送的ACK=1確認包後,關閉連線;服務端狀態變更為CLOSED

 

相關文章