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七層參考模型
- 物理層:可以理解為我們的網線,進行位元流的傳輸
- 資料鏈路層:可以理解為我們電腦的網路卡,網路卡的驅動可以提供介質訪問、鏈路管理等
- 網路層:網路卡可以設定ip地址,進行網路定址和路由選擇
- 傳輸層:可以想象成電腦裡面的應用,建立主機端到端連線
- 會話層:建立、維護和管理會話
- 表示層:處理資料格式、資料加密等
- 應用層:提供應用程式間通訊
示例:以小明和小紅利用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