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