主頁 > 軟體設計 > 科普:淘寶網的反爬蟲變遷史

科普:淘寶網的反爬蟲變遷史

2021-07-25 08:08:44 軟體設計

1、什么是網路爬蟲?

111.jpg
其實 “網路爬蟲”這個概念非常簡單,首先回想一下人類是怎么上網的?第一步是打開瀏覽器,輸入網址,點擊各種鏈接,獲取各種資訊,然后通過一個鏈接又跳轉到另一個鏈接?本質上來說網路爬蟲跟人類上網的流程是一回事,不同的只是主體從人變成了計算機程式,爬蟲就是這樣一種程式,它通過訪問各種網站的鏈接,讀取頁面的資訊,然后又順著鏈接跳轉到別的地方,繼續獲取資訊,


2、網路爬蟲有什么用?

222.jpg

網路爬蟲最早是運用在搜索引擎上的,例如百度谷歌,當我們向搜索引擎輸入一個關鍵字后,引擎會反饋會一大堆相關的結果給我們,那么這些結果是怎么來的?這就是爬蟲的功勞,搜索引擎通過釋放規模龐大的爬蟲程式,目的就是要盡可能地將整個網路的各種資訊索取回來拓展他們的資料庫內容儲備,

要知道在沒有爬蟲之前,早期的搜索引擎例如Yahoo之類,是通過所謂 “收錄” 方式擴充其資料庫內容的,即作為網站首先要向Yahoo發出申請,將網站的主題濃縮成幾個關鍵字,只有當Yahoo收錄了你這條記錄后,才會將你的網站與這個關鍵字掛上號,當用戶搜索這個關鍵字的時候,你的網站才能呈現給搜索者,

想想看這種模式跟爬蟲的區別?一個是被動接受,另一個是主動出擊,效率當然不可同日而語,

Google的崛起,與他早年開發的高效率爬蟲程式有直接關系,

除了像搜索引擎公司這種大規模的爬蟲,隨著大資料的興起,在做資料挖掘的時候也需要用到爬蟲,否則所謂大資料分析就是巧婦難為無米之炊,


3、爬與反爬

333.jpg

作為網站運營方而言,他們并不排斥搜索引擎的爬蟲到訪,因為這可以提高網站被訪問的權重,但對于那些僅僅出于資料采集的爬蟲,就不是那么受歡迎了,因為爬蟲程式可以通過并發技術,在短時間內組建一支規模龐大的訪問大軍,短時間內就可以榨干網站的資訊,加重服務器負擔的同時又不會給網站帶來明顯的好處(畢竟爬蟲可不是潛在客戶),對于網站運營方來說這是一種資源空耗,于是,就有了反爬蟲,


4、 爬蟲的實作方式

  • 第一種是通過直接發送http request方式,這種方式跟瀏覽器無關,程式只需仿造一個http資料包發送到目標服務器,然后就能接收從服務器回傳的HTML網頁代碼,最后通過拆解HTML源代碼的方式獲取其中有用的內容,我們姑且稱這種方式為直連方式吧,

    因為沒有瀏覽器的介入,資料是直來直往的,無需渲染或腳本決議,所以這種方法效率很高,
    缺點是反爬能力差,比較難以繞開驗證碼這道門檻,

  • 第二種方式是模擬人類上網的行為來實作,有這樣一種瀏覽器,它接受代碼的控制,比如說你向它發送“get taobao.com”指令,它就會打開淘寶網站,其實說白了,這種方式像極了用 “按鍵精靈” 來模擬上網,我們姑且把它稱為按鍵精靈模式吧,

    因為資料的發送和接收,都需要瀏覽器介入,所以這種方法效率不行,
    優點是反爬能力很強,網站比較難判斷出訪問者到底是真人還是程式,

  • 第三種方式無論從原理還是實作來說都不能稱之為“爬蟲”,但它確實也能起到爬蟲的作用,姑且把這種方式也算進來吧,一些大網站因為業務需要,又或者覺得與其讓爬蟲大軍消耗服務器資源,干脆直接把內容開放出來得了,這就是所謂的第三方API,像阿里開放平臺或者一些能提供天氣資訊的網站就是如此,

    通過這種方式交換的資料很純粹,因為沒有冗余的HTML代碼,因此效率極高,另外還不需要擔心反爬這個問題,

    缺點顯而易見,并不是每個網站都提供API,此外,即使提供的,很多也需要付費,


5、淘寶網的反爬變遷

淘寶網早期截圖

淘寶網作為一個在線電商的寡頭,他家的資料非常吸引人,大到某類商品的整體走勢,小到一個訂單的具體內容,都是爬蟲的目標,相應的,淘寶網的反爬手段也是逐年在進化的,

注意:本文所討論的反爬,主要是針對那種需要登錄才能進行操作的爬蟲,對于那些僅僅是為了爬取公開內容而不需要登錄的爬蟲,不在討論范圍,

  • 上古蠻荒時期,我不確定他們有沒有專門的反爬部門,但在那時候可以通過定制一個包含了賬戶和密碼的http資料包,然后硬塞給服務器,就能成功登錄,非常簡單粗暴,

  • 大概到了2010年代,隨著驗證碼和滑塊的出現,這種野蠻的方法就失靈了,因為在我們仿造的http資料包中,光有賬戶密碼還不行,必須知道驗證碼的內容,或者用滑鼠滑一下滑塊到指定位置,這二者目的是一樣的:通過一個即時生成的附加內容(驗證碼或滑塊),然后將這個附加內容以一個引數方式包裹進http資料包再發送到服務器端,服務器才認為這個請求是有效的,要命的是,通過直接發送http資料包的直連方式,由于壓根就沒有瀏覽器的支持,根本連驗證碼長什么樣都不知道(更勿論破解了),同理也沒辦法對滑塊進行操作,可以說驗證碼的誕生,宣告了這種直連型爬蟲的暫時失效,

  • 為什么說是“暫時”失效呢,因為后來直連型爬蟲又找到一種新的方法,那就是“半自動化”登錄,即第一次登錄的時候,由人類完成,正常輸入賬號密碼,包括驗證碼滑塊之類,登錄成功后,記錄下當前Cookies,然后將這些已經登錄成功的Cookies包裹進一個新建的http資料包里再將這個資料包發送給服務器,因為在截取這個Cookies的時候,是驗證碼已經通過了之后的,這樣一來,服務器便只能認為此后的所有請求都是合法請求了,

  • 這種方法湊效了挺長一段時間,但后來也失效了,或者說通過仿造http資料包進行登錄操作這種方式也給判了個死刑,大概在2017還是2018年前后,阿里搞了一個名叫 “霸下-七層流量清洗” 的系統,從那時候起淘寶網在它的Cookies里增加了幾個隨時在變化的欄位,每一次請求這些欄位都會發生改變,換句話說現在的淘寶網Cookies是一個“動態”Cookies,企圖用一個靜態的Cookies去模擬登錄淘寶,哪怕這個Cookies是合理合法的也不行,因為這個“合法”Cookies只代表了過去某個時間點的合法Cookies,而非當下,

    那么淘寶網是如何實作這個動態Cookies的呢,以下內容純屬推測:

    也許是根據滑鼠的軌跡,根據點擊的X,Y坐標等等,將這些客觀資料作為初始變數,然后再通過一個演算法將這些變數整合為一個token,最后提交到服務器,這里面最核心的就是這個token的演算法,這應該是淘寶網的高度機密,外人是無從得知的,也就意味著你沒辦法自行換算出一個能被淘寶服務器所認可的合法token來,再者,淘寶這套演算法的輸入變數到底是不是滑鼠軌跡等等,都是瞎猜的,破解更是無從談起,

  • 那么路是不是就給堵死了呢,答案當然是否定的,現在需要祭出我們的 “按鍵精靈” 了,通過腳本對一個真實瀏覽器進行控制,讓他模擬人的上網行為,這種爬蟲對服務器而言比較難以對付,首先,它可以模擬隨機的按鍵延時、滑鼠軌跡等等,服務器很難區分哪些是人類做出的動作,哪些又是腳本的,即使我們將技術細節放一邊,最要命的是對于服務器而言,這是一個兩難的選擇:

    • 寬松的規則,縱容了爬蟲;
    • 嚴苛的規則,又可能對真實的人類客戶造成誤傷,降低用戶體驗,

目前看來,淘寶網對這種模擬人類上網行為的“按鍵精靈”式爬蟲確實也沒有什么革命性的方案,或者說沒有從技術上實作一種徹底根治的手段,而只能在規則的嚴苛程度上做出或松或緊的權衡,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/289905.html

標籤:其他

上一篇:?? 簡單聊下如何養成「 演算法思維 」??(建議收藏)

下一篇:提了 3 年,Go1.17 終于增強構建約束!

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more